docker的数据卷与数据卷容器

实验环境:
1.Linux系统:CentOS7.6
2.docker:Docker version 19.03.7
3.镜像准备:centos镜像

PS:拉取centos命令:
docker pull centos

一、数据卷

1.命令方式添加

(1)在宿主机创建好需要挂载数据卷的目录,然后运行容器
创建宿主机目录

mkdir /root/masterFile

新建容器,将数据卷/containerFile 挂载到宿主机目录/root/masterFile

docker run -it -d --name mycentos -v /root/masterFile:/containerFile centos

参数解析: run:新建并启动容器
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
–name:自定义容器名字
-v:挂载数据卷
centos:镜像名字(也此处可以换成镜像ID)

(2)查看数据卷是否挂载成功

命令格式:docker inspect 容器ID/容器名字

docker inspect mycentos

在这里插入图片描述

(3)上诉操作成功后,宿主机目录与容器目录实现了内容同步。即便容器停止重启,仍然可以读取同步到宿主机目录的内容
在宿主机目录新增并修改文件

touch /root/masterFile/test01.txt
vim /root/masterFile/test01.txt

随便输入点内容
在这里插入图片描述
回到容器内,查看数据卷内容

docker exec -it mycentos /bin/bash
cat /containerFile/test01.txt

在这里插入图片描述
在容器内数据卷下修改test01.txt,新增一行:bbbbbb

vi /containerFile/test01.txt

在这里插入图片描述
回到宿主机,查看宿主目录下的内容

PS:在容器内,按Ctrl+p+q可以退出到宿主机终端

cat /root/masterFile/test01.txt 

在这里插入图片描述

(4)设置带权限的数据卷(宿主目录提前建好)

docker run -it -d --name mycentos2 -v /root/masterFile2:/containerFile2:ro centos

PS:这样方式启动的容器,里面的数据卷目录是只读的,在容器内无法更改。实验可以参照上述(3)步骤实验

touch /root/masterFile2/test02.txt
vim /root/masterFile2/test02.txt

在这里插入图片描述

docker exec -it mycentos2 /bin/bash
cat /containerFile2/test02.txt

在这里插入图片描述
下面尝试修改test02.txt,看能否同步到宿主机目录

vi /containerFile2/test02.txt

在这里插入图片描述
在编辑完后,:wq准备退出文档时候报错,表示改文件是只读,无法修改
在这里插入图片描述

2.DockerFile方式添加

(1)新建一个文件mydockerfile

mkdir /root/dockerFile
touch /root/dockerFile/mydockerfile
vim /root/dockerFile/mydockerfile

拷贝以下内容

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash

其中
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
表示该镜像的容器默认会创建这两个数据卷

(2)用build命令生成镜像

docker build -f /root/dockerFile/mydockerfile -t mycentos .

-f:指明创建镜像依赖的dockerfile文件
-t:命名镜像名
.:表示在当前目录下面

在这里插入图片描述
(3)用自定义带容器卷的镜像新建并启动容器

docker run -it --name newcentos mycentos

PS:这样不带-d参数新建启动后,会进入到容器内部

在这里插入图片描述
(4)查看数据卷所对应的宿主机目录地址:

命令格式:docker inspect 容器ID/容器名字

docker inspect newcentos

在这里插入图片描述

亲测发现:

  1. 随机生成的宿主机目录在/var/lib/docker/volumes/下
  2. 这里容器卷所挂载的宿主机目录,在容器删除之后并不会被删除!!
  3. 由于第2点原因,建议删除容器后,删除随机生成的对应目录,因为一般情况下不会用命令形式挂载这个目录到数据卷

二、数据卷容器

1.利用上述建立的mydockerfile文件为模版创建的mycentos镜像创建一个容器demo1

docker run -itd --name demo1 mycentos #以mycentos镜像,后台启动一个容器,名为demo1

由于mydockerfile文件里设置了容器卷,所以mecentos镜像创建出来的容器默认有这两个容器卷:
/dataVolumeContainer1
/dataVolumeContainer2

docker exec -it demo1 /bin/bash #进入demo1容器

在这里插入图片描述

2.以demo1为父容器,创建demo2、demo3容器,并且demo2和demo3都分别在容器卷内增加自己的文件

docker run -itd --name demo2 --volumes-from demo1 mycentos #以demo1为父容器,创建容器demo2
docker run -itd --name demo3 --volumes-from demo1 mycentos #以demo1为父容器,创建容器demo3

在这里插入图片描述
在demo2、demo3容器的数据卷里添加文件,并回到demo1中查看对应数据卷

以交互式进入容器的命令:

docker exec -it demo1 /bin/bash
docker exec -it demo2 /bin/bash
docker exec -it demo3 /bin/bash

添加文件的命令:

touch demo2_001.txt
touch demo3_001.txt

在这里插入图片描述
结论:发现三个容器(demo1、demo2、demo3)共享这两个数据卷目录

PS:可以通过下面三个命令查看3个容器的两个容器卷挂载在宿主机的哪个目录,会发现都是相同的两个目录,所以3个容器的容器卷可以同步数据

docker inspect demo1
docker inspect demo2
docker inspect demo3

在这里插入图片描述

3.删除容器demo1,demo2修改容器卷后,demo3仍能共享容器卷内文件(自行操作)

4.以demo3为父容器,新建demo4容器。删除demo3容器之后,demo4容器仍能共享容器卷内文件(自行操作)

5.总结:

  • 要共享容器卷,要以某个容器为父容器,以该父容器的镜像为镜像,用–volumes-from参数创建新容器。这样创建后的容器共享父容器的容器卷
  • 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
  • 如果容器之间没有继承关系,则每个容器的容器卷会随机挂载宿主机不同目录。
  • 容器卷所挂载的宿主机目录,在容器删除之后并不会被删除!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

强强爱java

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

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

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

打赏作者

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

抵扣说明:

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

余额充值