- docker数据卷
数据卷是目录或文件,不是块设备。
容器可以读写volume中的数据。
volume数据可以持久化保存。 - docker提供了两种卷:
bind mount
docker managed volume
实验环境
1.bind mount
是将主机上的目录或文件mount到容器里。
使用直观高效,易于理解。
使用 -v 选项指定路径,格式
<host path>:<container path>
bind mount 默认权限是读写rw,可以在挂载时指定只读ro,-v选项指定的路径,如果不存在,挂载时会自动创建
示例:
[root@server1 ~]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/rhel7.3.repo:/dvd.repo:ro ubuntu
测试目录和文件的权限
root@e5d878dadbcc:/# ls
bin data1 dev etc lib media opt root sbin sys usr
boot data2 dvd.repo home lib64 mnt proc run srv tmp var
root@e5d878dadbcc:/# cat dvd.repo
[rhel7.3]
name=rhel7.3
baseurl=http://172.25.80.250/rhel7.3
gpgcheck=0
root@e5d878dadbcc:/# ll dvd.repo
-rw-r--r-- 1 root root 71 May 22 02:00 dvd.repo
root@e5d878dadbcc:/# id
uid=0(root) gid=0(root) groups=0(root)
root@e5d878dadbcc:/# cd data1
root@e5d878dadbcc:/data1# ls
root@e5d878dadbcc:/data1# touch file1
root@e5d878dadbcc:/data1# ls
file1
root@e5d878dadbcc:/data1# cd ..
root@e5d878dadbcc:/# cd data2
root@e5d878dadbcc:/data2# ls
root@e5d878dadbcc:/data2# touch file2
touch: cannot touch 'file2': Read-only file system
2.docker managed volume
- bind mount必须指定host文件系统路径,限制了移植性。
- docker managed volume 不需要指定mount源。
1.查看现有管理卷
[root@server1 ~]# docker volume ls
DRIVER VOLUME NAME
local 40e48ec055e099682b73f6c62d060790e71c6340ff98238569bba3e7b218c5d8
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
Deleted Volumes:
40e48ec055e099682b73f6c62d060790e71c6340ff98238569bba3e7b218c5d8
Total reclaimed space: 0B
3.启用registry容器,发现出现新的管理卷
[root@server1 ~]# docker run -d --name registry registry:2
18e0353c162840c5fa00d68abfe628831a1e5d535580f849564ceb815218e82e
[root@server1 ~]# docker volume ls
DRIVER VOLUME NAME
local 65f21cb60b1882b386f4838fd5d5301ba356663b7cc9b0c8544cac0a57ca9163
4.查看registry的相关信息
[root@server1 ~]# docker inspect registry
Source为管理卷在宿主机的目录,是docker为容器自动生成的目录,如果挂载时不指定目录,容器内挂载目录的原有数据会复制到宿主机的该目录中。注意,删除容器后,管理卷不会被删除。
[root@server1 ~]# docker rm -f registry
registry
[root@server1 ~]# docker volume ls
DRIVER VOLUME NAME
local 65f21cb60b1882b386f4838fd5d5301ba356663b7cc9b0c8544cac0a57ca9163
[root@server1 ~]# docker volume rm 65f21cb60b1882b386f4838fd5d5301ba356663b7cc9b0c8544cac0a57ca9163
65f21cb60b1882b386f4838fd5d5301ba356663b7cc9b0c8544cac0a57ca9163
[root@server1 ~]# docker volume ls
DRIVER VOLUME NAME
5.docker自动生成的目录名称会很长,不方便书写使用。我们可以在创建容器时自己定义目录名称。
[root@server1 ~]# docker run -d --name registry -v registry2:/var/lib/registry registry:2
e6030e06c41dd92d586371c430140772fd0dc922fa73e21d4d8c09e14579e9e7
[root@server1 ~]# docker volume ls
DRIVER VOLUME NAME
local registry2
查看管理卷目录
6.先创建管理卷再创建容器并将管理卷挂载到容器内的指定目录
[root@server1 ~]# docker volume create vol1
vol1
[root@server1 ~]# docker volume ls
DRIVER VOLUME NAME
local registry2
local vol1
[root@server1 ~]# docker run -d --name registry2 -v vol1:/var/lib/registry registry:2
40ef12fd0e824822f85ae75db80efa7d33bb1d7de3fb25a51aa3a5acab8025b3
[root@server1 ~]# docker inspect registry | grep Source
"Source": "/var/lib/docker/volumes/registry2/_data",
7.新建管理卷,在创建容器时挂载管理卷并指定目录读写权限
[root@server1 ~]# docker volume create vol2
vol2
[root@server1 ~]# docker volume ls
DRIVER VOLUME NAME
local registry2
local vol1
local vol2
[root@server1 ~]# docker run -it --name registry3 -v vol2:/data:ro ubuntu
root@d65664bfeb11:/# cd data/
root@d65664bfeb11:/data# touch file
touch: cannot touch 'file': Read-only file system
root@d65664bfeb11:/data# exit
[root@server1 ~]# docker inspect registry3 | grep Source
"Source": "/var/lib/docker/volumes/vol2/_data",
3.convoy卷插件
1.在server1和server2上都安装nfs文件系统
server1上:
[root@server1 ~]# yum install nfs-utils -y ##下载服务
[root@server1 ~]# mkdir /mnt/nfs ##建立要共享的目录
[root@server1 ~]# vim /etc/exports ##编写文件
1 /mnt/nfs *(rw,no_root_squash)
[root@server1 ~]# ll -d /mnt/nfs/
drwxr-xr-x 2 root root 6 Jun 12 13:45 /mnt/nfs/
[root@server1 nfs]# chmod 777 /mnt/nfs/ ##修改权限,便于容器使用
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# showmount -e localhost
Export list for localhost:
/mnt/nfs *
server2上
[root@server2 ~]# yum install -y nfs-utils
[root@server2 ~]# systemctl start nfs-server.service
[root@server2 ~]# showmount -e 172.25.80.1 ##查看server1的共享
Export list for 172.25.80.1:
/mnt/nfs *
[root@server2 ~]# mkdir /mnt/nfs ##创建目录,便于挂载
[root@server2 ~]# mount 172.25.80.1:/mnt/nfs/ /mnt/nfs/ ##挂载
[root@server2 ~]# df ##查看是否挂载成功
172.25.80.1:/mnt/nfs 17811456 3110400 14701056 18% /mnt/nfs
测试nfs文件系统是否搭建成功
[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls
[root@server2 ~]# cd /mnt/nfs/
[root@server2 nfs]# touch file
[root@server2 nfs]# ls
file
[root@server1 nfs]# ls
file
2.配置convoy环境
1.在server1端:下载convoy对应的压缩包(convoy.tar.gz),进行解压,并进行配置
[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 convoy-pdata_tools /usr/local/bin/
[root@server1 convoy]# mkdir /etc/docker/plugins
[root@server1 plugins]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &> /dev/null &
[root@server1 plugins]# cd /mnt/nfs/
[root@server1 nfs]# ls
config file
[root@server1 nfs]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server1 nfs]# cat /etc/docker/plugins/convoy.spec
unix:///var/run/convoy/convoy.sock
2.创建卷
[root@server1 nfs]# convoy create vol1
vol1
[root@server1 nfs]# ll /mnt/nfs/
total 0
drwx------ 2 root root 34 Jun 12 14:30 config
-rw-r--r-- 1 root root 0 Jun 12 13:55 file
drwx------ 2 root root 6 Jun 12 14:30 vol1
3.将解压convoy目录给server2复制一份,配置convoy环境
[root@server1 ~]# scp -r convoy server2:
root@server2's password:
convoy-pdata_tools 100% 22MB 11.0MB/s 00:02
convoy 100% 19MB 19.5MB/s 00:01
SHA1SUMS 100% 124 0.1KB/s 00:00
[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]# 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] 2805
3.操作卷
1.列出全部convoy卷
[root@server2 convoy]# convoy list
{
"vol1": {
"Name": "vol1",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Wed Jun 12 14:30:09 +0800 2019",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "",
"Path": "/mnt/nfs/vol1",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Wed Jun 12 14:30:09 +0800 2019",
"VolumeName": "vol1"
},
"Snapshots": {}
}
}
2.创建卷
[root@server1 nfs]# convoy create vol1
vol1
3.使用卷
[root@server2 ~]# docker run -it --name vm1 -v vol1:/data --volume-driver=convoy ubuntu
4.创建文件并查看
root@17b47eac5110:/# cd /data/
root@17b47eac5110:/data# touch file{1..10}
root@17b47eac5110:/data# ls
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
root@17b47eac5110:/data# [root@server2 ~]#
[root@server2 ~]# cd /mnt/nfs/vol1/
[root@server2 vol1]# ls
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
[root@server1 ~]# cd /mnt/nfs/vol1/
[root@server1 vol1]# ls
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
在容器中建立的文件,在server1和server2上也可以看到,实现了存储的共享。
5. 在server1也使用该数据卷创建容器
[root@server2 ~]# docker run -it --name vm1 -v vol1:/data ubuntu
root@925309d65c00:/# cd data/
root@925309d65c00:/data# ls
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
同样可以查看到共享的文件
6.创建卷快照
[root@server1 ~]# convoy snapshot create vol1 --name vol1_pic ##--name指定名字
vol1_pic
[root@server1 ~]# convoy list