Docker卷管理

本文介绍了Docker的数据卷管理,包括bind mount和docker managed volume两种方式,并探讨了它们的特点。强调了volume数据的持久化保存,特别讨论了bind mount的移植性问题。同时,文章还详细讲解了如何使用nfs convoy实现跨服务器的数据同步,包括安装插件和验证同步效果的过程。

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

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

docker提供了两种卷:
1.bind mount
2.docker managed volume

bind mountdocker managed volume
volume位置可任意指定/var/lib/docker/volumes/…
对已有mount point影响隐藏并替换为volume原有数据复制到volume
是否支持单个文件支持不支持,只能是目录
权限控制可设置为只读,默认为读写权限无控制,均为读写权限
移植性移植性弱,与host path 绑定移植性强,无需指定host目录
bind mount
 是将主机上的目录或文件mount到容器里。
 使用直观高效,易于理解。
 使用 -v 选项指定路径,格式 <host path>:<container path>
 -v选项指定的路径,如果不存在,挂载时会自动创建。
bind mount 默认权限是读写rw,可以在挂载时指定只读ro。
[root@server1 ~]# docker run -it --name vm1 -v /tmp/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel.repo:/rhel.repo:ro ubuntu
[root@server1 ~]# docker volume ls
DRIVER              VOLUME NAME
local               28d0a83780680bde4e7b3a31fd70b50da011a2ff543e27a9cf97201b8641fb36
local               e9fc8726131cbe181b648615aa2915e4f3c21cd3c3889e8d7584edc21f246b07

删除闲置卷

