七、容器数据卷
作者:互联网
7.1 容器数据卷是什么
先来看看Docker的理念:
将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的,容器之间希望有可能共享数据。Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器, 但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
特点:
数据卷可在容器之间共享或重用数据
卷中的更改可以直接生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
7.2 能做什么
容器的持久化
容器间继承+共享数据
6.3 数据卷(用命令增加)
主要命令:
docker run -it -v /宿主机目录:/容器目录 容器id/容器名称 (不带权限,可读可写 v:Volume 卷) docker run -it -v /宿主机目录:/容器目录:ro 容器id/容器名称 (带权限,可读不可写 ro:read only)
1、打开多个终端:container终端、宿主机终端1、宿主机终端2
生成数据卷之前,先分别查看宿主机和容器根目录下的文件
容器终端
[root@boxiaoyuan ~]# docker run -it centos /bin/bash [root@57a42e3ea3c6 /]# ls anaconda-post.log dev home lib64 mnt proc run srv tmp var bin etc lib media opt root sbin sys usr [root@57a42e3ea3c6 /]# exit exit
宿主机终端1
[root@boxiaoyuan ~]# cd ../ [root@boxiaoyuan /]# ls bin cgroup etc lib lost+found misc net proc sbin srv tmp var boot dev home lib64 media mnt opt root selinux sys usr
容器终端
执行命令docker run -it -v /宿主机目录:/容器目录 容器id/容器名称:
[root@boxiaoyuan ~]# docker run -it -v /myDataVolume:/dataVolumeContainer centos [root@d9d0af0a6d1a /]# ls anaconda-post.log dataVolumeContainer etc lib media opt root sbin sys usr bin dev home lib64 mnt proc run srv
宿主机终端1
[root@boxiaoyuan /]# ls bin cgroup etc lib lost+found misc myDataVolume opt root selinux sys usr boot dev home lib64 media mnt net proc sbin srv tmp var
可以发现宿主机和容器内都增加了一个文件夹
宿主机终端2
[root@boxiaoyuan ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d9d0af0a6d1a centos "/bin/bash" About a minute ago Up About a minute reverent_hopper [root@boxiaoyuan ~]# docker inspect d9d0af0a6d1a [ { "Id": "d9d0af0a6d1aa803211e553290dd7ca06628d692a3a26bc9f1e90a47bd5a8f68", "Created": "2019-07-06T12:19:15.584574153Z", "Path": "/bin/bash", "Args": [],"Volumes": { "/dataVolumeContainer": "/myDataVolume" }, "VolumesRW": { "/dataVolumeContainer": true ## 可以进行读写操作 },"HostConfig": { "Binds": [ "/myDataVolume:/dataVolumeContainer" ## 表示容器内部已和宿主机对应的文件夹绑定 ], } ]
2、实现继承+共享数据
宿主机终端1
[root@boxiaoyuan /]# cd myDataVolume/ [root@boxiaoyuan myDataVolume]# ls [root@boxiaoyuan myDataVolume]# touch host.txt [root@boxiaoyuan myDataVolume]# ls -al 总用量 8 drwxr-xr-x. 2 root root 4096 7月 6 20:31 . dr-xr-xr-x. 27 root root 4096 7月 6 20:19 .. -rw-r--r--. 1 root root 0 7月 6 20:31 host.txt
容器终端
[root@d9d0af0a6d1a /]# cd dataVolumeContainer/ [root@d9d0af0a6d1a dataVolumeContainer]# ls -al total 8 drwxr-xr-x. 2 root root 4096 Jul 6 12:31 . drwxr-xr-x. 17 root root 4096 Jul 6 12:19 .. -rw-r--r--. 1 root root 0 Jul 6 12:31 host.txt
可以看到宿主机在绑定的文件夹里创建文件的同时,容器内部对应的文件夹里也同时创建了文件。
容器终端
[root@d9d0af0a6d1a dataVolumeContainer]# vi host.txt
## 写入container update 666 并保存退出
[root@d9d0af0a6d1a dataVolumeContainer]# touch container.txt [root@d9d0af0a6d1a dataVolumeContainer]# ls -al total 12 drwxr-xr-x. 2 root root 4096 Jul 6 12:32 . drwxr-xr-x. 17 root root 4096 Jul 6 12:19 .. -rw-r--r--. 1 root root 0 Jul 6 12:32 container.txt -rw-r--r--. 1 root root 21 Jul 6 12:32 host.txt
宿主机终端1
[root@boxiaoyuan myDataVolume]# ls -al 总用量 12 drwxr-xr-x. 2 root root 4096 7月 6 20:32 . dr-xr-xr-x. 27 root root 4096 7月 6 20:19 .. -rw-r--r--. 1 root root 0 7月 6 20:32 container.txt -rw-r--r--. 1 root root 21 7月 6 20:32 host.txt [root@boxiaoyuan myDataVolume]# cat host.txt container uodate 666
可以发现无论是哪个端进行增删改文件及内容,均能相互共享。
3、容器停止后,宿主机修改后能否同步数据
容器终端
[root@d9d0af0a6d1a dataVolumeContainer]# exit exit
宿主机终端2
[root@boxiaoyuan ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
宿主机终端1
[root@boxiaoyuan myDataVolume]# touch host01.txt [root@boxiaoyuan myDataVolume]# vim host.txt
## 写入container update 666 并保存退出
[root@boxiaoyuan myDataVolume]# ls -al 总用量 16 drwxr-xr-x. 2 root root 4096 7月 6 20:37 . dr-xr-xr-x. 27 root root 4096 7月 6 20:19 .. -rw-r--r--. 1 root root 0 7月 6 20:32 container.txt -rw-r--r--. 1 root root 16 7月 6 20:37 host01.txt -rw-r--r--. 1 root root 21 7月 6 20:32 host.txt
容器终端
重启上次的容器id
[root@boxiaoyuan ~]# docker start d9d0af0a6d1a d9d0af0a6d1a
宿主机终端2
[root@boxiaoyuan ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d9d0af0a6d1a centos "/bin/bash" 18 minutes ago Up 9 seconds reverent_hopper
容器终端
[root@boxiaoyuan ~]# docker attach d9d0af0a6d1a [root@d9d0af0a6d1a /]# cd dataVolumeContainer/ [root@d9d0af0a6d1a dataVolumeContainer]# ls -al total 16 drwxr-xr-x. 2 root root 4096 Jul 6 12:37 . drwxr-xr-x. 17 root root 4096 Jul 6 12:37 .. -rw-r--r--. 1 root root 0 Jul 6 12:32 container.txt -rw-r--r--. 1 root root 21 Jul 6 12:32 host.txt -rw-r--r--. 1 root root 16 Jul 6 12:37 host01.txt [root@d9d0af0a6d1a dataVolumeContainer]# cat host.txt host update 666
container update 666
没问题,可以同步
4、命令带权限
宿主机终端1
[root@boxiaoyuan myDataVolume]# cd ../ [root@boxiaoyuan /]# rm -rf myDataVolume/ [root@boxiaoyuan /]# ls bin cgroup etc lib lost+found misc net proc sbin srv tmp var boot dev home lib64 media mnt opt root selinux sys usr
容器终端
[root@d9d0af0a6d1a dataVolumeContainer]# ls [root@d9d0af0a6d1a dataVolumeContainer]# cd .. [root@d9d0af0a6d1a /]# ls anaconda-post.log dataVolumeContainer etc lib media opt root sbin sys usr bin dev home lib64 mnt proc run srv tmp var [root@d9d0af0a6d1a /]# exit exit [root@boxiaoyuan ~]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos [root@a1b5204dedfa /]# ls anaconda-post.log dataVolumeContainer etc lib media opt root sbin sys usr bin dev home lib64 mnt proc run srv tmp var [root@a1b5204dedfa /]# cd dataVolumeContainer/ [root@a1b5204dedfa dataVolumeContainer]# ls -al total 8 drwxr-xr-x. 2 root root 4096 Jul 6 12:43 . drwxr-xr-x. 17 root root 4096 Jul 6 12:43 ..
宿主机终端1
[root@boxiaoyuan /]# ls bin cgroup etc lib lost+found misc myDataVolume opt root selinux sys usr boot dev home lib64 media mnt net proc sbin srv [root@boxiaoyuan /]# cd myDataVolume/ [root@boxiaoyuan myDataVolume]# ls -al 总用量 8 drwxr-xr-x. 2 root root 4096 7月 6 20:43 . dr-xr-xr-x. 27 root root 4096 7月 6 20:43 .. [root@boxiaoyuan myDataVolume]# touch host.txt [root@boxiaoyuan myDataVolume]# vim host.txt [root@boxiaoyuan myDataVolume]# cat host.txt host update
容器终端
[root@a1b5204dedfa dataVolumeContainer]# ls -al
total 12
drwxr-xr-x. 2 root root 4096 Jul 6 12:44 .
drwxr-xr-x. 17 root root 4096 Jul 6 12:43 ..
-rw-r--r--. 1 root root 12 Jul 6 12:44 host.txt
[root@a1b5204dedfa dataVolumeContainer]# cat host.txt
host update
重点来了
容器终端
[root@a1b5204dedfa dataVolumeContainer]# touch container.txt touch: cannot touch 'container.txt': Read-only file system
[root@a1b5204dedfadataVolumeContainer]# vi host.txt
"host.txt"
"host.txt" E212: Can't open file for writing ## vi 操作则会提示
说明权限命令没问题,只允许宿主机单向传给容器,容器不能反向传给宿主机。
宿主机终端2
[root@boxiaoyuan ~]# docker inspect a1b5204dedfa [ { "Volumes": { "/dataVolumeContainer": "/myDataVolume" }, "VolumesRW": { "/dataVolumeContainer": false ## 此时RW为false }, "HostConfig": { "Binds": [ "/myDataVolume:/dataVolumeContainer:ro" ## 加上了:ro ] } } ]
7.4 数据卷(DockerFile添加)
DockerFile:对镜像的一种源码级的描述文件。
1、 根目录下新建mydocker文件夹并进入
[root@boxiaoyuan /]# mkdir mydocker [root@boxiaoyuan /]# cd mydocker/
2、可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:
出于可移植和分享的考虑,用-v主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
3、File构建
[root@boxiaoyuan mydocker]# vim Dockerfile [root@boxiaoyuan mydocker]# cat Dockerfile # volume test FROM centos VOLUME ["/dataVolumeContainer1" ,"/dataVolumeContainer2"] CMD echo "finished,==================success1" CMD /bin/bash
4、build后生成镜像
最后有个 . 不要忘记了
[root@boxiaoyuan mydocker]# docker build -f /mydocker/Dockerfile -t boxiaoyuan/centos . Sending build context to Docker daemon 2.048 kB Sending build context to Docker daemon Step 0 : FROM centos ---> ee2526f4865b Step 1 : VOLUME /dataVolumeContainer1 /dataVolumeContainer2 ---> Running in 6452bd865111 ---> 520480f4a267 Removing intermediate container 6452bd865111 Step 2 : CMD echo "finished,=============success1" ---> Running in c804b814aa80 ---> e235e19c4d97 Removing intermediate container c804b814aa80 Step 3 : CMD /bin/bash ---> Running in 4094f63d20ea ---> 9f3d5ff4c0b1 Removing intermediate container 4094f63d20ea Successfully built 9f3d5ff4c0b1
成功生成镜像
[root@boxiaoyuan mydocker]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE boxiaoyuan/centos latest 9f3d5ff4c0b1 About a minute ago 201.8 MB boxiaoyuan/nodocstomcat 1.0 002a5c87a638 About an hour ago 510.4 MB tomcat latest d06128b13608 2 days ago 510.3 MB ubuntu latest d351d647d655 2 weeks ago 64.18 MB ubuntu 14.04 fe62d34455b7 7 weeks ago 188.2 MB centos 6 4f2ed42dccff 3 months ago 193.9 MB centos latest ee2526f4865b 3 months ago 201.8 MB hello-world latest 9f5834b25059 6 months ago 1.84 kB
5、run容器
容器终端
[root@boxiaoyuan ~]# docker run -it boxiaoyuan/centos [root@aaeafaa6e70c /]# ls -al total 72 drwxr-xr-x. 18 root root 4096 Jul 6 13:10 . drwxr-xr-x. 18 root root 4096 Jul 6 13:10 .. -rwxr-xr-x. 1 root root 0 Jul 6 13:10 .dockerenv -rwxr-xr-x. 1 root root 0 Jul 6 13:10 .dockerinit -rw-r--r--. 1 root root 12082 Mar 5 17:36 anaconda-post.log lrwxrwxrwx. 1 root root 7 Mar 5 17:34 bin -> usr/bin drwxr-xr-x. 2 root root 4096 Jul 6 13:10 dataVolumeContainer1 drwxr-xr-x. 2 root root 4096 Jul 6 13:10 dataVolumeContainer2 drwxr-xr-x. 5 root root 380 Jul 6 13:10 dev drwxr-xr-x. 47 root root 4096 Jul 6 13:10 etc drwxr-xr-x. 2 root root 4096 Apr 11 2018 home lrwxrwxrwx. 1 root root 7 Mar 5 17:34 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Mar 5 17:34 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 4096 Apr 11 2018 media drwxr-xr-x. 2 root root 4096 Apr 11 2018 mnt drwxr-xr-x. 2 root root 4096 Apr 11 2018 opt dr-xr-xr-x. 181 root root 0 Jul 6 13:10 proc dr-xr-x---. 2 root root 4096 Mar 5 17:36 root drwxr-xr-x. 11 root root 4096 Mar 5 17:36 run lrwxrwxrwx. 1 root root 8 Mar 5 17:34 sbin -> usr/sbin drwxr-xr-x. 2 root root 4096 Apr 11 2018 srv drwxr-xr-x 13 root root 0 Oct 23 2018 sys drwxrwxrwt. 7 root root 4096 Mar 5 17:36 tmp drwxr-xr-x. 13 root root 4096 Mar 5 17:34 usr drwxr-xr-x. 18 root root 4096 Mar 5 17:34 var [root@aaeafaa6e70c /]# cd dataVolumeContainer1/ [root@aaeafaa6e70c dataVolumeContainer1]# touch container01.txt [root@aaeafaa6e70c dataVolumeContainer1]# ls container01.txt [root@aaeafaa6e70c dataVolumeContainer1]# ls -al total 8 drwxr-xr-x. 2 root root 4096 Jul 6 13:10 . drwxr-xr-x. 18 root root 4096 Jul 6 13:10 .. -rw-r--r--. 1 root root 0 Jul 6 13:10 container01.txt
宿主机终端
可以看到容器内绑定的宿主机对应的文件夹,也就是可以进行相应的数据共享了。
[root@boxiaoyuan mydocker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aaeafaa6e70c boxiaoyuan/centos "/bin/sh -c /bin/bas About a minute ago Up About a minute jovial_galileo [root@boxiaoyuan mydocker]# docker inspect aaeafaa6e70c [ {"Volumes": { "/dataVolumeContainer1": "/var/lib/docker/volumes/2327db8a4ff7da67d3397699f3b0ae7dd40400be7d64dceaabeadfb4994fc8e8/_data", "/dataVolumeContainer2": "/var/lib/docker/volumes/2d551ea2db84b65da55ba1523c81e24bbefafc379857c9c80defee8eb66ae03e/_data" }, "VolumesRW": { "/dataVolumeContainer1": true, "/dataVolumeContainer2": true } } ]
宿主机终端
[root@boxiaoyuan mydocker]# cd /var/lib/docker/volumes/2327db8a4ff7da67d3397699f3b0ae7dd40400be7d64dceaabeadfb4994fc8e8/_data [root@boxiaoyuan _data]# ls -al 总用量 8 drwxr-xr-x. 2 root root 4096 7月 6 21:10 . drwxr-xr-x. 3 root root 4096 7月 6 21:10 .. -rw-r--r--. 1 root root 0 7月 6 21:10 container01.txt
宿主机终端
新建文件host.txt
[root@boxiaoyuan _data]# touch host.txt [root@boxiaoyuan _data]# ls -al 总用量 8 drwxr-xr-x. 2 root root 4096 7月 6 21:16 . drwxr-xr-x. 3 root root 4096 7月 6 21:10 .. -rw-r--r--. 1 root root 0 7月 6 21:10 container01.txt -rw-r--r--. 1 root root 0 7月 6 21:16 host.txt
容器终端
[root@aaeafaa6e70c dataVolumeContainer1]# ls -al total 8 drwxr-xr-x. 2 root root 4096 Jul 6 13:16 . drwxr-xr-x. 18 root root 4096 Jul 6 13:10 .. -rw-r--r--. 1 root root 0 Jul 6 13:10 container01.txt -rw-r--r--. 1 root root 0 Jul 6 13:16 host.txt
如果出现以下错误
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可
如原来的命令: [root@localhost ~]# docker run -it -v /myDataVolume:/dataVolumeContainer centos 修改为: [root@localhost ~]# docker run -it -v /myDataVolume:/dataVolumeContainer --privileged=true centos
7.5 数据卷容器
7.5.1 是什么
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
7.5.2 容器间传递共享(–volumes - from)
docker run -it --name 子容器别名 --volumes-from 父容器别名 需运行的容器id/容器名称
创建父容器
[root@boxiaoyuan ~]# docker run -it --name boxiaoyuan boxiaoyuan/centos [root@d1ab983e15fc /]# ls anaconda-post.log dataVolumeContainer1 dev home lib64 mnt proc run srv tmp var bin dataVolumeContainer2 etc lib media opt root sbin sys usr [root@d1ab983e15fc /]# cd dataVolumeContainer2/ [root@d1ab983e15fc dataVolumeContainer2]# ls -al total 8 drwxr-xr-x. 2 root root 4096 Jul 6 13:21 . drwxr-xr-x. 18 root root 4096 Jul 6 13:21 .. [root@d1ab983e15fc dataVolumeContainer2]# touch boxiaoyuan_add.txt
## ctrl+P ctrl+Q 退出容器 [root@d1ab983e15fc dataVolumeContainer2]# [root@boxiaoyuan ~]# [root@boxiaoyuan ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d1ab983e15fc boxiaoyuan/centos "/bin/sh -c /bin/bas 45 seconds ago Up 44 seconds boxiaoyuan
创建子容器1,并继承父容器
[root@boxiaoyuan ~]# docker run -it --name boxiaoyuan_sub --volumes-from boxiaoyuan boxiaoyuan/centos [root@25501c70bdf8 /]# ls anaconda-post.log dataVolumeContainer1 dev home lib64 mnt proc run srv tmp var bin dataVolumeContainer2 etc lib media opt root sbin sys usr [root@25501c70bdf8 /]# cd dataVolumeContainer2/ [root@25501c70bdf8 dataVolumeContainer2]# ls boxiaoyuan_add.txt
## ctrl+P ctrl+Q 退出容器 [root@25501c70bdf8 dataVolumeContainer2]# touch boxiaoyuan02_add.txt [root@25501c70bdf8 dataVolumeContainer2]# [root@boxiaoyuan ~]#
创建子容器2,并继承父容器
[root@boxiaoyuan ~]# docker run -it --name boxiaoyuan_sub_sub --volumes-from boxiaoyuan boxiaoyuan/centos [root@6f4966308ba0 /]# cd dataVolumeContainer2/ [root@6f4966308ba0 dataVolumeContainer2]# ls boxiaoyuan02_add.txt boxiaoyuan_add.txt
[root@6f4966308ba0 dataVolumeContainer2]# touch boxiaoyuan03_add.txt
## ctrl+P ctrl+Q 退出容器
[root@6f4966308ba0 dataVolumeContainer2]#[root@boxiaoyuan ~]#
查看当前运行的容器
[root@boxiaoyuan ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f4966308ba0 boxiaoyuan/centos "/bin/sh -c /bin/bas 22 seconds ago Up 21 seconds boxiaoyuan_sub_sub 25501c70bdf8 boxiaoyuan/centos "/bin/sh -c /bin/bas 4 minutes ago Up 4 minutes boxiaoyuan_sub d1ab983e15fc boxiaoyuan/centos "/bin/sh -c /bin/bas 6 minutes ago Up 6 minutes boxiaoyuan
删除boxiaoyuan,bixaoyuan_sub修改后boxiaoyuan_sub_sub能否访问
1、删除boxiaoyuan
[root@boxiaoyuan ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f4966308ba0 boxiaoyuan/centos "/bin/sh -c /bin/bas 22 seconds ago Up 21 seconds boxiaoyuan_sub_sub 25501c70bdf8 boxiaoyuan/centos "/bin/sh -c /bin/bas 4 minutes ago Up 4 minutes boxiaoyuan_sub d1ab983e15fc boxiaoyuan/centos "/bin/sh -c /bin/bas 6 minutes ago Up 6 minutes boxiaoyuan
[root@boxiaoyuan ~]# docker rm -f boxiaoyuan boxiaoyuan
2、修改boxiaoyuan_sub
[root@boxiaoyuan ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f4966308ba0 boxiaoyuan/centos "/bin/sh -c /bin/bas About a minute ago Up About a minute boxiaoyuan_sub_sub 25501c70bdf8 boxiaoyuan/centos "/bin/sh -c /bin/bas 4 minutes ago Up 4 minutes boxiaoyuan_sub
[root@boxiaoyuan ~]# docker attach boxiaoyuan_sub [root@25501c70bdf8 dataVolumeContainer2]# ls boxiaoyuan02_add.txt boxiaoyuan03_add.txt boxiaoyuan_add.txt [root@25501c70bdf8 dataVolumeContainer2]# touch boxiaoyuan02_update.txt [root@25501c70bdf8 dataVolumeContainer2]# ls boxiaoyuan02_add.txt boxiaoyuan02_update.txt boxiaoyuan03_add.txt boxiaoyuan_add.txt [root@25501c70bdf8 dataVolumeContainer2]# [root@boxiaoyuan ~]#
3、访问boxiaoyuan_sub_sub
[root@boxiaoyuan ~]# docker attach boxiaoyuan_sub_sub [root@6f4966308ba0 dataVolumeContainer2]# ls boxiaoyuan02_add.txt boxiaoyuan02_update.txt boxiaoyuan03_add.txt boxiaoyuan_add.txt
答案是可以
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
标签:容器,4096,root,boxiaoyuan,xr,txt,数据 来源: https://www.cnblogs.com/zhuzhaoli/p/11146626.html