一篇搞定Docker数据卷及其配置

前言:
😄作者简介:小曾同学.com,小伙伴们也可以叫我小曾,一个致力于测试开发的博主⛽️
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊
座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

1 写在前面

前段时间给小伙伴们分享了 Docker 相关理论介绍基本命令的详解,今天主要想给大家分享 Docker 数据卷及其配置。
在开始分享之前先抛出三个小问题:

  1. Docker 容器删除后,在容器中产生的数据还在吗?

  2. Docker 容器外部机器可以直接交换文件吗?

  3. 容器之间怎么进行数据交互

以上的三个问题都可以使用数据卷来解决,那什么是数据卷呢,接下来正式开启本篇内容。

2 数据卷的概念

数据卷是宿主机中的一个目录或文件。就是将容器内的目录和宿主机中的目录进行挂载,其中宿主机中的目录就被称为数据卷。

3 数据卷的作用

我们知道了数据卷是宿主机上的一个目录或者文件,那么这个目录或者文件可以做什么呢?可以概括为三点:

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间可数据交换

当容器目录和数据卷目录绑定后,任意一方的修改都会立即同步,也就是说,当容器目录中的内容发生变化时,数据卷目录也会跟着变化;当数据卷目录中的内容发生变化时,容器内目录也会发生变化。

当然,一个数据卷可以被多个容器同事挂载;一个容器也可以被挂载多个数据卷.

4 如何配置数据卷

4.1 配置单个数据卷

创建启动容器时,使用 -v 参数设置数据卷

docker run -it -v /宿主机目录绝对路径:/容器内目录路径 --name="xx" 镜像名  —privileged=true

注意事项:

1)目录必须是绝对路径

2)如果目录不存在,会自动创建

3)一个容器可以挂载多个数据卷(一个“-v”挂载一个数据卷)

4)如果出现 cannot open directory:permission denied 时,需要多加一个 —privileged=true参数即可(有些系统里面可能会认为挂载目录时不安全的所以就被禁止了,而加入参数后会将这一限制打开)

案例如下

第一步,创建启动容器

docker run -it --privileged=true -v /Users/xxxxx/host_data:/tmp/docker_data --name=test1 13b66b487594
## /Users/xxxxx/host_data 表示宿主机绝对路径
## /tmp/docker_data 容器目录路径

第二步,确定容器是否开启成功

docker ps

第三步,查看数据卷是否挂在成功,输入如下命令

docker inspect 容器名
找到Mounts(表示挂载)信息,其中
type:bind  表示绑定型的
Source      表示宿主机路径
destination    表示容器内路径

在这里插入图片描述
上述过程就可以实现容器和宿主机之间数据共享啦。

  1. 当在容器目录内输入一些内容时,数据卷(宿主机目录)中的内容也会随即更新;当更新数据卷中的内容时,容器目录中的内容也会随即更新;这种方式也叫做映射。将容器目录映射到宿主机。
  2. 当容器被停止时,在宿主机中修改文件,当再进去容器时,文件也同样被修改。

4.2 配置多个数据卷

为一个容器配置多个数据卷

docker run -it -v /宿主机目录绝对路径1:/容器内目录路径1 -v /宿主机目录绝对路径2:/容器内目录路径2 -v /宿主机目录绝对路径3:/容器内目录路径3 -name="xx" 镜像名  —privileged=true

4.3 多个容器挂载同一个数据卷

执行命令

docker run -it -v /宿主机目录绝对路径:/容器内目录路径 --name="xx" 镜像名  —privileged=true
或者
docker run -it -v /宿主机目录绝对路径:/容器内目录路径 --name="xx" 镜像名 —privileged=true

案例详解

docker run -it -v /User/xxx/data:/data --name="demo1" ubuntu:14.04 —privileged=true

docker run -it -v /User/xxx/data:/data --name="demo2" ubuntu:14.04 —privileged=true

详细说明:当在容器demo1中更新目录内容时,数据卷 /User/xxx/data和 容器demo2中的内容会同步更新。

4.4 容器的数据卷

多容器间进行数据交换,有两种方式:

  • 多个容器挂载同一个数据卷(缺点:操作比较麻烦,因为当容器过多时,需要一个个的挂载)
  • 数据卷容器

相比,数据卷容器方式更胜一筹,同时数据卷容器也体现了数据卷的继承关系。

4.4.1 数据卷容器概念

见名知意,容器的数据卷,也可以称为数据卷容器或者容器卷,表示这个容器是用来共享数据的。

可以看下图,

  1. 在 c3 容器挂载了一个数据卷,
  2. c1 和 c2 容器再分别挂载到 c3 容器上,
  3. 这样 c1 和 c2 容器相当于挂载到了数据卷上,这样的话 c1、c2 c3 可以相互通信,即使 c3 挂了,c1 和 c2 也可以通过数据卷进行通信。

