数据卷是目录或文件,不是块设备。
容器可以读写volume中的数据。
volume数据可以持久化保存。
docker提供了两种卷:
1.bind mount
2.docker managed volume
bind mount | docker 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