5、Docker容器数据卷
1、概念:
Docker的理念:
将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
docker容器数据卷有点类似我们Redis里面的rdb和aof文件
2、用途
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷
特点:
1、数据卷可在容器之间共享或重用数据
2、卷的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
主要用途:
容器的持久化
容器间继承+共享数据
3、数据卷
容器内添加
-
直接命令添加
-
命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
-
查看数据卷是否挂载成功
挂载信息:
-
宿主机和容器数据共享:
-
容器停止退出后,主机修改后数据是否同步
[root@iZ2ze9gzwtvgold6960x4uZ myDataVolume]# docker stop hopeful_kilby hopeful_kilby [root@iZ2ze9gzwtvgold6960x4uZ myDataVolume]# cd / [root@iZ2ze9gzwtvgold6960x4uZ /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@iZ2ze9gzwtvgold6960x4uZ /]# echo "the data from host">>./myDataVolume/a.log [root@iZ2ze9gzwtvgold6960x4uZ /]# cat ./myDataVolume/a.log the data from container the data from host [root@iZ2ze9gzwtvgold6960x4uZ /]# docker start hopeful_kilby hopeful_kilby [root@iZ2ze9gzwtvgold6960x4uZ /]# docker exec -it hopeful_kilby /bin/bash [root@d0a109c025af /]# cat ./dataVolumeContainer/a.log the data from container the data from host
当容器停止退出后,主机修改后数据能同步到容器中
-
命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:or 镜像名 容器内目录为只读
-
-
DockerFile添加
1、根目录下新建mydocker文件夹并进入
2、可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:出于可移植和分享的考虑,用-v主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
3、File构建
#volume test FROM centos:7.5.1804 VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished------success" CMD /bin/bash
#获得一个新的镜像zyp/centos [root@111 mydocker]# docker build -f /mydocker/dockerfile -t zyp/centos .
参数说明:
-f:指定要使用的Dockerfile路径
-t:镜像的名字及标签,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个标签
运行通过Dockerfile构建的镜像:
通过上述步骤,容器内的卷目录地址已经知道,对应的主机目录地址在哪?
docker inspect 容器名或容器ID
主机对应默认地址:
-
备注
Docker挂载主机目录Docker访问出现cannot open directory … Permission denied
解决办法:挂载目录后多加–privileged=true参数即可
参数说明:
–privileged=true:
-
使用该参数,container内的root拥有真正的root权限。
-
否则,container内的root只是外部的一个普通用户权限。
-
privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。
-
甚至允许你在docker容器中启动docker容器。
-
4、数据卷容器
概念:
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
总体介绍:
以上一步新建的镜像zyp/centos为模板并运行容器dc01/dc02/dc03
它们已经具有容器卷:
/dataVolumeContainer1、/dataVolumeContainer2
容器间传递共享(–volumes-from)
1、先启动一个父容器dc01,在dataVolumeContainer2新增内容
2、dc02/dc03继承自dc01
#1、启动一个父容器dc01,并在dataVolumeContainer2新增内容container_dc01.txt
[root@111 /]# docker run -it --name="dc01" zyp/centos /bin/bash
[root@3609f50be22c /]# cd dataVolumeContainer2
[root@3609f50be22c dataVolumeContainer2]# vi container_dc01.txt
[root@3609f50be22c dataVolumeContainer2]# [root@111 /]#
#2、启动一个容器dc02继承自dc01,并在dataVolumeContainer2新增内容container_dc02.txt
[root@111 /]# docker run -it --name="dc02" --volumes-from dc01 zyp/centos
[root@0809ed4e8499 /]# cd /dataVolumeContainer2
[root@0809ed4e8499 dataVolumeContainer2]# vi container_dc02.txt
#容器dc01中的container_dc01.txt共享到了容器dc02中
[root@0809ed4e8499 dataVolumeContainer2]# ls
container_dc01.txt container_dc02.txt
[root@0809ed4e8499 dataVolumeContainer2]# [root@111 /]#
#3、启动一个容器dc03继承自dc01,并在dataVolumeContainer2新增内容container_dc03
[root@111 /]# docker run -it --name="dc03" --volumes-from dc01 zyp/centos
[root@bdb0006e1068 /]# cd /dataVolumeContainer2
[root@bdb0006e1068 dataVolumeContainer2]# vi container_dc03
#容器dc01中的container_dc01.txt和容器dc02中的container_dc02.txt共享到了容器dc03中
[root@bdb0006e1068 dataVolumeContainer2]# ls
container_dc01.txt container_dc02.txt container_dc03
3、回到dc01可以看到dc02/dc03个自添加的都能共享了
4、删除dc01,dc02修改后dc03能否访问:
[root@111 /]# docker rm -f dc01
dc01
[root@111 /]# docker attach dc02
[root@0809ed4e8499 dataVolumeContainer2]# ls
container_dc01.txt container_dc02.txt container_dc03.txt
#在dc02中新建dc02_update.txt文件
[root@0809ed4e8499 dataVolumeContainer2]# touch dc02_update.txt
[root@0809ed4e8499 dataVolumeContainer2]# ls
container_dc01.txt container_dc02.txt container_dc03.txt dc02_update.txt
[root@0809ed4e8499 dataVolumeContainer2]# [root@111 /]#
#进入dc03容器中
[root@iZ2ze9gzwtvgold6960x4uZ /]# docker exec -it dc03 /bin/bash
[root@bdb0006e1068 /]# cd /dataVolumeContainer2
#dc02中的文件被修改后在dc03中还是能访问
[root@bdb0006e1068 dataVolumeContainer2]# ls
container_dc01.txt container_dc02.txt container_dc03.txt dc02_update.txt
5、删除dc02后dc03能否访问
[root@111 ~]# docker rm -f dc02
dc02
[root@111 ~]# docker exec -it dc03 /bin/bash
[root@bdb0006e1068 /]# cd /dataVolumeContainer2
#删除dc02后dc03任然可以访问
[root@bdb0006e1068 dataVolumeContainer2]# ls
container_dc01.txt container_dc02.txt container_dc03.txt dc02_update.txt
6、新建dc04继承dc03后再删除dc03
[root@111 ~]# docker run -it --name="dc04" --volumes-from dc03 zyp/centos
[root@b5993c4d8662 /]# cd /dataVolumeContainer2
[root@b5993c4d8662 dataVolumeContainer2]# ls
container_dc01.txt container_dc02.txt container_dc03.txt dc02_update.txt
[root@b5993c4d8662 dataVolumeContainer2]# [root@iZ2ze9gzwtvgold6960x4uZ ~]#
[root@111 ~]# docker rm -f dc03
dc03
[root@111 ~]# docker exec -it dc04 /bin/bash
[root@b5993c4d8662 /]# cd /dataVolumeContainer2
#删除dc03后dc04还是可以访问
[root@b5993c4d8662 dataVolumeContainer2]# ls
container_dc01.txt container_dc02.txt container_dc03.txt dc02_update.txt
7、结论
3
[root@111 ~]# docker exec -it dc04 /bin/bash
[root@b5993c4d8662 /]# cd /dataVolumeContainer2
#删除dc03后dc04还是可以访问
[root@b5993c4d8662 dataVolumeContainer2]# ls
container_dc01.txt container_dc02.txt container_dc03.txt dc02_update.txt
7、结论
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止