第二节:数据卷简介和配置数据卷及数据卷容器

一. 数据卷概念及作用

1. 背景

(1). Docker 容器删除后,在容器中产生的数据也会随之销毁,如何保持容器中的数据呢?

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

(3). 容器之间想要进行数据交互?

2. 概念

(1). 数据卷是宿主机(linux主机)中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。

PS:说白了,就是把容器中的一个目录和Linux主机中第一个目录绑定起来,然后再任何一方修改,另外一方可以同步。

   绑定后,可以不需要进入容器内部,就可以查看所需要的容器中的数据。

(2). 一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。

3. 作用

(1). 容器数据持久化

(2). 外部机器和容器间接通信

(3). 容器之间数据交换

 

二. 配置数据卷

1. 目的

 解决容器数据的持久化;

 实现容器和外部机器间的通信。

2. 指令

【docker run  ....  -v 宿主机目录:容器目录 .......】

注: 目录必须是绝对路径,路径如果不存在会自动创建,可以同时挂载多个目录。

(也可以省略宿主机目录,宿主机目录会自行分配一个目录: 【docker run ....  -v 容器目录....】 不推荐! 都存放在宿主机的 /var/lib/docker/volumes目录下)---案例2

挂载单个目录的指令:

docker run -id --name=xxx -v /xxx/xx:/xx/xxxx <imageName>

挂载多个目录的指令:  \代表换行

docker run -id --name=xxx\
-v /xxxx1:/xxxxx1 \
-v /xxxx2:/xxxxx2 \
-v /xxxx3:/xxxxx3 \
<imageName>

 

3. 案例1-指定宿主机目录

新建一个mycentos1容器,将容器内工作目录下的mycontainerdata1 和 Linux宿主机工作目录下的mydata1进行挂载,查看数据同步情况。

A. 运行指令:

[ docker run -id --name=mycentos1 -v /root/mydata1:/root/mycontainerdata1 centos ]

B. 在宿主机目录上新建一个文件夹,然后去容器中查看,同样存在。

【touch 1.txt】

C. 查看容器情况:

运行【docker inspect mycentos1】 ,查看Mounts节点,宿主机和容器的挂载目录对应关系

D. 将该容器删除【docker rm -f mycentos1】

    重新运行 [docker run -id --name=mycentos1 -v /root/mydata1:/root/mycontainerdata1 centos ]

    进入容器 【docker exec -it mycentos1 bash】

    查看文件 【cd root/mycontainerdata1】

发现之前的 1.txt文件还在,容器内的数据又恢复了。

 

4. 案例2-不指定宿主机目录

新建一个mycentos2容器,将容器内工作目录下的mycontainerdata与宿主机的目录进行绑定。

A. 运行指令

【docker run -id --name=mycentos2 -v /root/mycontainerdata centos】

B. 查看容器匹配的宿主机目录

运行【docker inspect mycentos2】 ,查看Mounts节点,宿主机和容器的挂载目录对应关系

C. 去绑定的宿主机目录中创建一个文件

【cd /var/lib/docker/volumes/95aa66b9317067c2bc599f7e513d0642e157899751b20f3ee18c8b7843bc64c4/_data/】

【touch 1.txt】

D. 将该容器删除【docker rm -f mycentos2】

    重新运行 [docker run -id --name=mycentos2 -v /root/mycontainerdata centos ]

    进入容器 【docker exec -it mycentos2 bash】

    查看文件 【cd root/mycontainerdata】

没有文件

原因剖析:

   在不指定宿主机目录的情况下,每次build一个容器,都会在宿主机下 /var/lib/docker/volumes/ 目录中,随机生成一个目录,每次生成的都不一样,所以无法找到上次的文件。

运行指令【docker volume ls】 发现有多个数据卷

同理,直接查看目录【ls /var/lib/docker/volumes

 

3. 案例3-指定宿主机多个目录

新建一个mycentos3容器,将容器内工作目录下的mycontainerdata1、mycontainerdata2、mycontainerdata2 分别和Linux宿主机工作目录下的mydata1、mydata2、mydata3进行挂载。

运行指令:\代表换行

docker run -id --name=mycentos3 \
-v /root/mydata1:/root/mycontainerdata1 \
-v /root/mydata2:/root/mycontainerdata2 \
-v /root/mydata3:/root/mycontainerdata3 \
centos

查看容器情况:

 

 

 

 

三. 配置数据卷容器

1. 如何实现多个容器间的数据交互?

方案1:

  创建每个容器的时候都与宿主机指定相同的挂在目录即可。(相对麻烦,每创建一个容器,都要指定相互绑定的路径

方案2:(推荐!!!)

  先创建一个数据卷容器(即这个容器和宿主机进行目录的绑定),后面新建的容器创建的时候都 ‘继承’ 这个容器,这样就可以实现了所有容器的: 容器内目录和宿主机目录绑定关系是相同。

2. 指令

(1). 先创建1个数据卷容器

docker run -id --name=c1 -v /xxx/xx:/xx/xxxx <imageName>

(2). 后面的容器都继承这个数据卷容器 (关键字:--volumes-from)

docker run -id --name=c2 --volumes-from c1 <imageName>
docker run -id --name=c3 --volumes-from c1 <imageName>
docker run -id --name=c4 --volumes-from c1 <imageName>

3.案例

 新建4个容器,分别是c1、c2、c3、c4,四个容器间可以实现数据共享。

(1). 运行指令:

【docker run -id --name=c1 -v /root/mydata:/root/mycontainerdata centos】

【docker run -id --name=c2 --volumes-from c1 centos】

【docker run -id --name=c3 --volumes-from c1 centos】

【docker run -id --name=c4 --volumes-from c1 centos】

(2). 在宿主机中创建一个文件,然后随机进入一个容器查看,比如进入c3容器。

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

 

posted @   Yaopengfei  阅读(671)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2017-09-05 01-Unity深入浅出(一)
点击右上角即可分享
微信分享提示