Docker存储
前言
上一篇文章中简单总结了一下docke的基础使用方法,这次我来总结一下有关docker存储方面的相关知识。本文同样建立在CloudMan的系列教程之上,有兴趣的可以直接移步。
有些人可能觉得这个很简单,存储就是硬盘嘛,docker容器既然也是操作系统,那就直接存在他的容器的文件系统里就好了。看似没错,但问题在于docker的容器是无状态的,当容器重启的时候里面的数据会全部清除,如果是一些静态的数据,我们可以在build镜像的时候直接写死,但是对于数据库、日志等数据实时变化的镜像我们就不能通过这种方式来保存数据。所以本文来谈谈不同的存储方式。
一、Docker的两种存储资源
根据上述分析可以知道,Docker为容器起码提供了两种存放数据的资源,确实如此,分别是:
- 由storage driver管理的镜像层和容器层,即镜像内文件系统。
- Data Volume,宿主机文件系统。
1.1 storage driver
对于某些容器,直接将数据放在由storage driver维护的层中是很好的选择,比如那些无状态的应用。无状态意味着容器没有需要持久化的数据,随时可以从镜像直接创建。比如busybox,它是一个工具箱,我们启动busybox是为了执行诸如wget,ping之类的命令,不需要保存数据供以后使用,使用完直接退出,容器删除时存放在容器层中的工作数据也一起被删除,下次再启动新容器时又是一个干净如初的内部文件系统。
通过上一篇文章可以知道使用Dockerfile build镜像的时候,可以通过COPY或ADD命令来向镜像中添加数据。如下:
COPY将文件从宿主机复制到镜像。
COPY支持两种形式:
COPY src destCOPY ["src", "dest"]
注意:src只能指定宿主机中的文件或目录。
ADD与COPY类似,从宿主机复制文件到镜像。不同的是,如果src是归档文件(tar,zip,tgz,xz等),文件会被自动解压到dest。
1.2 data vloume
有些容器需要保存状态,如数据库容器等,这些就需要使用Data Volume,即将内部数据映射到外部宿主机的文件系统上。
Data Volume 有以下特点:
- Data Volume是目录或文件,而非没有格式化的磁盘(块设备)。
- 容器可以读写volume中的数据。
- volume数据可以被永久的保存,即使使用它的容器已经销毁。
1.2.1 bind mount
bind mount的意思是挂载宿主机中固定目录,启动容器的时候执行:
docker run -d -p 80:80 -v src:dst httpd
-v的格式为:。在此镜像中为/usr/local/apache2/htdocs,此目录是httpd镜像中apache server存放静态文件的地方。由于/usr/local/apache2/htdocs已经存在,但是其中数据会被隐藏起来,取而代之的是宿主机中的数据,这与 linux mount 命令的行为是一致的,即将宿主机中的目录挂载到镜像中的目录。
1.2.2 docker managed volume
docker managed volume的意思是由docker自动映射目录。启动容器的时候执行:
docker run -d -p 80:80 -v dst httpd
此处-v的格式为,即只有镜像中路径。
它与bind mount的区别在于,managed volume不需要指定宿主机上的mount目录,docker会自动在宿主机/var/lib/docker/volumes下为其生成一个随机目录。
docker managed volume的创建过程:
- 容器启动时,简单的告诉docker:我需要一个volume存放数据,帮我mount到目录/abc(镜像内目录)。
- docker在宿主机/var/lib/docker/volumes中生成一个随机目录作为mount源。
- 如果/abc已经存在,则将数据复制到 mount源。
- 将volume(宿主机)mount到/abc(镜像)。
1.2.3 两种方式对比
| 类型 | bind mount | docker managed volume |
|---|---|---|
| volume 位置 | 可任意指定 | /var/lib/docker/volumes/... |
| 对已有mount point 影响 | 隐藏并替换为 volume | 原有数据复制到 volume |
| 是否支持单个文件 | 支持 | 不支持,只能是目录 |
| 权限控制 | 可设置为只读,默认为读写权限 | 无控制,均为读写权限 |
| 移植性 | 移植性弱,与host path绑定 | 移植性强,无需指定host目录 |
二、容器与宿主机之间以及容器之间数据共享
由于docker的设计目的就是为了互相不干扰,相互独立,但是有时候我们又不得不在容器与宿主机之间或者容器之间共享数据,以实现某些功能。
2.1 容器与host共享数据
使用docker cp命令可以在容器和host之间拷贝数据,与scp相似。
将镜像的某一目录挂载到host path也是一种共享方式。
2.2 容器之间共享数据
2.2.1 共享host目录
只需要将同一个host目录挂载到不同的容器即可。
2.2.2 用volume container共享数据
volume container是专门为其他容器提供volume的容器。它提供的卷的类型可以是bind mount,也可以是docker managed volume。通过下面的命令创建一个volume container:
docker create --name vc_data -v ~/htdocs:/usr/local/apache2/htdocs -v /other/useful/tools busybox
此处只需要create即可,不需要run,因为其他容器只需获取到他的这个挂载点,并不需要他的数据。
其他容器启动的时候可以通过--volumes-from参数使用vc_data这个volume container容器的挂载点,命令如下:
docker run --name web1 -d -p 80 --volumes-from vc_data httpd
docker run --name web2 -d -p 80 --volumes-from vc_data httpd
这样web1、web2就有了相同的挂载点。
volume container 的特点:
- 与 bind mount 相比,不必为每一个容器指定host path,所有path都在 volume container中定义好了,容器只需与volume container关联。实现了容器与host的解耦。
- 使用volume container的容器其mount point是一致的,有利于配置的规范和标准化,但也带来一定的局限,使用时需要综合考虑。
2.2.3 data-packed volume container
这种场景是将数据先放到镜像中,build此镜像,然后create此镜像,其他容器的--volumes-from设置为此容器。这样run出来的容器都会共享同一份数据。
我们用下面的 Dockfile 构建镜像:
FROM busybox
ADD htdocs /usr/local/apache2/htdocs
VOLUME /usr/local/apache2/htdocs
ADD命令将静态文件添加到容器目录/usr/local/apache2/htdocs。
VOLUME 的作用与-v等效,用来创建docker managed volume,mount point 为usr/local/apache2/htdocs,因为这个目录就是ADD添加的目录,所以会将已有数据拷贝到volume中。用下面的命令build词镜像:
docker build -t datapacked .
创建此镜像的容器:
docker create --name vc_data datapacked
此处不再需要-v,因为datapacked的镜像VLOUME已经实现了。
启动其他容器:
docker run --name web2 -d -p 80 --volumes-from vc_data httpd
这样也可实现容器之间共享数据,而且此数据保存在datapacked中。这种方式适合只使用静态文件共享场景。并且datapacked中包含了共享数据,可移植性非常强。
三、volume管理
docker volume ls查看宿主机上所有vloume
docker inspect <container>查看某一容器具体的信息
dcoker vloume rm <iamgeid>删除某一个volume
如果想批量删除孤儿 volume,可以执行:
docker volume rm $(docker volume ls -q)
四、总结
本文简单总结了docker存储方面的相关知识和用法,包含两种数据存储方式、容器与host之间、容器之间共享数据以及volume管理等知识。下一篇总结以下docker网络的相关知识和用法。
Docker存储的更多相关文章
- 理解Docker(8):Docker 存储之卷(Volume)
(1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 ...
- 理解Docker(7):Docker 存储 - AUFS
(1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 ...
- Docker存储驱动之OverlayFS简介
简介 OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性: 1) 更简单地设计: 2) 从3.18开始,就进入了Linux内核主线: 3) 可能更快一些. ...
- Docker存储驱动之Device Mapper简介
Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别, ...
- Docker存储驱动之总览
简介 本文会介绍Docker存储驱动的特性,别列出现在已经支持的存储驱动,最后,会介绍如果选型适合你的存储驱动. 可插拔的存储驱动架构 Docker的存储驱动架构是可插拔的,可以让你很方便的将适合你环 ...
- Docker系列05—Docker 存储卷详解
本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...
- 6、Docker存储卷
Why Data Volumes? 来自马哥教育 Data volumes Volume types 绑定挂载卷:在宿主机和容器上各指明绑定路径才能进行绑定. docker管理卷:在容器内指定挂载 ...
- Docker存储卷(V18.X)
简介 介绍 Docker的存储卷称之为volume,本质上容器上的一个或者多个目录,而这些目录绕过了联合文件系统,与宿主机中的目录或者其他容器目录进行了绑定关系,这种绑定关系可以看作Linux的mou ...
- Docker存储驱动Device Mapper,Overlay,AUFS
Docker存储驱动之Device Mapper简介 - BookShu - 博客园https://www.cnblogs.com/styshoo/p/6528762.html Docker存储驱动之 ...
随机推荐
- Spring事务管理—aop:pointcut expression解析
先来看看这个spring的配置文件的配置: <!-- 事务管理器 --> <bean id="transactionManager" class="o ...
- rest api get 查询接口 多个参数
查询时,使用get,传递参数至服务器. angular js中,$http可以直接传递object,在get中,params:data 在服务端, query(x=x,y=y)可写成 query(** ...
- 马踏棋盘算法递归+回溯法实现 C语言
r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...
- TPYBoard自制微信远程智能温湿度计
智能时代一夜间什么都能远程了.创业者想着如何做智能产品,如何做远程控制.DIY爱好者也想着如何自制各种奇妙的工具.这里和大家一起学习制作一款廉价的智能温湿度计.说它廉价是因为共计花费不过40元,说它智 ...
- 【LeetCode】235. Lowest Common Ancestor of a Binary Search Tree
题目: Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in th ...
- docker 17 安装
docker17 安装 新增一键安装命令: curl -sSL https://get.docker.com/ | sh 以下为手动安装过程 翻译自 Get Docker for Ubuntu Doc ...
- RabbitMQ插件安装
RabbitMQ的有些插件没有集成在初始的安装中,它们需要额外安装,这些文件的后缀为.ez,安装时需要将.ez文件拷贝到安装的插件目录.以下是不同系统中默认安装的插件目录路径: 插件目录 Linux ...
- weblogic漏洞修复:CVE-2014-4210,UDDI Explorer对外开放
漏洞描述:http://blog.gdssecurity.com/labs/2015/3/30/weblogic-ssrf-and-xss-cve-2014-4241-cve-2014-4210-cv ...
- SQL执行过程中的性能负载点
一.SQL执行过程 1.用户连接数据库,执行SQL语句: 2.先在内存进行内存读,找到了所需数据就直接交给用户工作空间: 3.内存读失败,也就说在内存中没找到支持SQL所需数据,就进行物理读,也就是到 ...
- dfs.datanode.max.transfer.threads
An HDFS DataNode has an upper bound on the number of files that it will serve at any one time: <p ...