1、什么是容器数据卷
Docker的理念:
将应用与运行环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过Docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么容器删除后,数据自然也就没有了
为了能保存数据在Docker中我们使用数据卷
2、容器数据卷能做什么
(1)容器数据的持久化
(2)容器之间继承和共享数据
3、添加数据卷的方式
3.1 直接使用命令添加
①语法:
docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash
②查看数据卷容器是否挂载成功
docker inspect 容器ID
注:使用命令直接关联容器数据卷时,则关联的容器数据卷会根宿主机目录文件夹下内容进行同步
例子:
第一步:查看现有的镜像:
第二步:添加一个卷册(位置存在/root/data),执行以下命令
docker run -it -v /root/data:/root/data centos /bin/bash
查看是否挂载成功:
宿主机目录:
进入容器后,容器目录:
结果:宿主机和数据卷容器数据共享
第三步:向宿主机data目录下新增文件host.txt文件,然后去数据卷容器对应目录下查看
再次进入容器/root/data查看时,提示无权限访问,
解决方案:在挂载目录后多添加一个--privileged=true参数即可
第四步:删除已运行的centos,重新运行新的centos,再次执行第三步操作
docker rm -f $(docker ps -aq)
docker run -it -v /root/data:/root/data --privileged=true --name ="mycentos01" centos
第五步:再次进入数据卷容器,查看/root/data目录,文件已经存在
第六步:再次修改宿主机txt文件内容,容器内txt文件内容也修改了
3.2 使用DockerFile添加
(1)在root下建立docker文件夹,在文件夹下创建Dockerfile文件
mkdir docker
touch Dockerfile
注意:默认Dockerfile文件名不能写错了
(2)编写Dockerfile文件,添加以下内容
#基于centos构造一个镜像
FROM centos
#加入容器卷
VOLUME ["/mydata"]
CMD echo "finished -------success"
CMD /bin/bash
(3)使用Dockerfile生成自定义镜像mycentos02
docker build -t mycentos02:1.0 .
注意:在生成自定义镜像时,注意最后面的点;
(4) 运行镜像mycentos02
docker run -it mycentos02:1.0
(5)查看数据卷容器是否挂载成功
docker inspect 57cb8eb129c7
(6)进入宿主机目录,创建文件
cd
/var/lib/docker/volumes/b014ef8087c6975346d9f0a872f4ae1d2d7d817c1511194f7470c7a3ee036f11/_data
touch host.txt
(7)进入数据卷容器,/mydata目录下查看,存在文件
4、数据卷容器
4.1 作用:实现容器之间数据共享
4.2 操作思路
第1步:进入到/root/docker目录,执行以下命令,使用Dockerfile生成一个自定义的centos镜像
docker build -t mycentos01:1.0 .
第2步:使用自己创建的镜像,启动一个容器
docker run -it --name test1 mycentos01:1.0 /bin/bash
第3步:使用自己创建的镜像,启动第二个容器(继承第一个容器)
docker run -it --name test2 --volumes-from test1 mycentos01:1.0 /bin/bash
第4步:使用自己创建的镜像,启动第三个容器(继承第二个容器)
docker run -it --name test3 --volumes-from test2 mycentos01:1.0 /bin/bash
第5步:测试
进入容器test1,在/mydata下创建文件test1.txt
进入容器test2,在/mydata下查看有文件test1.txt,在/mydata文件夹下创建文件test2.txt
进入容器test3,在/mydata下查看有文件test1.txt,test2.txt
进入容器test1,在/mydata下查看有文件test1.txt,test2.txt
到此则验证容器之间数据共享
第6步:删除容器test1,容器test2,test3下/mydata文件夹下数据不会变化
原因:使用Dockerfile添加容器数据卷,容器卷挂载是跟宿主机关联,而非容器之间挂载,宿主机容器卷挂载指定地址下文件不删除则不会影响其它容器。