欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker 容器数据卷

程序员文章站 2022-04-19 08:53:25
...
  • 前提

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。

为了能保存数据在docker中我们使用卷。目的就是为了让容器内的数据吃持久化.

  • 数据卷的介绍

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

特点:

网络小说 www.7wx.org
  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止
  • 容器内添加数据卷

方法一: 使用 -v 命令

# 双向读写权限
docker run -it -v /宿主机目录:/容器内目录 镜像名称
# 宿主机可读写,容器只读
docker run -it -v /宿主机目录:/容器内目录:ro 镜像名称

效果 :

先在宿主机创建host_share目录

Docker 容器数据卷

# 执行命令 docker run -it -v /宿主机目录:/容器内目录 镜像名称
docker run -it -v /host_share:/container_share centos

进入容器内部,发现container_share文件夹成功创建

Docker 容器数据卷

按Ctrl+P+Q暂时退出容器(容器不关闭)

检查数据卷是否挂载成功
# 查看容器内部信息
docker inspect 容器ID

Docker 容器数据卷Docker 容器数据卷

测试数据是否共享

Docker 容器数据卷

测试容器停止后,主机修改的数据是否同步

Docker 容器数据卷

  • 方法二: 使用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 .

Docker 容器数据卷

运行容器并进入,发现两个数据卷目录已经成功创建

Docker 容器数据卷

Ctrl+P+Q暂时退出(不停止容器),使用docker inspect 容器ID查看数据卷的相关信息

Docker 容器数据卷红框勾选的就是在宿主机的对应路径

测试数据共享是否实现

Docker 容器数据卷

  • 数据卷容器

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

容器之间传递数据共享

先创建一个容器c1,在dataVolumeContainer1添加共享数据c1.txt

Docker 容器数据卷

创建容器c2继承自c1,查看 dataVolumeContainer1 里面的文件,并在 dataVolumeContainer1 中添加c2.txt

Docker 容器数据卷

创建容器c3继承自c1,查看 dataVolumeContainer1 里面的文件,并在 dataVolumeContainer1 中添加c3.txt

Docker 容器数据卷

删除c1容器,查看c2和c3中的文件是否有变化(原来有c1.txt c2.txt c3.txt共三个文件)

Docker 容器数据卷

可以发现,c1删除,对c2,c3是不影响的,那么c2与c3会不会共享文件?

Docker 容器数据卷

可以看到,尽管c1删除了但是c2和c3仍然是数据共享的,那么删除c2,查看c3的数据有没有什么变化

Docker 容器数据卷

结论:容器之间配置信息的传递,数据卷的生命周期会一直持续到没有容器使用它为止