前言:
😄作者简介:小曾同学.com,小伙伴们也可以叫我小曾,一个致力于测试开发的博主⛽️
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊
座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍
文章目录
1 写在前面
前段时间给小伙伴们分享了 Docker 相关理论介绍及基本命令的详解,今天主要想给大家分享 Docker 数据卷及其配置。
在开始分享之前先抛出三个小问题:
-
Docker 容器
删除后,在容器中产生的数据
还在吗? -
Docker 容器
和外部机器
可以直接交换文件吗? -
容器之间
怎么进行数据交互
?
以上的三个问题都可以使用数据卷
来解决,那什么是数据卷呢,接下来正式开启本篇内容。
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 表示容器内路径
上述过程就可以实现容器和宿主机之间数据共享啦。
- 当在容器目录内输入一些内容时,数据卷(宿主机目录)中的内容也会随即更新;当更新数据卷中的内容时,容器目录中的内容也会随即更新;这种方式也叫做映射。将容器目录映射到宿主机。
- 当容器被停止时,在宿主机中修改文件,当再进去容器时,文件也同样被修改。
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 数据卷容器概念
见名知意,容器的数据卷,也可以称为数据卷容器
或者容器卷
,表示这个容器是用来共享数据
的。
可以看下图,
- 在 c3 容器挂载了一个数据卷,
- c1 和 c2 容器再分别挂载到 c3 容器上,
- 这样 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 总结
数据卷
是宿主机中的一个目录或文件。数据卷可使容器数据持久化;保持外部数据和容器间接通信;容器之间可数据交换;卷中的更改可以直接实时生效;数据卷中的更改不会包含在镜像的更新中;数据卷的生命周期一直持续到没有容器使用它为止;如果大家通过本篇文章了解了数据卷以及数据卷的配置,这将是本篇文章分享的意义。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