Docker卷管理

一.概念讲解

1.docker数据卷

  • 数据卷是目录或文件,不是块设备。
  • 容器可以读写volume中的数据。
  • volume数据可以持久化保存。

2.docker提供了两种卷:

  • bind mount
  • docker managed volume

3.bind mount

  • 是将主机上的目录或文件mount到容器里。

  • 使用直观高效,易于理解。

  • 使用 -v 选项指定路径,格式 :

  • bind mount 默认权限是读写rw,可以在挂载时指定只读ro。

  • -v选项指定的路径,如果不存在,挂载时会自动创建。

4.bind mount与docker managed volume对比

  • 相同点:两者都是 host 文件系统中的某个路径。

  • 不同点:
    在这里插入图片描述

二.bind mount volume

前提:
在做实验之前,最好将环境都清理干净(删除容器并删除之前做实验的网络)

在这里插入图片描述在这里插入图片描述
实验:
1.在server1中先编写一个文件,用于之后实验

[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# ls
[root@server1 yum.repos.d]# vim dvd.repo
[root@server1 yum.repos.d]# cat dvd.repo

文件中的内容如下:

[rhel7.3]
name=rhel7.3
baseurl=http://172.25.12.250/rhel7.3
gpgcheck=0

在这里插入图片描述
2.创建一个容器,创建目录和将文件复制并设置容器内对文件的权限

#使用-v选项指定路径

[root@server1 ~]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/dvd.repo:ro ubuntu

在这里插入图片描述
#查看文件时,发现可以查看,但是无法进行编辑(W10: Warning: Changing a readonly file)

root@bc761f258e97:/# ls         
root@bc761f258e97:/# vi dvd.repo 

在这里插入图片描述

#进入目录后,发现可以查看目录下的内容以及在此目录下创建文件,如果在data1内的文件写内容,文件会被覆盖掉

root@bc761f258e97:/# cd data1/
root@bc761f258e97:/data1# ls
root@bc761f258e97:/data1# touch file1 
root@bc761f258e97:/data1# ls

在这里插入图片描述
#进入目录/data2后,发现可以查看目录下的内容,但是无法在此目录下创建文件

root@bc761f258e97:/data1# cd ../data2/
root@bc761f258e97:/data2# touch file2
root@bc761f258e97:/data2# ls

在这里插入图片描述

注意:
1.容器创建的第一个目录在server1中是/tmp/data1,不设置容器中对此文件的权限,第二个目录在server1中是/tmp/data2,设置其权限为容器只读,第三个文件则是/etc/yum.repos.d/dvd.repo,设置其权限为容器只读。
2.如果在server1中没有文件,那么系统会默认根据命令中的路径创建新的文件,以便于容器可以访问
3.数据管理卷的路径都在此目录下/var/lib/docker/volumes/

三.docker managed volume

(一)生成数据管理卷

1.清除没有容器使用的管理卷

[root@server1 ~]# docker volume ls
[root@server1 ~]# docker volume prune
[root@server1 ~]# docker volume ls

在这里插入图片描述

2.创建registry容器并查看数据管理卷,会发现系统自动生成了一个管理卷

[root@server1 ~]# docker run -d --name registry registry:latest 
[root@server1 ~]# docker volume ls

在这里插入图片描述
3.查看registry的相关信息,会发现该容器的数据管理卷是自动生成的

[root@server1 ~]# docker inspect registry

在这里插入图片描述
在这里插入图片描述
注意:
source为管理卷在宿主机的目录,是docker为容器自动生成的目录,如果挂载时不指定目录,容器内挂载目录的原有数据会复制到宿主机的该目录中(如果挂载时指向的已有目录,原有数据会被复制到volume中。)

4.证明:当删除容器时,该容器的数据管理卷也不会删除

[root@server1 ~]# docker rm -f registry 
[root@server1 ~]# docker volume ls

在这里插入图片描述

5.证明:只有手动将管理卷删除,该容器的数据管理卷才会被删除

[root@server1 ~]# docker volume rm 3c3d3566af6dbb3537b122559166d45b78738d9228e63a8907129d57916fe100

[root@server1 ~]# docker volume ls

在这里插入图片描述
(二)生成数据管理卷并设置其目录名称

由上述实验可以得知,该数据管理卷的目录名称很长,不方便查看,所以下面我们将设置其目录名称方便实验
1.创建容器并设置管理卷目录名称,然后查看管理卷

[root@server1 ~]# docker run -d --name registry -v registry:/var/lib/registry registry:latest
[root@server1 ~]# docker volume ls

在这里插入图片描述
2.查看registry的相关信息,会发现管理卷的名称更改成我们设置的了

[root@server1 ~]# docker inspect registry

在这里插入图片描述
在这里插入图片描述
(三)先创建数据管理卷,再指定该目录为容器的数据管理卷

1.先创建两个数据管理卷

[root@server1 ~]# docker volume create vol1
[root@server1 ~]# docker volume create vol2
[root@server1 ~]# docker volume ls

在这里插入图片描述

2.将之前的registry容器删除

[root@server1 ~]# docker ps
[root@server1 ~]# docker rm -f registry 

在这里插入图片描述

3.创建一个容器并设置将刚才创建的管理卷vol1挂载到容器内的指定位置,然后查看容器管理卷的路径

[root@server1 ~]# docker run -d --name registry -v vol1:/var/lib/registry registry:latest 
[root@server1 ~]# docker inspect registry

在这里插入图片描述在这里插入图片描述

4.再创建一个容器并将管理卷vol2挂载到指定目录下,此时也可以设置容器权限为只读

[root@server1 ~]# docker run -it --name vm2 -v vol2:/data:ro ubuntu
root@a1fa8c0e2d10:/# cd data/
#此处查看到的file1是在宿主机中就有的文件
root@a1fa8c0e2d10:/data# ls    
root@a1fa8c0e2d10:/data# touch file1

在这里插入图片描述
注意:
1.bind mount 默认权限是读写rw,可以在挂载时指定只读ro。
2.-v选项指定的路径,如果不存在,挂载时会自动创建。
3.bind mount必须指定host文件系统路径,限制了移植性。
4.docker managed volume 不需要指定mount源。
四.卷插件–convoy卷的实现

  • docker 卷默认使用的是local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动,可以查看一链接: https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins

  • docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。https://docs.docker.com/engine/extend/plugins_volume#volume-plugin-protocol

  • Docker Plugin 是以Web Service的服务运行在每一台Docker Host上的,通过HTTP协议传输RPC风格的JSON数据完成通信。

在这里插入图片描述

  • Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省路径下查找Unix
    Socket文件,自动发现可用的插件。
  • 当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的 socket
    文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。
  • convoy卷插件实现 (1)支持三种运行方式:devicemapper、NFS、EBS。 (2)以下实验使用nfs方式。
    (3)下载软件:
    https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz
    (4)在所有节点提前挂载NFS存储。

实验:
(一)搭建nfs文件系统

1.在server1中搭建nfs文件系统

#下载nfs对应的软件
[root@server1 ~]# yum install nfs-utils -y
#启动相关服务
[root@server1 ~]# systemctl start rpcbind
#创建共享目录并设置权限,否则别的主机可能无法成功访问
[root@server1 ~]# mkdir /mnt/nfs
[root@server1 ~]# chmod 777 /mnt/nfs
#编辑此文件,指定要贡献的文件及权限
[root@server1 ~]# vim /etc/exports
文件/etc/exports中的内容如下:
/mnt/nfs	*(rw,no_root_squash)

#开启nfs服务
[root@server1 ~]# systemctl start nfs
#查看nfs服务器共享出来的资源,此处查看的是本机的
[root@server1 ~]# showmount -e localhost
文件/etc/exports中的内容如下:
/mnt/nfs	*(rw,no_root_squash)

在这里插入图片描述

在这里插入图片描述
注意:rpcbind服务必须是开启的。因为:他是一个RPC服务,主要是在nfs共享时候负责通知客户端,服务器的nfs端口号的。简单理解rpc就是一个中介服务

2.在server2中搭建nfs文件系统

[root@server2 ~]# yum install nfs-utils -y
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]# systemctl start rpcbind
[root@server2 ~]# systemctl start nfs
[root@server2 ~]# showmount -e 172.25.12.1
#将172.25.12.1上的/mnt/nfs挂载到本机的/mnt/nfs目录下并进行查看
[root@server2 ~]# mount 172.25.66.1:/mnt/nfs /mnt/nfs
[root@server2 ~]# df

