• 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

docker mount 无文件 docker run mount_docker

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

docker mount 无文件 docker run mount_bc_02

3.启用registry容器,发现出现新的管理卷

[root@server1 ~]# docker run -d --name registry registry:2
18e0353c162840c5fa00d68abfe628831a1e5d535580f849564ceb815218e82e
[root@server1 ~]# docker volume ls
DRIVER              VOLUME NAME
local               65f21cb60b1882b386f4838fd5d5301ba356663b7cc9b0c8544cac0a57ca9163

docker mount 无文件 docker run mount_docker mount 无文件_03

4.查看registry的相关信息

[root@server1 ~]# docker inspect registry

docker mount 无文件 docker run mount_Source_04


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

docker mount 无文件 docker run mount_docker_05

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

查看管理卷目录

docker mount 无文件 docker run mount_docker mount 无文件_06

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",

docker mount 无文件 docker run mount_docker mount 无文件_07

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",

docker mount 无文件 docker run mount_bc_08

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

docker mount 无文件 docker run mount_bc_09

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

docker mount 无文件 docker run mount_docker_10

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": {}
	}
}

docker mount 无文件 docker run mount_Source_11

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

docker mount 无文件 docker run mount_Source_12