数据卷与dockerfile
原创者:文思
一、容器数据卷
1、什么是数据卷,能做什么
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此可以绕过UnionFileSystem提供一些用于持续存储或共享数据的特性。
能做什么:容器持久化、数据共享
2、用命令添加数据卷
docker run –v宿主机路径:/容器目录 镜像名
示例:已打开交互终端方式进入容器
docker run -it -v /myDataVolume:/dataVolumeContainer centos
运行docker inspect 查看容器内部细节
可以看到已经绑定成功,并且可以读写。在宿主机的myDataVolume下新建host.txt后进入容器观察:
发现容器的dataVolumeContainer文件夹里也有host.txt了。然后打开并编辑容器里的host.txt我们看看宿主机上的会不会同步变化:
保存退出后,然后查看宿主机文件:
看到宿主机上的文件也同步一样。
当容器停止时,主机上的修改能同步过去吗?示例验证:
首先退出当前容器
宿主机上新建host0.txt并编辑:
查看确保docker没有任何运行中的容器实例:
doker start 容器实例ID,启动容器并进入数据卷目录查看:
可以看到容器停止退出后,主机修改数据后仍然同步。
容器目录后加参数可代表只读或只写等,如:docker run –v宿主机路径:/容器目录:ro 镜像名。代表只读,宿主机的数据可以单向的传过来,容器里不能任何修改,这里不再进行演示。
二、DockerFile
DockerFile:镜像模板的描述文件
出于移植性和分享性的考虑,用-v主机目录:容器目录这种方式不能直接在DockerFile中实现。在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷。
使用示例:
1、File构建-新建mydocker文件并使用VOLUME指令来给镜像添加一个或多个数据卷:
2、build后生成镜像:build -f dockerfile文件 -t 自定义镜像名 .
用docker images查看可以看到生成的新镜像。
3、docker inspect 新镜像可以看到没有指定宿主机,但会根据数据卷默认出来
三、数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个父容器实现数据共享,挂载数据卷的容器称为数据卷容器。
--volume-from容器间传递共享
启动我们自定义新建的镜像:
[root@f76a128edd1cdataVolumeContainer2]# touch dc01_add.txt
然后再以此镜像启动一个容器示例dc02(weicl@mysql5:/myDataVolume$ sudo docker run -it--name dc02 --volumes-from dc01 mydocker/centos):
可以看到dc02中也有dc01_add.txt,也就是继承了dc01。
假如dc03也继承dc01,将dc01删除后,dc02新增文件,dc03中也会被同步进来,这就是docker的数据分享。
结论:容器之间配置信息的传输,数据卷的生命周期一直持续到没有容器使用它为止。