在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。
容器中数据管理主要有两种方式:数据卷和数据卷容器。
数据卷(Data Volumes) ,是将容器内数据直接映射到本地宿主机。
数据卷容器(Data Volume Containers),则是使用特定容器来维护数据卷。
数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个父容器实现数据共享,挂载数据卷的这个容器称为数据卷容器。
1.启动dc01容器:docker run -it --name dc01 imageName
[root@izbp13m488196e5hna361rz ~]# docker run -it --name dc01 nick/centos [root@84db6b10578b /]# ls bin dataVolumeContainer1 dataVolumeContainer2 dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
由于镜像nick/centos是通过dockerfile添加了数据卷,所以dc01中有dataVolumeContainer1和dataVolumeContainer2两个数据卷
2.启动dc02容器,继承自dc01:docker run -it --name dc02 --volumes-from dc01 imageName
启动dc03容器,继承自dc01:docker run -it --name dc03 --volumes-from dc01 imageName
[root@izbp13m488196e5hna361rz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4c5c595a66f1 nick/centos "/bin/sh -c /bin/bash" 2 minutes ago Up 2 minutes dc03 14997363df5e nick/centos "/bin/sh -c /bin/bash" 2 minutes ago Up 2 minutes dc02 84db6b10578b nick/centos "/bin/sh -c /bin/bash" 9 minutes ago Up 9 minutes dc01 [root@izbp13m488196e5hna361rz ~]# docker exec -it 14997363df5e ls / bin dev lib media proc sbin tmp dataVolumeContainer1 etc lib64 mnt root srv usr dataVolumeContainer2 home lost+found opt run sys var [root@izbp13m488196e5hna361rz ~]# docker exec -it 84db6b10578b ls / bin dev lib media proc sbin tmp dataVolumeContainer1 etc lib64 mnt root srv usr dataVolumeContainer2 home lost+found opt run sys var
可见,dc02和dc03由于继承了dc01,所以也有dataVolumeContainer1和dataVolumeContainer2两个数据卷。
3.在dc01、dc02、dc03的数据卷中随意修改其中一个,其余的两个都将同步
[root@izbp13m488196e5hna361rz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4c5c595a66f1 nick/centos "/bin/sh -c /bin/bash" 2 days ago Up 17 minutes dc03 14997363df5e nick/centos "/bin/sh -c /bin/bash" 2 days ago Up 17 minutes dc02 84db6b10578b nick/centos "/bin/sh -c /bin/bash" 2 days ago Up 18 minutes dc01 [root@izbp13m488196e5hna361rz ~]# docker exec 4c5c595a66f1 touch /dataVolumeContainer2/dc03add [root@izbp13m488196e5hna361rz ~]# docker exec 4c5c595a66f1 ls /dataVolumeContainer2/dc03add /dataVolumeContainer2/dc03add [root@izbp13m488196e5hna361rz ~]# docker exec 14997363df5e ls /dataVolumeContainer2/dc03add /dataVolumeContainer2/dc03add [root@izbp13m488196e5hna361rz ~]# docker exec 84db6b10578b ls /dataVolumeContainer2/dc03add /dataVolumeContainer2/dc03add
4.删除dc01后,修改dc02,dc03还是同步dc02
[root@izbp13m488196e5hna361rz ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4c5c595a66f1 nick/centos "/bin/sh -c /bin/bash" 2 days ago Up 23 minutes dc03 14997363df5e nick/centos "/bin/sh -c /bin/bash" 2 days ago Up 23 minutes dc02 84db6b10578b nick/centos "/bin/sh -c /bin/bash" 2 days ago Up 23 minutes dc01 [root@izbp13m488196e5hna361rz ~]# docker rm -f 84db6b10578b 84db6b10578b [root@izbp13m488196e5hna361rz ~]# docker exec -it 14997363df5e touch /dataVolumeContainer1/dc02add [root@izbp13m488196e5hna361rz ~]# docker exec -it 14997363df5e ls /dataVolumeContainer1/dc02add /dataVolumeContainer1/dc02add [root@izbp13m488196e5hna361rz ~]# docker exec -it 4c5c595a66f1 ls /dataVolumeContainer1/dc02add /dataVolumeContainer1/dc02add
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。