Docker数据卷管理

本文介绍了Docker数据卷的管理,包括bind mount和docker managed volume的对比及使用示例。重点讲解了Docker卷插件,特别是Convoy插件,展示了如何通过NFS实现跨主机的volume共享,并详细阐述了Convoy的安装和使用过程,从而实现不同主机间的共享存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

docker数据卷

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

docker数据卷提供两种卷

  • bind mount

      是将主机上的目录或文件mount到容器里。
      使用直观高效,易于理解。
      使用 -v 选项指定路径,格式 <host path>:<container path>
      bind mount 默认权限是读写rw,可以在挂载时指定只读ro。
      -v选项指定的路径,如果不存在,挂载时会自动创建。
    
  • docker managed volume

      bind mount必须指定host文件系统路径,限制了移植性。
      docker managed volume 不需要指定mount源。
    

bind mount与docker managed volume对比

  • 相同点:两者都是 host 文件系统中的某个路径。
  • 不同点:
    在这里插入图片描述

bind mount卷示例

1.创建容器

[root@server1 ~]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/yum.repo:/yum.repo:ro ubuntu
data1目录为默认权限,data2和yum.repo为只读

2.测试挂载的目录权限
在这里插入图片描述

docker managed volume

1.查看现有的管理卷

[root@server1 ~]# docker volume ls
DRIVER              VOLUME NAME

2.我们有些是时候在删除了容器后会有残存的管理卷存在,这是我们就需要去清理它,不然会占用我们的资源

[root@server1 ~]# docker volume prune 
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

下面我们需要用到我们之前搭的个人仓库

[root@server1 ~]# docker run -d --name registry registry:2 
c6527d664e95c32816b12c0121f982720c9734b77c512a290ed1257791c20ee3

3.然后我们查看管理卷
在这里插入图片描述
4.查看registry的相关信息

[root@server1 ~]# docker inspect registry
[root@server1 ~]# docker inspect registry | grep Source
            "Source": "/var/lib/docker/volumes/b96d7c708a1f4458430407c71abeb429a2194bad54508ee80da0e6e93ef9e1ef/_data",
source就是volume在host中的目录,是docker自动为容器生成的目录,如果
挂载时指向的已有目录,原有数据会被复制到volume中。
注意,即使删除容器,管理卷也不会删除。

在这里插入图片描述
我们会发现,docker自动生成的目录名称会很长,不方便书写使用。我们可以在创建容器时自己定义目录名称。
在这里插入图片描述
查看管理卷目录:
在这里插入图片描述

同样,我们也可以先创建管理卷,再创建目录时指定该目录为容器的管理卷
在这里插入图片描述
创建容器并将管理卷挂载到容器内的指定目录:

[root@server1 ~]# docker run -d --name registry2 -v vol1:/var/lib/registry registry:2
c9d0c376b1ca0c29e10d9f0f50d6fea54b14244dd02626f5d7abcdb54d0cc45b
[root@server1 ~]# docker inspect registry2  | grep Source
             "Source": "/var/lib/docker/volumes/vol1/_data",

Docker卷插件

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

在这里插入图片描述

  • Docker Plugin 是以Web Service的服务运行在每一台Docker Host上的,
    通过HTTP协议传输RPC风格的JSON数据完成通信。
  • Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省
    路径下查找Unix Socket文件,自动发现可用的插件。
  • 当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后
    端找到插件对应的 socket 文件,建立连接并发起相应的API请求,最
    终结合Daemon自身的处理完成客户端的请求。

convoy卷插件

convoy卷插件支持三种运行方式:devicemapper、NFS、EBS。,我们下面的实验以nfs的运行方式来演示

1.首先在server1和server2上搭建nfs文件系统

server1:

