1、容器数据卷
(1)概念
主要作用是做持久化,如果不使用docker的commit生成新的镜像使得数据做为镜像的一部分保存下来,那么容器删除之后数据就会丢失(关闭Docker之后数据也会消失)
(2)特点
数据卷可在容器之间共享或重用数据
卷中的更改可以直接生效(在服务器中修改,容器中的文件也会被修改)
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
2、容器数据卷的运用(命令方式)
(1)绑定目录
在运行这条命令的过程中在宿主机上创建了myDataVolume目录并在centos镜像的容器中生成了dataVolumeContainer目录
-i
选项指示 docker 要在容器上打开一个标准的输入接口,-t
指示 docker 要创建一个伪 tty 终端,it 交互式tty是交互式,-d是后台运行
(2)运行docker inspect命令
"Mounts": [ { "Type": "bind", "Source": "/myDataVolume", "Destination": "/dataVolumeContainer", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
(3)容器和宿主之间数据共享
在宿主机中创建一个文件:
[root@aubin /]# ls bin boot dev etc home lib lib64 media mnt myDataVolume opt proc root run sbin srv sys tmp usr var [root@aubin /]# cd myDataVolume [root@aubin myDataVolume]# touch host.txt [root@aubin myDataVolume]# ls host.txt
在容器中查看相应的目录:在宿主机中存在文件该文件是可读可写的
[root@a81d9e1a475d /]# ls bin dataVolumeContainer dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@a81d9e1a475d /]# cd dataVolumeContainer [root@a81d9e1a475d dataVolumeContainer]# ls host.txt
相反,如果在容器中创建文件,宿主机中也能看到该文件
(4)容器停止退出,主机修改数据,绑定的容器目录中依旧进行数据的同步
(5)权限
[root@aubin /]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
添加了只读权限,例如:主机新建了文件后,容器内就只有读权限
3、容器数据卷的运用(DockerFile方式)
(1)什么是DockerFile
DockerFile是对镜像的描述
(2)新建一个目录,在目录中创建一个文件
[root@aubin mydocker]# ls
myfile.txt
(3)File构建(在文件中书写配置)
(4)build
[root@aubin ~]# docker build -f /mydocker/myfile.txt -t zhai/centos . Sending build context to Docker daemon 13.87kB Step 1/4 : from centos ---> 0d120b6ccaa8 Step 2/4 : VOLUME ["/dataVolumeContainer","/dataVolumeContainer2"] ---> Using cache ---> d75e63d723c5 Step 3/4 : CMD echo "success" ---> Using cache ---> 4f2ed3ad8394 Step 4/4 : CMD /bin/bash ---> Using cache ---> 8f28e3fd97da Successfully built 8f28e3fd97da Successfully tagged zhai/centos:latest
指明文件路径以及命名空间,点代表的是当前的centos模板
查看镜像:
[root@aubin ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE zhai/centos latest 8f28e3fd97da 7 minutes ago 215MB tomcat latest 625b734f984e 7 hours ago 648MB redis latest bd571e6529f3 9 days ago 104MB mongo latest ba0c2ff8d362 3 weeks ago 492MB centos latest 0d120b6ccaa8 2 months ago 215MB hello-world latest bf756fb1ae65 9 months ago 13.3kB tomcat 8.5.32 5808f01b11bf 2 years ago 463MB
查看新生成的镜像的目录:
[root@aubin /]# docker run -it zhai/centos [root@8f013888a738 /]# ls bin dataVolumeContainer2 etc lib lost+found mnt proc run srv tmp var dataVolumeContainer dev home lib64 media opt root sbin sys usr
(5)数据共享
在宿主机中没有指定目录,但是会有一个默认的目录,如:在容器中创建一个目录
[root@8f013888a738 dataVolumeContainer2]# mkdir mydir
[root@8f013888a738 dataVolumeContainer2]# ls
mydir
在宿主机上查看是否有与容器相同的目录:
[root@aubin data]# cd / [root@aubin /]# cd var [root@aubin var]# cd lib [root@aubin lib]# ls alternatives authconfig containerd dbus dhclient docker games initramfs logrotate machines misc NetworkManager os-prober plymouth polkit-1 postfix rpm rpm-state rsyslog selinux stateless systemd tuned vmware yum [root@aubin lib]# cd docker [root@aubin docker]# ls builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes [root@aubin docker]# cd volumes [root@aubin volumes]# ls 546e5ee0423c12c98d41e5194221e12be66285e4a78b2d0f29af4f802b2ce395 8723facb75d49a8a20e0f70e3ecabd3b44709405d990fcff1ef130e19b82c389 metadata.db [root@aubin volumes]# cd 546e5ee0423c12c98d41e5194221e12be66285e4a78b2d0f29af4f802b2ce395 [root@aubin 546e5ee0423c12c98d41e5194221e12be66285e4a78b2d0f29af4f802b2ce395]# ls _data [root@aubin 546e5ee0423c12c98d41e5194221e12be66285e4a78b2d0f29af4f802b2ce395]# cd _data [root@aubin _data]# ls mydir [root@aubin _data]#
4、容器间的数据共享
(1)启动一号容器并在目录中创建一个文件
[root@aubin /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@aubin /]# docker run -it --name dc01 zhai/centos [root@64649475991d /]# ls bin dataVolumeContainer2 etc lib lost+found mnt proc run srv tmp var dataVolumeContainer dev home lib64 media opt root sbin sys usr [root@64649475991d /]# cd dataVolumeContainer2 [root@64649475991d dataVolumeContainer2]# ls [root@64649475991d dataVolumeContainer2]# touch dc01.txt [root@64649475991d dataVolumeContainer2]# ls dc01.txt
(2)创建二号容器
[root@aubin /]# docker run -it --name dc02 --volumes-from dc01 zhai/centos [root@a5ece78ac702 /]# ls bin dataVolumeContainer2 etc lib lost+found mnt proc run srv tmp var dataVolumeContainer dev home lib64 media opt root sbin sys usr [root@a5ece78ac702 /]# cd dataVolumeContainer2 [root@a5ece78ac702 dataVolumeContainer2]# ls dc01.txt
一号容器创建的文件在二号容器中也存在,二号容器是继承自一号容器的。在二号容器中创建文件后一号容器中也会存在文件,实现了容器间的数据共享。即使将一号容器删除,一号容器创建的文件依旧会在二号容器中
数据卷的生命周期一直持续到没有容器使用它为止