1 Docker数据卷
- 为什么要用数据卷?
- Docker分层文件系统
- 性能差
- 生命周期与容器相同(即我们删除容器时,对应的volume也会被自动删除)
- Docker数据卷
- mount到主机中,绕开分层文件系统;
- 和主机磁盘性能相同,容器删除后依然保留;
- 仅限本地磁盘,不能随容器迁移。
- Docker提供了两种卷:
- bind mount
- docker managed volume
(1) bind mount
- 是将主机上的目录或文件mount到容器中;
- 使用直观高效,易于理解;
- 使用 -v 选项指定路径,格式 < host path >:< container path >
docker run -d --name vm1 -v /opt/website:/usr/share/nginx/html nginx
cd /opt/website
使用 -v 不但可以挂载目录,还可以挂载文件,并且指定权限
docker run -it --rm -v /opt/website/:/data1 -v /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro busyboxplus
- bind mount 默认权限是rw,可以挂载时指定权限
- 选项 -v 指定的路径,如果不存在,挂载时会自动创建(不管是容器内的路径还是主机上的路径都会自动创建)
(2) docker managed volume
- bind mount必须指定host文件系统路径,限制了移植性;
- docker managed volume 不需要指定mount源,dockerhu自动为容器创建数据卷目录;
- 默认创建的数据卷目录都在/var/lib/docker/volumes中
- 如果挂载时指向容器内部已有的目录,原数据会被复制到volume中。
docker run -d --name registry registry
docker history nginx
docker run -d -v /usr/share/nginx/html --name nginx nginx
(3)bind mount与docker managed volume对比
- 相同点:两者都是host文件系统中的某个路径
- 不同点:
2 卷插件的简介
- Docker卷默认使用的数据local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动。
- Docker官方只提供了卷插件的API,开发者可以根据实际需求定制卷插件驱动。
- Dokcer Plugin 是以Web Service的服务运行在每一台DockerHost上的,通过HTTP协议传输RPC风格的JSON数据完成通信。
- Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省路径下查找Unix Socket文件,自发现可用插件。
- 当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的socket文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。
convoy卷插件
- 支持三种运行方式:devicemapper、NFS、EBS
做一个convoy卷插件的示例,以NFS的方式来运行
步骤一:在两台虚拟机上挂载NFS存储
#在server1上
yum install -y nfs-utils
systemctl start rpcbind
mkdir /nfs
vim /etc/exports
systemctl start nfs
showmount -e
#在server2上
yum install -y nfs-utils
systemctl start rpcbind
systemctl start nfs
showmount -e server1
mkdir /nfs
mount 192.168.43.101:/nfs/ /nfs/
步骤二:部署convoy
#在server1和server2上都做如下操作
tar zxf convoy.tar.gz
cd convoy
mv * /usr/local/bin
mkdir -p /etc/docker/plugins #创建docker引擎的默认扫描路径
convoy daemon --drivers vfs --driver-opts vfs.path=/nfs &
echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
#在server1上创建数据卷
convoy create vol1
convoy list
步骤三:利用创建的数据卷来创建容器
docker run -d --name vm1 -v vol1:/usr/share/nginx/html nginx
cd /nfs/vol1
ls
echo Black Mamba > index.html
步骤四:数据卷的删除
convoy delete vol1
PS ax
kill PID
rm -fr /etc/docker/plugins/
systemctl restart docker