[root@server1 ~]# yum install -y nfs-utils	安装
[root@server1 ~]# systemctl start rpcbind	
[root@server1 ~]# mkdir /mnt/nfs	创建共享目录
[root@server1 ~]# chmod 777 /mnt/nfs	修改共享目录权限
[root@server1 ~]# vim /etc/exports	编辑共享目录文件,否则将不会被共享出去
[root@server1 ~]# cat /etc/exports
/mnt/nfs	*(rw,no_root_squash)
[root@server1 ~]# systemctl start nfs

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

server2:

[root@server2 ~]# yum install -y nfs-utils
[root@server2 ~]# systemctl start nfs-server.service 
[root@server2 ~]# showmount -e 172.25.66.1		寻找server1的挂载目录
Export list for 172.25.66.1:
/mnt/nfs *
[root@server2 ~]# mkdir /mnt/nfs		创建挂载目录
[root@server2 ~]# mount 172.25.66.1:/mnt/nfs/ /mnt/nfs/
[root@server2 ~]# df
Filesystem            1K-blocks    Used Available Use% Mounted on
/dev/mapper/rhel-root  20240384 1794232  18446152   9% /
devtmpfs                 497244       0    497244   0% /dev
tmpfs                    508264       0    508264   0% /dev/shm
tmpfs                    508264   13108    495156   3% /run
tmpfs                    508264       0    508264   0% /sys/fs/cgroup
/dev/sda1                201380  119172     82208  60% /boot
tmpfs                    101656       0    101656   0% /run/user/0
172.25.66.1:/mnt/nfs   20240384 2876928  17363456  15% /mnt/nfs

测试:

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

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

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

[root@server1 ~]# ls
busybox.tar    distroless.tar  game2048.tar  rhel7.tar
convoy.tar.gz  docker          nginx.tar     ubuntu.tar
[root@server1 ~]# tar zxf convoy.tar.gz 
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
convoy  convoy-pdata_tools  SHA1SUMS
[root@server1 convoy]# cp convoy* /usr/local/bin/  将二进制文件加入到PATH路径
[root@server1 convoy]# mkdir /etc/docker/plugins	创建docker的插件目录
[root@server1 ~]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &> /dev/null &
[1] 8677
值的注意的是:第一次运行上面的convoy daemon命令的时候,会在/mnt/nfs目录下生成一个config文件夹,这个文件夹不要删除,不然客户端的convoy命令就会用不了
[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls
config  file
[root@server1 nfs]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
将convoy守护进程开启生成的.sock文件放入/etc/docker/plugins目录下的convoy.spec文件中,docker就可以识别。(其中convoy.spec文件之前是不存在的)
[root@server1 nfs]# cat /etc/docker/plugins/convoy.spec
unix:///var/run/convoy/convoy.sock

3.创建卷

[root@server1 nfs]# docker volume ls
DRIVER              VOLUME NAME
[root@server1 nfs]# convoy create vol1
vol1
[root@server1 nfs]# ll
total 0
drwx------ 2 root root 34 Jun 12 05:18 config
-rw-r--r-- 1 root root  0 Jun 12 04:52 file
drwx------ 2 root root  6 Jun 12 05:18 vol1

4.将解压convoy目录给server2复制一份,配置convoy环境

[root@server1 ~]# scp -r convoy server2:
root@server2's password: 
convoy-pdata_tools                            100%   22MB  22.0MB/s   00:00    
convoy                                        100%   19MB  19.5MB/s   00:00    
SHA1SUMS                                      100%  124     0.1KB/s   00:00  

[root@server2 ~]# cd convoy/
[root@server2 convoy]# cp convoy* /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 &> /dev/null &
[1] 13412
[root@server2 convoy]# cd /mnt/nfs/
[root@server2 nfs]# ls
config  file  vol1

5。操作卷
列出所有卷
在这里插入图片描述
创建卷,之前已经创建过了

使用卷
在这里插入图片描述
在这里插入图片描述
由上可知server1和server2上看到的内容一致,即不同主机间实现了共享存储。
convoy卷的快照

[root@server1 vol1]# convoy snapshot create vol1 --name vol1_pic
vol1_pic
--name前面的是卷名,加个--name起个名字,不然会是数字

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值