首先将运行的环境打包形成容器来运行,但是我们对数据的要求希望是持久化的,容器之间要共享数据
docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没了。为了能够保存数据在docker中我们使用卷,它类似于redis的持久化存储(RDB or AOF),它能够使容器数据持久化存储,容器间数据共享。
特点:
直接在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
只要启动容器还是同步数据。
带有写保护,表示容器内的目录只读,不可写:
docker run -it -v /宿主机的绝对路径:/容器内目录:ro 镜像名
docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
容器内数据只允许查看,不能进行增删改。
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/....
下目录:
当然无论在宿主机增删改查,还是在容器内文件目录增删改查,数据都是能同步的。
主机到容器,容器到主机的硬盘进行挂载,实现数据传递的依赖。
# 新建容器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文件
最终: 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
原文:https://www.cnblogs.com/xujunkai/p/13031586.html