[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
Deleted Volumes:
e9fc8726131cbe181b648615aa2915e4f3c21cd3c3889e8d7584edc21f246b07
docker managed volume

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

[root@server1 ~]# docker run -d --name registry registry:2
0fddecaa45b3ab8fd07a2168869b5263742357b86b875c6c3783a56b2f013a74
[root@server1 ~]# docker volume ls
DRIVER              VOLUME NAME
local               28d0a83780680bde4e7b3a31fd70b50da011a2ff543e27a9cf97201b8641fb36
local               9b61d748f1e25bf4f7a3669fabd25413fceedc322b06b81c81278b2bbd04dbde

使用inspect 查看source
source就是volume在host中的目录,是docker自动为容器生成的目录,如果
挂载时指向的已有目录,原有数据会被复制到volume中。

[root@server1 ~]# docker inspect registry   
 "Source": "/var/lib/docker/volumes/9b61d748f1e25bf4f7a3669fabd25413fceedc322b06b81c81278b2bbd04dbde/_data",

[root@server1 ~]# cd /var/lib/docker/volumes/9b61d748f1e25bf4f7a3669fabd25413fceedc322b06b81c81278b2bbd04dbde/_data

删除容器和卷

[root@server1 _data]# docker rm -f registry 
registry
[root@server1 _data]# docker volume ls
DRIVER              VOLUME NAME
local               28d0a83780680bde4e7b3a31fd70b50da011a2ff543e27a9cf97201b8641fb36
local               9b61d748f1e25bf4f7a3669fabd25413fceedc322b06b81c81278b2bbd04dbde
[root@server1 _data]# 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
Deleted Volumes:
[root@server1 _data]# docker run -d --name registry -v registry:/var/lib/registry registry:2
e4574dea0f6eefd1db49c529dfa634f463552cd3ecc1c5851855f46ae25ad1bb

#使用创建的volume

[root@server1 volumes]# docker volume create vol1
vol1
[root@server1 volumes]# docker run -d --name registry -v vol1:/var/lib/registry registry:2
8e2d5415626209fcdb94ae8681345a27a9a19b3d2e35a959cdaf294e98d9e4b2

[root@server1 ~]# docker inspect registry
 "Source": "/var/lib/docker/volumes/vol1/_data",

使用nfs convoy 实现数据同步

安装nfs convoy

[root@server1 ~]# yum install nfs-utils
[root@server1 volumes]# mkdir /mnt/nfs
[root@server1 volumes]# vim /etc/exports
/mnt/nfs	*(rw,no_root_squash)
[root@server1 volumes]# systemctl start nfs
[root@server1 volumes]# showmount -e localhost
Export list for localhost:
/mnt/nfs *
[root@server1 volumes]# systemctl start rpcbind
[root@server1 volumes]# systemctl enable rpcbind
[root@server1 volumes]# cd 
[root@server1 ~]# ls
convoy.tar.gz  docker  game2048.tar  images  registry2.tar  root@172.25.24.2
[root@server1 ~]# tar zxf convoy.tar.gz 
[root@server1 ~]# ls
convoy  convoy.tar.gz  docker  game2048.tar  images  registry2.tar  root@172.25.24.2
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
convoy  convoy-pdata_tools  SHA1SUMS
[root@server1 convoy]# cp convoy convoy-pdata_tools /usr/local/bin/
[root@server1 convoy]# cd /usr/local/bin/
[root@server1 bin]# ls
convoy  convoy-pdata_tools

向docker中添加插件

[root@server1 ~]# mkdir /etc/docker/plugins/
[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# cd plugins/
[root@server1 plugins]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server1 plugins]# ls
convoy.spec
[root@server1 plugins]# cat convoy.spec 
unix:///var/run/convoy/convoy.sock
[root@server1 plugins]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
[1] 12639
[root@server1 plugins]# DEBU[0000] Creating config at /var/lib/rancher/convoy    pkg=daemon
DEBU[0000]                                               driver=vfs driver_opts=map[vfs.path:/mnt/nfs] event=init pkg=daemon reason=prepare root=/var/lib/rancher/convoy
DEBU[0000]                                               driver=vfs event=init pkg=daemon reason=complete
DEBU[0000] Registering GET, /backups/list                pkg=daemon
DEBU[0000] Registering GET, /backups/inspect             pkg=daemon
DEBU[0000] Registering GET, /info                        pkg=daemon
DEBU[0000] Registering GET, /volumes/list                pkg=daemon
DEBU[0000] Registering GET, /volumes/                    pkg=daemon
DEBU[0000] Registering GET, /snapshots/                  pkg=daemon
DEBU[0000] Registering POST, /volumes/create             pkg=daemon
DEBU[0000] Registering POST, /volumes/mount              pkg=daemon
DEBU[0000] Registering POST, /volumes/umount             pkg=daemon
DEBU[0000] Registering POST, /snapshots/create           pkg=daemon
DEBU[0000] Registering POST, /backups/create             pkg=daemon
DEBU[0000] Registering DELETE, /volumes/                 pkg=daemon
DEBU[0000] Registering DELETE, /snapshots/               pkg=daemon
DEBU[0000] Registering DELETE, /backups                  pkg=daemon
DEBU[0000] Registering plugin handler POST, /Plugin.Activate  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Create  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Remove  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Mount  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Unmount  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Path  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Get  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.List  pkg=daemon

[root@server1 plugins]# cd  /mnt/nfs/
[root@server1 nfs]# ls
config

在server2:

[root@server2 nfs]# showmount -e 172.25.76.1
Export list for 172.25.76.1:
/mnt/nfs *
[root@server2 nfs]# mount 172.25.76.1:/mnt/nfs/ /mnt/nfs/
[root@server2 nfs]# df
Filesystem            1K-blocks    Used Available Use% Mounted on
/dev/mapper/rhel-root  17811456 1892284  15919172  11% /
devtmpfs                 497292       0    497292   0% /dev
tmpfs                    508264       0    508264   0% /dev/shm
tmpfs                    508264    6740    501524   2% /run
tmpfs                    508264       0    508264   0% /sys/fs/cgroup
/dev/sda1               1038336  123376    914960  12% /boot
tmpfs                    101656       0    101656   0% /run/user/0
172.25.76.1:/mnt/nfs   17811456 3012608  14798848  17% /mnt/nfs

[root@server2 ~]# tar zxf convoy.tar.gz 
[root@server2 ~]# cd convoy/
[root@server2 convoy]# ls
convoy  convoy-pdata_tools  SHA1SUMS
[root@server2 convoy]# cp convoy convoy-pdata_tools /usr/local/bin/
[root@server2 convoy]# cd 
[root@server2 ~]# mkdir /etc/docker/plugins/
[root@server2 ~]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server2 ~]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
[1] 4258
[root@server2 ~]# DEBU[0000] Creating config at /var/lib/rancher/convoy    pkg=daemon
DEBU[0000]                                               driver=vfs driver_opts=map[vfs.path:/mnt/nfs] event=init pkg=daemon reason=prepare root=/var/lib/rancher/convoy
DEBU[0000]                                               driver=vfs event=init pkg=daemon reason=complete
DEBU[0000] Registering GET, /info                        pkg=daemon
DEBU[0000] Registering GET, /volumes/list                pkg=daemon
DEBU[0000] Registering GET, /volumes/                    pkg=daemon
DEBU[0000] Registering GET, /snapshots/                  pkg=daemon
DEBU[0000] Registering GET, /backups/list                pkg=daemon
DEBU[0000] Registering GET, /backups/inspect             pkg=daemon
DEBU[0000] Registering POST, /backups/create             pkg=daemon
DEBU[0000] Registering POST, /volumes/create             pkg=daemon
DEBU[0000] Registering POST, /volumes/mount              pkg=daemon
DEBU[0000] Registering POST, /volumes/umount             pkg=daemon
DEBU[0000] Registering POST, /snapshots/create           pkg=daemon
DEBU[0000] Registering DELETE, /volumes/                 pkg=daemon
DEBU[0000] Registering DELETE, /snapshots/               pkg=daemon
DEBU[0000] Registering DELETE, /backups                  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Remove  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Mount  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Unmount  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Path  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Get  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.List  pkg=daemon
DEBU[0000] Registering plugin handler POST, /Plugin.Activate  pkg=daemon
DEBU[0000] Registering plugin handler POST, /VolumeDriver.Create  pkg=daemon

[root@server2 ~]# cd /mnt/nfs/
[root@server2 nfs]# ls
config
[root@server2 nfs]# convoy create vol1
DEBU[0119] Calling: POST, /volumes/create, request: POST, /v1/volumes/create  pkg=daemon
DEBU[0119]                                               event=create object=volume opts=map[VolumeIOPS:0 PrepareForVM:false Size:0 BackupURL: VolumeName:vol1 VolumeDriverID: VolumeType:] pkg=daemon reason=prepare volume=vol1
DEBU[0119] Created volume                                event=create object=volume pkg=daemon reason=complete volume=vol1
DEBU[0119] Response:  vol1                               pkg=daemon
vol1
[root@server2 nfs]# ls
config  vol1

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

root@1b59277e9396:/# cd data/
root@1b59277e9396:/data# touch file{1..10}
root@1b59277e9396:/data# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9
root@1b59277e9396:/data# [root@server2 nfs]# 
[root@server2 nfs]# 
[root@server2 nfs]# ls
config  vol1
[root@server2 nfs]# cd vol1/
[root@server2 vol1]# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9

在server1中检测是否相同

[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls
config  vol1
[root@server1 nfs]# cd vol1/
[root@server1 vol1]# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9


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

root@08f851c535ff:/# cd data/
root@08f851c535ff:/data# ls
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值