1、什么是容器数据卷
有时候我们可能会有这样的需求
- 将应用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
- 容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用容器数据卷。
2、容器数据卷能做什么
1、容器数据的持久化
2、容器之间继承和共享数据
3、容器数据卷
容器数据卷可以做到容器中的某一个文件夹与宿主机中的某一个文件夹共享
使用方式
docker run -d -p 8111:8080 -v (本机文件夹):(容器文件夹) [--privileged=true] (镜像名称/镜像id)
--privileged=true:不加的话会出现如下权限问题
测试案例
使一个tomcat容器中的 tomcat/webapps 目录关联本机的文件夹,目录不存在会自动创建
docker run -d -p 8111:8080 -v /root/myapps:/usr/local/tomcat/webapps --privileged=true tomcat
大家可以尝试在该目录下放一个自己写的HTML,结果也是一样的。
4、数据卷容器
作用:实现 容器之间
的数据共享
原理:在宿主机上建立一个公共的文件夹,使其他需要相互通信的容器都依赖于这个文件夹,主要通过容器之间的 继承关系 实现
问:在多个容器的相互依赖的过程中,若删除了一个容器,其他容器的数据会受到影响吗?
答:其他容器的数据是不会受到影响的,除非你把宿主机的文件删除
测试案例
实现三个centOS之间共享宿主机中的同一个文件夹
基于自定义的 Dockerfile 文件构造一个 centOS 镜像
1、Dockerfile 文件
# 基于cnetos 构造一个镜像
FROM centos
# 设置容器卷
VOLUME ["/mydata"]
CMD echo "this is test,----------------success"
CMD /bin/bash
2、执行构建命令
# 基于Dockerfile构建镜像,-t:指定名称和版本
docker build -t (镜像名称):(版本号) (Dockerfile文件位置)
# 默认在当前路径在找Dockerfile文件
docker build -t mycentos01:1.0 . // 后面有个 .
# 若Dockerfile的名称不是Dockerfile,则需要通过-f 指定
# docker build -f /home/test/doc -t mycentos:1.0 .
3、运行三个镜像,os3 -->os2–>os1继承运行
# 使用自己创建的镜像启动一个容器
docker run -itd --name os1 mycentos01:1.0 /bin/bash
# 使用自己创建的镜像启动第二个容器继承第一个
docker run -itd --name os2 --volumes-from os1 mycentos01:1.0 /bin/bash
# 使用自己创建的镜像启动第三个容器继承第二个
docker run -itd --name os3 --volumes-from os2 mycentos01:1.0 /bin/bash
4、分别进入三个容器的mydata文件夹创建三个文件,分别为os1.txt、os2.txt、os3.txt
# 进入os1创建os1.txt
docker attach os1
cd /mydata
touch os1.txt
# 进入os2创建os2.txt
docker attach os2
cd /mydata
touch os2.txt
# 进入os3创建os3.txt
docker attach os3
cd /mydata
touch os3.txt
最后进入os1中可以看到分别在不同容器中创建的文件
,说明实现了容器之间的数据共享
5、现在测试把os1删除,查看文件还是否存在
docker kill os1
可以看到文件还是存在的
,进一步说明了docker容器间数据共享是通过在宿主机上建立文件夹实现的
6、最后使用命令查看两个容器的容器卷,找到在宿主机中文件的位置进行对比
# 查看容器卷
docker inspect os2
os2:
os3:
可以看到两个容器的容器卷共享数据目录的在宿主机中的位置都是相同的