前提
Docker 容器产生的数据, 如果不通过 docker commit 生成新的镜像, 使数据做为镜像的一部分保存下来, 那么当容器删除后, 数据自然也就没有了.
为了能保存数据在 docker 中我们使用卷. 目的就是为了让容器内的数据吃持久化.
数据卷的介绍
卷就是目录或文件, 存在于一个或多个容器中, 由 docker 挂载到容器, 但不属于联合文件系统, 因此能够绕过 Union File System 提供一些用于持续存储或共享数据的特性: 卷的设计目的就是数据的持久化, 完全独立于容器的生存周期, 因此 Docker 不会在容器删除时删除其挂载的数据卷
特点:
数据卷可在容器之间共享或重用数据
卷中的更改可以直接生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
容器内添加数据卷
方法一: 使用 -v 命令
# 双向读写权限
docker run -it -v / 宿主机目录:/ 容器内目录 镜像名称
# 宿主机可读写, 容器只读
docker run -it -v / 宿主机目录:/ 容器内目录: ro 镜像名称
效果 :
先在宿主机创建 host_share 目录
- # 执行命令 docker run -it -v / 宿主机目录:/ 容器内目录 镜像名称
- docker run -it -v /host_share:/container_share CentOS
进入容器内部, 发现 container_share 文件夹成功创建
按 Ctrl+P+Q 暂时退出容器(容器不关闭)
检查数据卷是否挂载成功
# 查看容器内部信息
docker inspect 容器 ID
测试数据是否共享
测试容器停止后, 主机修改的数据是否同步
方法二: 使用 DockerFile 添加
出于可移植和分享的考虑, 用 - v 主机目录: 容器目录这种方法不能够直接在 Dockerfile 中实现.
由于宿主机目录是依赖于特定宿主机的, 并不能够保证在所有的宿主机上都存在这样的特定目录. 下面介绍使用 DockerFile 添加数据卷
宿主机根目录下新建 mydocker 并进入, 新建一个 mydockerfile 文件, 编辑
- FROM CentOS
- VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
- CMD echo "finished,--------success!"
- CMD /bin/bash
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]通过这种方法可以在容器中添加多个数据卷, 对应的宿主机共享地址会默认设置
使用 build 命令将当前的 mydockerfile 生成镜像
- # docker build -f DockerFIle 绝对路径 -t 命名空间 / 镜像名称 .
- # 注意 . 不要忘了
- docker build -f /mydocker/mydockerfile -t moti/CentOS .
运行容器并进入, 发现两个数据卷目录已经成功创建
Ctrl+P+Q 暂时退出(不停止容器), 使用 docker inspect 容器 ID 查看数据卷的相关信息
红框勾选的就是在宿主机的对应路径
测试数据共享是否实现
数据卷容器
命名的容器挂载数据卷, 其它容器通过挂载这个 (父容器) 实现数据共享, 挂载数据卷的容器, 称之为数据卷容器
容器之间传递数据共享
先创建一个容器 c1, 在 dataVolumeContainer1 添加共享数据 c1.txt
创建容器 c2 继承自 c1, 查看 dataVolumeContainer1 里面的文件, 并在 dataVolumeContainer1 中添加 c2.txt
创建容器 c3 继承自 c1, 查看 dataVolumeContainer1 里面的文件, 并在 dataVolumeContainer1 中添加 c3.txt
删除 c1 容器, 查看 c2 和 c3 中的文件是否有变化(原来有 c1.txt c2.txt c3.txt 共三个文件)
可以发现, c1 删除, 对 c2,c3 是不影响的, 那么 c2 与 c3 会不会共享文件?
可以看到, 尽管 c1 删除了但是 c2 和 c3 仍然是数据共享的, 那么删除 c2, 查看 c3 的数据有没有什么变化
结论: 容器之间配置信息的传递, 数据卷的生命周期会一直持续到没有容器使用它为止
posted on 2019-12-23 22:58 CN 丶 Moti 阅读(...) 评论(...) 编辑 收藏
来源: https://www.cnblogs.com/cnmoti/p/12088972.html