Docker篇章6:Docker容器数据卷
-
首先将运行的环境打包形成容器来运行,但是我们对数据的要求希望是持久化的,容器之间要共享数据
-
docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没了。为了能够保存数据在docker中我们使用卷,它类似于redis的持久化存储(RDB or AOF),它能够使容器数据持久化存储,容器间数据共享。
-
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像更新中
- 数据卷的声明周期一直持续到没有容器使用它为止
容器内添加数据卷
1.命令添加
-
直接在run时候命令添加
docker run -it -v /宿主机的绝对路径:/容器内目录 [--privileged=true] 镜像名 docker run -it -v /myDataVolume:/dataVolumeContainer centos # 执行上面命令会在宿主机根目录生成myDataVolume文件夹,并且启动的容器centos系统根目录内会生成dataVolumeContainer文件夹
-
检查
docker inspect 容器ID # 可以看到如下图,主机文件myDataVolume和容器内文件dataVolumeContainer进行绑定
-
cd /myDataVolume
到主机内myDataVolume
文件下创建文件touch demo.txt
-
此时容器内
cd /dataVolumeContainer
然后执行命令:[root@6a5f30987ade dataVolumeContainer]# ls demo.txt # 可以看到,主机创建的文件容器内也能看到
-
容器内,编辑demo.txt
echo "hello" >> demo.txt
-
在主机执行,
cat demo.txt
可以看到容器内编辑的文本[root@oldboy myDataVolume]# cat demo.txt hello
可以看到容器和宿主机之间数据共享。
-
如果容器停止退出后,主机修改后数据是否同步
# 关闭容器 [root@6a5f30987ade dataVolumeContainer]# exit # 修改主机下myDataVolume 下demo.txt文件 echo "hello world" > demo.txt # 启动刚才停止容器 docker start 6a5f30987ade # 查看demo.txt [root@oldboy myDataVolume]# cat demo.txt hello world
只要启动容器还是同步数据。
2.命令添加(带有权限)
-
带有写保护,表示容器内的目录只读,不可写:
docker run -it -v /宿主机的绝对路径:/容器内目录:ro 镜像名 docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
容器内数据只允许查看,不能进行增删改。
3.DockerFile添加
-
DockerFile是对镜像的描述模板文件。
-
编写docker准备工作
# 根目录下添加mydocker mkdir mydocker cd mydocker # 编写dockerfile vim mydockerfile
-
构建
# 可在Dockerfile中使用VOLUME指令来给镜像添加一个多个数据卷 写入内容如下: # volume test FROM centos #引入centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]#容器内创建2个数据卷用于与宿主机数据共享 CMD echo " finished,-----success"#打印成功 CMD /bin/bash #其实上面命令相当于: docker run -it -v /host1:/dataVolumeContainer1 -v /host1:/dataVolumeContainer2 centos /bin/bash
-
用dockerfile构建自定义镜像
docker build -f dockerfile路径 -t 镜像名 docker build -f /mydocker/mydockerfile -t xjk/centos .#点表示当前路径 Step 1/4 : FROM centos ---> 470671670cac Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] ---> Running in fc3dab22127a Removing intermediate container fc3dab22127a ---> 82a10278b981 Step 3/4 : CMD echo "finished,-----success" ---> Running in 047e68638e59 Removing intermediate container 047e68638e59 ---> 06bda10b7dd9 Step 4/4 : CMD /bin/bash ---> Running in 057f899ab30d Removing intermediate container 057f899ab30d ---> a3e53fed0404 Successfully built a3e53fed0404 Successfully tagged xjk/centos:latest
-
运行
docker run -it xjk/centos /bin/bash [root@bf197575730a /]# ls dataVolumeContainer2 dataVolumeContainer1 ... #可以看到容器内新建了2个数据文件
-
我们没有指定宿主机的存放数据文件路经,那么默认会分配到哪呢?
docker inspect bf197575730a #bf197575730a为正在运行容器ID
-
可以看到默认放入
/var/lib/docker/volumes/....
下目录:当然无论在宿主机增删改查,还是在容器内文件目录增删改查,数据都是能同步的。
4.数据卷容器内数据生命周期
-
主机到容器,容器到主机的硬盘进行挂载,实现数据传递的依赖。
# 新建容器dc01 docker run -it --name dc01 xjk/centos # 在容器内共享数据文件夹dataVolumeContainer2内创建dc01-test.txt # 再启动一个容器dc02继承dc01,此时dc02容器的共享数据文件夹dataVolumeContainer2内有dc01-test.txt docker run -it --name dc02 --volumes-from dc01 xjk/centos # 并且在dc02创建 touch dc02-test.txt,dc01也是共享的。 # 当dc01容器关闭并删除掉 docker rm -f dc01 # 此时其他容器还是能访问dc01容器创建的 dc01-test.txt文件
最终: 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。