一、 docker数据卷管理
1. 为什么要用数据卷
2. docker提供两种卷
[root@server1 ~]# docker network prune 将不用的网络清除掉
[root@server1 ~]# docker run -d --name vm1 -v /opt/website:/usr/share/nginx/html nginx
56cb4e323a20c34dbd36b23d73647e7f83324f5bad83752796e6c91e724f0cf9
[root@server1 website]# curl 172.17.0.2
/opt/website
[root@server1 docker]# docker run -d --name registry registry
fc4dd2676bc25ad2db56daf04b867f332383295ec3cc82cd84dd65d5f2cd1d2f
[root@server1 volumes]# ls
b3d8a5831c678f8bd94d72f59ed76adb41c3f7c701e8767cb1a890ae66ef7986 metadata.db
通过docker volume可以将容器内的内容复制到挂载点
[root@server1 _data]# docker run -d --name vm2 -v /usr/share/nginx/html nginx
e6941d7e4ec13979bb10a62a31c707bed2f981d51f99cabf370fc772259c6fa3
[root@server1 3117caa56a6c78ac79f7b94ed441ce19d08b5ffd69cd0bd22ef1189b017c3eae]# cd _data/
[root@server1 _data]# ls
50x.html index.html
3. bind mount 和docker managed volume对比
相同点:两者都是host文件系统中的某个路径
不同点:
二、卷插件简介
三、convoy卷插件
1. 支持三种运行方式:devicemapper,NFS,EBS。
以下实验使用nfs的方式。
下载软件:
https://github.com/rancher/convoy/releases/download/v0.5.0/convoy.tar.gz
在所有节点提前挂载NFS存储
2. convoy卷插件安装
[root@server1 ~]# yum install -y nfs-utils
[root@server2 ~]# yum install -y nfs-utils
[root@server1 ~]# systemctl start rpcbind
[root@server2 ~]# systemctl start rpcbind
同步nfs
[root@server1 ~]# cat /etc/exports
/nfs *(rw)
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# showmount -e
Export list for server1:
/nfs *
[root@server1 /]# mkdir /nfs
[root@server2 ~]# mkdir /nfs
[root@server2 ~]# showmount -e server1
Export list for server1:
/nfs *
[root@server2 ~]# mount 172.25.60.1:/nfs/ /nfs/
[root@server2 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
172.25.60.1:/nfs 17811456 2572160 15239296 15% /nfs
[root@server1 /]# cat /etc/exports 因为server2使用的时nfsnobody的身份,无法操作nfs挂载目录中的数据,所以将其改为no_root_squash
/nfs *(rw,no_root_squash)
[root@server1 /]# exportfs -rv
exporting *:/nfs
server2可以读写nfs挂载点
[root@server1 /]# cd /nfs/
[root@server1 nfs]# echo hello > test
[root@server2 ~]# cd /nfs/
[root@server2 nfs]# ls
test
[root@server2 nfs]# rm -fr test
docker通过卷插件(plugins)访问nfs
[root@server1 ~]# tar zxf convoy.tar.gz
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
convoy convoy-pdata_tools SHA1SUMS
[root@server1 convoy]# mv * /usr/local/bin/
[root@server1 ~]# which convoy
/usr/local/bin/convoy
[root@server2 ~]# tar -vzxf convoy.tar.gz
convoy/
convoy/convoy-pdata_tools
convoy/convoy
convoy/SHA1SUMS
[root@server2 ~]# cd convoy/
[root@server2 convoy]# mv * /usr/local/bin/
[root@server2 convoy]# which convoy
/usr/local/bin/convoy
[root@server1 ~]# mkdir -p /etc/docker/plugins/
/etc/docker时docker缺省的一个扫描路径
[root@server2 convoy]# mkdir -p /etc/docker/plugins/
将convoy打入后台
[root@server1 ~]# convoy daemon --drivers vfs --driver-opts vfs.path=/nfs &
[root@server1 nfs]# ll /run/convoy/convoy.sock
srwxr-xr-x 1 root root 0 Apr 9 22:21 /run/convoy/convoy.sock
[root@server1 nfs]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server2 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/nfs &
[root@server2 convoy]# ll /run/convoy/convoy.sock
srwxr-xr-x 1 root root 0 Apr 9 22:26 /run/convoy/convoy.sock
[root@server2 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
创建卷
[root@server1 nfs]# convoy create vol1
[root@server1 nfs]# ls
config vol1
[root@server1 nfs]# convoy list
{
"vol1": {
"Name": "vol1",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Thu Apr 09 22:29:04 +0800 2020",
"DriverInfo": {
"Driver": "vfs",
"MountPoint": "",
"Path": "/nfs/vol1",
"PrepareForVM": "false",
"Size": "0",
"VolumeCreatedAt": "Thu Apr 09 22:29:04 +0800 2020",
"VolumeName": "vol1"
},
"Snapshots": {}
}
}
[root@server1 nfs]# docker run -d --name vm1 -v vol1:/usr/share/nginx/html nginx
[root@server1 nfs]# ls vol1/
50x.html index.html
[root@server2 ~]# ls /nfs/vol1/
50x.html index.html
容器可以销毁但是原来的数据保存在nfx中
[root@server1 nfs]# docker rm -f vm1
[root@server1 nfs]# ls vol1/
50x.html index.html
数据同步过程:
docker engine --- /etc/docker/plugins/convoy.spec --- /run/convoy/convoy.sock ---api ---vol1 --- server2(同步到其它的节点)
删除卷
[root@server2 ~]# convoy delete vol1
[root@server2 ~]# mv /etc/docker/plugins/convoy.spec /mnt/ 或者直接删掉plugins
kill (convoy服务)
[root@server1 docker]# systemctl daemon-reload
[root@server2 ~]# systemctl restart docker
docker默认创建的volume在/var/lib/docker/volumes/中
[root@server2 ~]# docker volume create vol1
vol1
[root@server2 ~]# ls /var/lib/docker/volumes/
metadata.db vol1