在这里插入图片描述

4.4.2 如何配置数据卷容器

第一步,创建启动 c3 数据卷容器,使用-v 参数设置数据卷

docker run -it -v /容器目录 —name="c3" 镜像名 /bin/bash
## /容器目录 表示当没有指定宿主机目录时,docker会自动分配

第二步,数据卷继承

docker run -it --name="c1" --volumes-from c3 镜像名
docker run -it --name="c2" --volumes-from c3 镜像名

案例详解

第一步,创建启动c3容器

docker run -it -v /volumes —name="c3" ubuntu:14.04 /bin/bash

进入c3 容器后,可看到有新增目录 volumes
在这里插入图片描述
此时再新建命令窗口输入命令

docker inspect 3d065763c8af

查看宿主机目录路径(数据卷路径)
在这里插入图片描述

第二步,分别创建启动 c1 和 c2 容器

docker run -it --name="c1" --volumes-from c3 ubuntu:14.04

docker run -it --name="c2" --volumes-from c3 ubuntu:14.04

##进入容器后,均会发现容器内有新增 volumes 目录,此时也可以输入命令 docker inspect c1,查看容器挂载信息

在这里插入图片描述
上述步骤即可实现容器间数据交换,当容器 c3 挂掉时,c1 和 c2 依然可正常数据交换。

4.5 读写规则映射添加说明

docker run -it -v /宿主机目录绝对路径:/容器内目录路径 --name="xx" 镜像名  —privileged=true
或者
docker run -it -v /宿主机目录绝对路径:/容器内目录路径:rw --name="xx" 镜像名  —privileged=true

当未添加 rw 参数时,默认数据卷是有可读可写权限。
如果给数据卷只读权限,则使用如下命令:

docker run -it -v /宿主机目录绝对路径:/容器内目录路径:ro --name="xx" 镜像名  —privileged=true

5 总结

数据卷是宿主机中的一个目录或文件。数据卷可使容器数据持久化;保持外部数据和容器间接通信;容器之间可数据交换;卷中的更改可以直接实时生效;数据卷中的更改不会包含在镜像的更新中;数据卷的生命周期一直持续到没有容器使用它为止;如果大家通过本篇文章了解了数据卷以及数据卷的配置,这将是本篇文章分享的意义。

如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,关于 Docker 数据的进阶篇,我可以为你提供以下内容: 1. 数据的类型 Docker 数据有三种类型:主机挂载、匿名、命名。其中,主机挂载是将主机上的目录挂载到容器中;匿名是在容器内部创建的临时;命名则是给起一个名字,并将其保存在 Docker 数据存储区中。 2. 数据的备份与恢复 我们可以使用 Docker Compose 中的 `docker-compose.yml` 文件来定义数据的备份和恢复。具体方法是,在 `volumes` 字段中定义及其备份路径,然后在 `services` 字段中指定容器和对应的名称。 例如: ``` version: "3" services: db: image: mysql volumes: - db_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password backup: image: backup volumes: - /path/to/backup:/backup - db_data:/data/db command: backup.sh volumes: db_data: ``` 以上代码中,我们定义了一个 `db` 服务和一个 `backup` 服务。其中,`db` 服务使用了名为 `db_data` 的命名,并挂载到容器的 `/var/lib/mysql` 目录中;`backup` 服务则使用了两个,一个是挂载到宿主机上的 `/path/to/backup` 目录,用于保存备份文件;另一个是使用了 `db_data` 命名,并挂载到容器的 `/data/db` 目录中,用于备份数据。最后,我们在 `backup` 服务中执行了备份脚本 `backup.sh`。 3. 数据的共享 我们可以将一个数据挂载到多个容器中,实现数据的共享。例如,我们可以将一个命名挂载到 `web` 和 `db` 两个服务中,这样它们就可以共享数据了。 ``` version: "3" services: web: image: nginx volumes: - web_data:/usr/share/nginx/html db: image: mysql volumes: - db_data:/var/lib/mysql - web_data:/var/www/html volumes: db_data: web_data: ``` 以上代码中,我们定义了一个 `web` 服务和一个 `db` 服务。其中,`web` 服务使用了名为 `web_data` 的命名,挂载到容器的 `/usr/share/nginx/html` 目录中;`db` 服务则使用了 `db_data` 和 `web_data` 两个,分别挂载到容器的 `/var/lib/mysql` 和 `/var/www/html` 目录中,实现了数据的共享。 希望以上内容能够对你有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小曾同学.com

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

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

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

打赏作者

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

抵扣说明:

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

余额充值