docker数据卷管理

本文介绍了docker数据卷,它是目录或文件,数据可持久化。docker提供bind mount和docker managed volume两种卷,阐述了两者异同及使用方法。还介绍了convoy卷插件,包括搭建nfs文件系统、配置convoy环境、操作卷等,实现了不同主机间的共享存储。

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

docker数据卷

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

docker提供了两种卷:

  • bind mount
  • docker managed volume

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

不同点:

/bind mountdocker managed volume
volume位置可任意指定/var/lib/doker/volumes/…
对已有mount point影响隐藏并替换为volume原有数据复制到volume
是否支持单个文件支持不支持,只能是目录
权限控制可设置为只读,默认是读写权限无控制,均为读写权限
移植性移植性弱,与host path绑定移植性强,无需指定host目录

一、实验环境(rhel7.3版本)

  • selinux和firewalld状态为disabled
  • docker1(安装好docker) 172.25.70.1
  • docker2(安装好docker) 172.25.70.2
    二、bind mount卷

是将主机上的目录或文件mount到容器里。
使用直观高效,易于理解。
使用 -v 选项指定路径,格式 :

注意:
bind mount 默认权限是读写rw,可以在挂载时指定只读ro,-v选项指定的路径,如果不存在,挂载时会自动创建
示例:

创建容器:
[root@docker1 ~]# 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
root@2e97a5f499b9:/# ls

测试几个目录及文件的权限
在这里插入图片描述
三、docker managed volume

docker managed volume
bind mount必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源
跨主机的volume就需要使用第三方的驱动:https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins

查看现有管理卷
[root@docker1 ~]# docker volume ls

在这里插入图片描述
清除没有容器使用的管理卷

[root@docker1 ~]# docker volume prune

在这里插入图片描述
下面的实验会用到registry镜像:

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

再次查看数据管理卷:发现生成了一个管理卷

[root@docker1 ~]# docker volume ls

在这里插入图片描述
查看registry的相关信息:

[root@docker1 ~]# docker inspect registry

在这里插入图片描述
Source为管理卷在宿主机的目录,是docker为容器自动生成的目录,如果挂载时不指定目录,容器内挂载目录的原有数据会复制到宿主机的该目录中。注意,即使删除容器,管理卷也不会删除。
在这里插入图片描述
我们会发现,docker自动生成的目录名称会很长,不方便书写使用。我们可以在创建容器时自己定义目录名称。

[root@docker1 ~]# docker run -d --name registry -v registry2:/var/lib/registry registry:2
[root@docker1 ~]# docker volume ls

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

#创建名为vol1的管理卷
[root@docker1 ~]# docker volume create vol1
vol1
[root@docker1 ~]# docker volume ls
DRIVER              VOLUME NAME
local               registry2
local               vol1

创建容器并将管理卷挂载到容器内的指定目录:

[root@docker1 ~]# docker run -d --name registry2 -v vol1:/var/lib/registry registry:2
[root@docker1 ~]# docker inspect registry2 | grep Source

在这里插入图片描述
新建管理卷,创建容器时挂载管理卷可以指定目录读写权限:

[root@docker1 ~]# docker volume create vol2
[root@docker1 ~]# docker volume ls
[root@docker1 ~]# docker run -it  --name registry3 -v vol2:/data:ro ubuntu
root@a17cc887cdf0:/# cd data/
root@a17cc887cdf0:/data# touch file
root@a17cc887cdf0:/data# exit
[root@docker1 ~]# docker inspect registry3 | grep Source

在这里插入图片描述
四、convoy卷插件
1、首先在server1和server2主机搭建nfs文件系统

  • docker1:
#安装nfs服务对应的软件
[root@docker1 ~]# yum install -y nfs-utils.x86_64
#启动相关服务	
[root@docker1 ~]# systemctl start rpcbind
#创建共享目录
[root@docker1 ~]# mkdir /mnt/nfs
 #赋予共享目录/mnt/nfs目录777的权限,这步必须做,因为运行容器时,是以普通用户的身份运行的。如果没有写的权限,会报错。
