先来看看Docker的理念:
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。
特点: 1:数据卷可在容器之间共享或重用数据 2:卷中的更改可以直接生效 3:数据卷中的更改不会包含在镜像的更新中 4:数据卷的生命周期一直持续到没有容器使用它为止
docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /myDataVolum:/dataVolumContainer centos /bin/bash
可以看出命名执行完就进入到一个镜像名为a82ff6c30fbb的centos下,查看centos下有dataVolumContainer这个新建的文件夹
进入到宿主机,发现也会新建个myDataVolum,这两个文件夹中的数据是互通的
docker inspect 容器ID
docker inspect a82ff6c30fbb
案例:测试宿主机和容器是否共享数据 在宿主机新建一个a.txt文件
容器中写入数据,如:hello docker!
在宿主机上查看写入的内容:
案例:先exit退出容器,在宿主机新建文件并写入数据。然后再重新启动容器,看写入的数据是否同步。 新建b.txt文件,写入:test
docker ps -l
-l :显示最近创建的容器。
启动centos镜像
docker start a82ff6c30fbb
docker attach a82ff6c30fbb
数据一致:
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
ro:表示只读不可写
RW:表示读写
结论:设置上述的权限时(设置ro),在共享文件夹中,容器中只能查看不能写入
mkdir mydocker
cd mydocker
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:
出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。 由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
获得一个新镜像zzyy/centos
docker build -f /mydocker/Dockerfile -t xdr630/centos .
运行后一层一层执行,以容器内的centos镜像为根本,就可以创建另外一个自定义的centos镜像。
现在直接运行刚才创建的容器,一运行就会直接在xdr630/centos 下创建两个容器卷
docker images 容器名 可以查询images下是否有这个容器,如:
docker run -it xdr630/centos
这里注意的是最新版的centos镜像中默认对应的宿主机的路径在“Mounts”值中
最新版本的宿主机默认对应的路径为: /var/lib/docker/volumes/75326a87e1affc3eb80ed150430ff4aaa11c1d55ddc333f3fe0754098b964486/_data
Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied 解决办法:在挂载目录后多加一个–privileged=true参数即可
是什么?
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
docker run -it --name dc02 --volumes-from dc01 xdr630/centos
发现有刚才新增的文件
dc02/dc03分别在dataVolumeContainer2各自新增内容
再进一步