引言:容器中的文件系统是由分层文件系统提供的,包含只读层(镜像)和可读可写层(容器运行时层),这些都是被封装在容器内部的。如果用户需要将主机上的文件系统共享给容器使用,那怎么办呢?
本文选自《Docker容器实战:原理、架构与应用》,将向您介绍使用数据卷与数据容器两种方式进行共享。
数据卷
数据卷提供了一种主机和容器共享数据的方式,有些时候需要用它来做持久化和数据共享。当做持久化时,通常数据卷都会比较大,可以将其放在单独的磁盘、卷或者阵列上,这个时候容器只是一个执行环境。当做数据共享时,可以用于开发和测试分布式系统,如需要用到共享盘、处理fencing 等。数据卷主要通过-v 参数来指定。
1 创建一个数据卷
若需要一个外部卷来存放持久化数据,而不想把数据包含在容器内部。例如:
root@ghostcloud:~# docker run -d -P --name datatest -v /webapp ubuntu
13ffee3a3f50d07fd5a737aaf2efc60ceec28e2b04c5d534cfd84d8b70019c11
这条命令创建了一个名为datatest 的容器,同时为其创建了一个/webapp 的数据卷,这是数据卷在其内部的位置。那么它在主机上的什么位置呢?
root@ghostcloud:~# docker inspect 13ff
...
"Mounts": [
{
"Name":
"ec1c427a6a76be4918d6e8bac3247e2836dc8f424c9e06466fcf1baab-6e7ee79","Source":
"/var/lib/docker/volumes/ec1c427a6a76be4918d6e8bac3247e2836dc8f424c9e06466fcf1baab6e7ee79/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
它的位置在/var/lib/docker 下。
2 映射一个外部卷
如果以-v src:des 的方式指定,那么容器则会直接将宿主机的目录挂载到容器内部:
root@ghostcloud:~# docker run -it -v /root:/hostroot ubuntu
root@86ea1246ae5d:/# ls /hostroot
Dockerfile composetest gcagent myimage uninstall_agent.sh
将宿主机/root 目录映射到了容器/hostroot 目录中。此时,用户可以在容器中对宿主机/root 目录中的文件进行修改,但这种操作是非常危险的。在做数据卷映射时,一定要特别小心,任何时候都不要将宿主机的根目录映射到容器内部。
使用数据型容器
由于容器本身就可以包含文件系统,那么可不可以把容器的卷分享给另一个容器用呢?答案是可以的。具体的步骤如下。
(1)创建一个包含外部卷的容器,注意是create,并不是run。run 是create 后再start,本例只需要容器的文件系统,所以只需要create.
root@ghostcloud:~# docker create -v /dbdata --name dbstore ubuntu
d95cdc1139ed1011fe51843f524c377cd7497629e9a4434508f422f15b61a03c
(2)在另一个容器中通过–volumes-from 来映射。
root@ghostcloud:~# docker run --rm -it --volumes-from dbstore ubuntu
root@4b61bb181471:/# df -h
Filesystem Size Used Avail Use% Mounted on
None 8.8G 4.2G 4.2G 50% /
tmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/disk/by-uuid/27d8b1c5-4bfc-4499-94d6-6e5f5c42e923 8.8G 4.2G 4.2G 50%/dbdata
备份、还原和迁移数据卷
下面是通过容器型数据卷和数据卷联合使用做备份的例子。
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf
/backup/backup.tar /dbdata
剖析:
- volumes-from 表示使用dbstore 这个容器的数据卷;
- v $(pwd):/backup 表示将当前路径映射到容器的/backup 中,用于后续备份;
- ubuntu tar cvf /backup/backup.tar /dbdata 表示将/dbdata 的内容备份到当前目录。
上面这个例子就是典型的将容器作为一个工具来使用的例子,如果更进一步,用户可以自己写一个Dockerfile,然后产生一个Image,将参数都指定好,以后只需启动容器就可备份,备份完成后又自动退出。
那么还原呢?
$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd/dbdata && tar xvf /backup/backup.tar --strip 1"
类似地,通过tar 来解压即可。
容器和代码进行关联
数据卷有下面几个特点:
- 数据卷在容器创建时进行初始化;
- 数据卷既可以共享,也可以在容器之间重用;
- 对于数据卷的读写是直接下发的;
- Commit 命令不会将改动保存到镜像中;
即使容器被删除了,数据卷仍然存在,因此这一块需要特别注意,避免产生垃圾数据卷。
相关推荐
23 容器数据类型特性总结.mp4
压力容器数据表.doc
容器数据卷 –》实现容器数据的持久化、实现容器间继承与数据的共享容器卷的添加查看是否挂载成功创建文件并验证采用 dockersfile 来创建 实现 新的容器继
带你了解什么是Docker容器数据卷
Linux运维-运维课程MP4频-05容器-39overlay2存储容器数据方法验证.mp4
Python collections——容器数据类型 https://xercis.blog.csdn.net/article/details/106762422
IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root <value>root ...
为了更直观了解数据卷挂载的操作,做个实验一一验证数据卷挂载的各种情况。 情况一、本地不存在文件挂载到容器存在文件 首先是当本地不存在该文件,而容器内存在该文件的情况,尝试把不存在的文件挂载到存在该文件...
瓶子识别检测数据集(课程作业、设计、比赛所用)【实际项目应用】:常见物品识别检测、无人售货机物品识别等【数据集说明】:瓶子识别检测数据集,一共6666张图片,图像拍摄场景丰富多样,瓶子类型众多,含有玻璃瓶...
使用可信计算技术增强云容器数据安全,和机密容器有些关系。 适用人群: 适合对可信计算感兴趣的小伙伴。 使用场景: 云安全内核安全。 目标: 通过对各种安全技术和用例的研究,增加最可信计算甚至可信计算3.0的...
41 overlay2存储容器数据方法验证:r 42容器公有仓库注册及登录mp4 43公有仓库容器镜像上传及下载mp4 44 ocker中国镜像加速器介绍及应用mp4 45阿里云镜像加速器个绍及应用mp4 46创建本地非安全镜像仓库mp4 47创建...
主要介绍了详解复制备份docker容器数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Python 内置的数据类型如列表、元组、字典和集合等可以容纳多项数据,称他们为容器类型的数据。
——学习参考资料:仅用于个人学习使用! 本代码仅作学习交流,切勿用于商业用途,否则后果自负。若涉及侵权,请联系,会尽快处理! 未进行详尽测试,请自行调试!
fortran容器:此存储库包含一些Fortran的容器数据结构类型
Docker 数据卷,数据卷容器详细介绍 引子 有些时候,我们的服务运行时必不可少的会产生一些日志,或是我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及容器的数据管理操作。 容器中管理...
主要介绍了Docker容器数据卷原理及使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
众所周知卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享。通过卷,我们可以可以使修改数据直接生效,而不必重新构建...