[root@docker1 ~]# chmod 777 /mnt/nfs/
#编写共享目录的文件,这个文件是空的,需要自己填写
[root@docker1 ~]# vim /etc/exports
[root@docker1 ~]# cat /etc/exports
/mnt/nfs	*(rw,no_root_squash)
[root@docker1 ~]# systemctl start nfs

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

  • docker2:
[root@docker2 ~]# yum install -y nfs-utils.x86_64
#启动nfs服务
[root@docker2 ~]# systemctl start nfs-server.service 
#查看server1的共享文件
[root@docker2 ~]# showmount -e 172.25.70.1
Export list for 172.25.70.1:
/mnt/nfs *
#创建目录/mnt/nfs,便于挂载。
[root@docker2 ~]# mkdir /mnt/nfs
#将172.25.1.1下的/mnt/nfs目录挂载到本地的/mnt/nfs目录下
[root@docker2 ~]# mount 172.25.70.1:/mnt/nfs/ /mnt/nfs/
#查看挂载信息,以确保挂载成功
[root@docker2 ~]# df

在这里插入图片描述
测试nfs环境是否搭建完成:

#客户端(docker2)上touch文件
[root@docker2 ~]# cd /mnt/nfs/
[root@docker2 nfs]# ls
[root@docker2 nfs]# touch file
[root@docker2 nfs]# ls
file
===============================
#在服务端(docker1)上进行查看
[root@docker1 ~]# cd /mnt/nfs/
[root@docker1 nfs]# ls
file

在这里插入图片描述
在这里插入图片描述
2、配置convoy环境
1、在server1端:下载convoy对应的压缩包(convoy.tar.gz),进行解压,并进行配置

docker官方提供了卷插件的api,在我知道的实现docker卷插件有flocker、convoy这两个插件。开发者可以根据实际需求定制卷插件驱动。

https://docs.docker.com/engine/extend/plugins_volume/#volume-plugin-protocol

[root@docker1 ~]# tar zxf convoy.tar.gz
[root@docker1 ~]# cd convoy/
[root@docker1 convoy]# ls
[root@docker1 convoy]# cp convoy* /usr/local/bin/
[root@docker1 convoy]# mkdir /etc/docker/plugins
[root@docker1 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &> /dev/null &
[root@docker1 convoy]# cd /mnt/nfs/
[root@docker1 nfs]# ls
config  file
[root@docker1 nfs]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@docker1 nfs]# cat /etc/docker/plugins/convoy.spec
unix:///var/run/convoy/convoy.sock

在这里插入图片描述
2、创建卷

[root@docker1 nfs]# docker volume ls
[root@docker1 nfs]# convoy create vol1
[root@docker1 nfs]# ll /mnt/nfs/

在这里插入图片描述
3、将解压convoy目录给server2复制一份,配置convoy环境

  • docker1
[root@docker1 ~]# scp -r convoy docker2:

在这里插入图片描述

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

在这里插入图片描述
3、操作卷

列出全部convoy卷:
[root@docker2 convoy]# convoy list

在这里插入图片描述
创建卷

  • docker1
[root@docker1 nfs]# convoy create vol1
vol1

使用卷

  • docker2
[root@docker2 convoy]# docker run -it --name vm1 -v vol1:/data --volume-driver=convoy ubuntu
root@0ed2869d57d6:/# cd data/
root@0ed2869d57d6:/data# touch file{1..10}
root@0ed2869d57d6:/data# ls

在这里插入图片描述
可以在/mnt/nfs/vol1目录查看到文件:

  • docker1
    在这里插入图片描述
  • docker2
    在这里插入图片描述
    由上可知server1和server2上看到的内容一致,即不同主机间实现了共享存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值