(三) Docker容器数据卷 详细讲解

1. 容器的数据

容器中的文件系统由分层文件系统提供的,包含只读层(镜像)和可读可写层(容器运行时层),这些都被封装在容器内部,如果用户需要将主机上的文件系统共享给容器使用,目前由两种处理方式:

  • 数据卷——将主机的卷mount进入容器。
  • 数据容器——将外部容器分享给容器。

1.1 数据卷

先来看看Docker的理念:

  • 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
  • 容器之间希望有可能共享数据
    Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
    那么当容器删除后,数据自然也就没有了。

为了能保存数据在docker中我们使用卷。有点类似我们Redis里面的rdb和aof文件,持久化功能。

1.2 数据卷能干嘛

  1. 容器的持久化
  2. 容器间继承+共享数据

数据卷提供了一种主机和容器共享数据的方式,有些时候需要用它来做持久化和数据共享。
当作持久化时,通常数据卷都会比较大,可以将其放在一个单独的磁盘、卷或者阵列上,这个时候容器只是一个执行环境。
当做数据共享时,可以用于开发和测试分布式环境,如需要用到共享盘、处理fencing等。
数据卷主要通过 -v 参数来指定。

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

特点:

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

2. 如何操作

2.1 映射一个外部卷

命令:docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
如果以 -v src:des的方式指定,那么容器则会直接将宿主机的目录挂在到容器内部。
容器更目录:
在这里插入图片描述
主机根目录:
在这里插入图片描述
查看数据卷是否挂在成功:
docker inspect 镜像Id
在这里插入图片描述
容器与宿主机之间的数据共享
在这里插入图片描述
测试数据共享,在主机中创建文件,容器中可查看到该文件。
在这里插入图片描述在这里插入图片描述测试容器停止退出后,主机修改后数据是否同步。
首先停止退出容器,然后主机修改共享数据。启动容器后查看共享数据是否同步。
在这里插入图片描述在这里插入图片描述
发现容器即使关闭了,主机修改共享数据后容器仍可以获取。

2.2 创建一个数据卷

若需要一个外部卷来存放持久化数据,而不享把数据包含在容器内部。例如:
在这里插入图片描述创建了一个名为centos02的容器,同时为其创建一个/webapp的数据卷,这是数据卷在其内部的位置。
它在主机的位置:
docker inspect 镜像id
在这里插入图片描述这个位置在 /var/lib/docker下。

2.3 DockerFile添加

可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:
出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

  1. File构建
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,----success"
CMD /bin/bash
  1. build后生成镜像
    [root@zxg mydocker]# docker build -f ./dockerfile -t zxg/centos .
    生成了一个新的镜像 zxg/centos
    在这里插入图片描述
  2. 运行容器
    在这里插入图片描述我们定义的两个数据卷在容器中已经存在。
    在这里插入图片描述主机中默认的地址仍然在 /var/lib/docker下面。

2.4 使用数据型容器

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

由于容器本身就可以包含文件系统,那么可以把容器的卷分享给另一个容器使用。步骤如下:

  1. 创建一个包含外部卷的容器,注意是 create ,不是run。 run是create之后再start。本例只需要容器的文件系统,所以只需要create。
    [root@zxg ~]# docker create -v /dbdata --name centos03 centos
  2. 在另一个容器中通过 --volumes-from来映射
    [root@zxg ~]# docker run --rm -it --volumes-from centos02 centos

相关博客

(一) Docker介绍与安装、测试和常用命令等。一篇文章足以。

(二) Docker 镜像与容器的区别与存储结构

(四) Docker之Dockerfile编写与指令解析,自定义镜像实战

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxg45

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值