在这里插入图片描述在这里插入图片描述

3.测试nfs环境是否成功搭建
(1)在server2中进入共享目录并尝试创建一个文件

[root@server2 ~]# cd /mnt/nfs
[root@server2 nfs]# ls
[root@server2 nfs]# touch file
[root@server2 nfs]# ls

在这里插入图片描述

(2)在srver1中查看发现在server2中创建的文件在共享目录下可以成功看到

[root@server1 ~]# cd /mnt/nfs
[root@server1 nfs]# ls

在这里插入图片描述
(二)配置convoy环境并实现convoy卷

1.将之前的容器都删除

[root@server1 nfs]# docker ps
[root@server1 nfs]# docker rm -f vm3
[root@server1 nfs]# docker rm -f vm2
[root@server1 nfs]# docker rm -f vm1
[root@server1 nfs]# docker rm -f registry 
[root@server1 nfs]# docker ps -a

在这里插入图片描述

2.将压缩包进行解压(可以在官网上下载https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz),并将二进制文件复制到PATH路径下

[root@server1 ~]# tar zxf convoy.tar.gz 
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
[root@server1 convoy]# cp convoy* /usr/local/bin/
[root@server1 convoy]# cd /usr/local/bin/
[root@server1 bin]# ls
[root@server1 bin]# cd

