一、Docker数据卷管理
docker分层文件系统
- 性能差
- 生命周期容器相同
docker数据卷
- mount到主机中,绕开分层文件系统
- 和主机磁盘性能相同,容器删除后依然保留
- 仅限本地磁盘,不能随容器迁移
docker提供了两种卷:
- bind mount
- docker managed volume
bind mount
是将主机上的目录或文件mount到容器里。
使用直观高效,易于理解。
使用- v选项指定路径,格式<host path>:<container path>
[root@server2 ~]# mkdir website
[root@server2 ~]# cd website/
[root@server2 website]# echo www.westos.org > index.html
[root@server2 website]# ls
index.html
[root@server2 website]# cd ..
[root@server2 ~]# docker run -d --name demo -v /root/website:/usr/share/nginx/html nginx
[root@server2 ~]# docker inspect demo
此时访问一下,容器目录和本地目录同步
bind mount默认权限是读写rw,可以在挂载时指定只读ro , - v选项指定的路径,如果不存在,挂载时会自动创建。
docker managed volume
docker managed volume
- bind mount必须指定host文件系统路径,限制了移植性。
- docker managed volume不需要指定mount源,docker 自动为容器创建数据卷目录。
- 默认创建的数据卷目录都在/var/lib/docker/volumes中。
- 如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。
删除不用的进程:
[root@server1 ~]# docker rm -f demo1
demo1
[root@server1 ~]# docker rm -f demo2
demo2
[root@server1 ~]# docker ps
[root@server1 ~]# docker run -d --name demo registry
[root@server1 ~]# docker inspect demo ##查看进程信息
可以看到路径:
创建卷:
[root@server2 website]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dfc91830e845 nginx "/docker-entrypoint.…" 14 minutes ago Up 14 minutes 80/tcp demo
[root@server2 website]# docker rm -f demo
demo
[root@server2 website]# docker run -d --name demo -v vol1:/usr/share/nginx/html:ro nginx
0ab86ab9e9da2a050aad1dea92e011cc2da1fa18d064006736e38df9d05190be
[root@server2 website]# curl 172.17.0.2
bind mount与docker managed volume对比
相同点:两者都是host文件系统中的某个路径。
二、卷插件
docker卷默认使用的是local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动。
docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。
- Docker Plugin是以Web Service的服务运行在每一台Docker Host上的,通过HTTP协议传输RPC风格的JSON数据完成通信。
- Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件。
- 当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的socket 文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。
convoy
convoy卷插件实现
- 支持三种运行方式: devicemapper. NFS. EBS.
- 在所有节点提前挂载NFS存储
[root@server1 ~]# tar zxf convoy-v0.5.2.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]# cd /usr/local/bin/
[root@server1 bin]# ls
convoy convoy-pdata_tools docker-compose
[root@server1 bin]# mkdir -p /etc/docker/plugins/
[root@server1 bin]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server1 bin]# cat /etc/docker/plugins/convoy.spec
unix:///var/run/convoy/convoy.sock
[root@server1 bin]# ll /var/run/convoy/convoy.sock
ls: cannot access /var/run/convoy/convoy.sock: No such file or directory
所有节点都安装nfs-utils
[root@server1 ~]# yum install -y nfs-utils
[root@server1 ~]# vim /etc/exports
[root@server1 ~]# cat /etc/exports
/mnt/nfs *(rw,no_root_squash)
[root@server1 ~]# mkdir /mnt/nfs
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# showmount -e
Export list for server1:
/mnt/nfs *
[root@server1 ~]#
[root@server2 ~]# ls
anaconda-screenshots convoy-v0.5.2.tar.gz website
[root@server2 ~]# yum install -y nfs-utils
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]# mount 172.25.52.1:/mnt/nfs /mnt/nfs
[root@server2 ~]# showmount -e
clnt_create: RPC: Program not registered
[root@server2 ~]# mount
[root@server1 ~]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
[1] 31426
[root@server1 ~]# docker volume ls
[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# ls
certs.d daemon.json key.json plugins
[root@server1 docker]# cd plugins/
[root@server1 plugins]# ls
convoy.spec
[root@server1 plugins]# cat convoy.spec
unix:///var/run/convoy/convoy.sock
[root@server1 plugins]# ll /var/run/convoy/convoy.sock
[root@server1 plugins]# ls /mnt/nfs/
config
[root@server1 plugins]# convoy create vol1[root@server1 plugins]# convoy list
查看:
[root@server1 ~]# docker volume create -d convoy vol2
[root@server1 ~]# docker volume ls
[root@server1 ~]# convoy list
在server2中:
[root@server1 plugins]# scp convoy.spec server2:/etc/docker/plugins/
[root@server1 ~]# docker run -it --rm -v vol1:/data busybox
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # cd data/
/data # ls
/data # ls ##2中的数据同步过来
file2
/data # touch file1
/data # ls
file1 file2
/data #
[root@server2 bin]# docker run -it --rm -v vol1:/data2 busybox ##实现同步
/ # ls
bin data2 dev etc home proc root sys tmp usr var
/ # cd data2/
/data2 # ls
/data2 # touch file2
/data2 # ls
file2
/data2 # ls
file1 file2
/data2 #
如果删除plugins,重启会非常慢,此时可以删除var/lib/docker/volumes/metadata.db