在这里插入图片描述

3.创建docker的卷插件目录并将convoy守护进程开启生成的.sock文件放入/etc/docker/plugins目录下的convoy.spec文件中,docker就可以识别。(其中convoy.spec文件之前是不存在的)

[root@server1 ~]# mkdir /etc/docker/plugins
[root@server1 ~]# cd /etc/docker/plugins/
[root@server1 plugins]# ls
[root@server1 plugins]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server1 plugins]# cat convoy.spec 

在这里插入图片描述

4.第一次运行convoy daemon命令的时候,会在/mnt/nfs目录下生成一个config文件夹,这个文件夹不要删除,不然客户端的convoy命令就会用不了

[root@server1 plugins]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
[root@server1 plugins]# cd /mnt/nfs
[root@server1 nfs]# ls

在这里插入图片描述
在这里插入图片描述
5.在server1中创建一个卷vol1并在/mnt/nfs目录下查看

[root@server1 ~]# cd /mnt/nfs
[root@server1 nfs]# convoy create vol1
[root@server1 nfs]# ls

在这里插入图片描述

6.将server1中convoy中的内容传给server2

[root@server1 ~]# ls
[root@server1 ~]# scp -r convoy server2:

在这里插入图片描述

7.在server2中配置convoy环境

[root@server2 ~]# ls
[root@server2 ~]# cd convoy/
[root@server2 convoy]# ls
[root@server2 convoy]# cp convoy convoy-pdata_tools /usr/local/bin/
[root@server2 convoy]# mkdir /etc/docker/plugins/
[root@server2 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server2 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &

在这里插入图片描述

8.在server2中查看共享目录,发现可以查看到在server1中创建的

[root@server2 convoy]# cd /mnt/nfs
[root@server2 nfs]# ls
config  file  vol1
[root@server2 nfs]# cd vol1/
[root@server2 vol1]# ls

在这里插入图片描述

(三)操作卷(使用卷)

1.列出所有卷的信息

[root@server2 vol1]# convoy list

在这里插入图片描述

2.创建容器并将vol挂载在容器的data目录下

[root@server1 ~]# docker run -it --name vm1 -v vol1:/data --volume-driver=convoy ubuntu

在这里插入图片描述

3.在容器的data目录下创建10个文件

   root@55c7fca26021:/# ls
root@55c7fca26021:/# cd data/
root@55c7fca26021:/data# ls
root@55c7fca26021:/data# touch file{1..10}
root@55c7fca26021:/data# ls
root@55c7fca26021:/data# [root@server1 ~]# 

在这里插入图片描述

4.在/mnt/nfs/vol1目录下查看,发现可以成功查看到在容器内创建的文件

[root@server1 ~]# cd /mnt/nfs
[root@server1 nfs]# ls
[root@server1 nfs]# cd vol1/
[root@server1 vol1]# ls

在这里插入图片描述

5.在server2中也创建一个容器并将vol1挂载在容器的data目录下

[root@server2 ~]# docker run -it --name vm1 -v vol1:/data --volume-driver=convoy ubuntu

在这里插入图片描述
6.在容器中删除3个文件

root@c6bb77d5a166:/# ls
root@c6bb77d5a166:/# cd data/
root@c6bb77d5a166:/data# ls
root@c6bb77d5a166:/data# rm -rf file[345]
root@c6bb77d5a166:/data# ls

在这里插入图片描述

7.在server1中的/mnt/nfs/vol1目录下查看文件,发现文件被删除

[root@server1 vol1]# ls

在这里插入图片描述

8.在server1中连接vm1,此时发现在容器内的文件也被删除了,因为vol1挂载在了容器的data目录下,在server2中通过nfs文件系统进行更改,后来又在server1中通过挂载从而更改了vm1中的信息

[root@server1 vol1]# docker attach vm1
root@55c7fca26021:/data# 
root@55c7fca26021:/data# ls

四)创建卷快照

创建一个名为vol1_pic的快照卷,原卷是vol1

[root@server1 ~]# convoy snapshot create vol1 --name vol1_pic
[root@server1 ~]# convoy list

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值