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

docker MountFlags 的作用_Docker


docker MountFlags 的作用_Docker_02

docker MountFlags 的作用_Docker_03


docker MountFlags 的作用_docker_04

使用 -v 不但可以挂载目录,还可以挂载文件,并且指定权限

docker run -it --rm -v /opt/website/:/data1 -v /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro busyboxplus

docker MountFlags 的作用_docker_05

  • 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 MountFlags 的作用_数据_06

docker MountFlags 的作用_数据_07

docker history nginx
docker run -d -v /usr/share/nginx/html --name nginx nginx

docker MountFlags 的作用_Docker_08

docker MountFlags 的作用_Docker_09

(3)bind mount与docker managed volume对比

  • 相同点:两者都是host文件系统中的某个路径
  • 不同点:

docker MountFlags 的作用_数据_10

2 卷插件的简介

  • Docker卷默认使用的数据local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动。
  • Docker官方只提供了卷插件的API,开发者可以根据实际需求定制卷插件驱动。

docker MountFlags 的作用_Docker_11

  • 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/

docker MountFlags 的作用_Docker_12


docker MountFlags 的作用_docker_13

步骤二:部署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 MountFlags 的作用_Docker_14


docker MountFlags 的作用_数据_15


docker MountFlags 的作用_Docker_16


docker MountFlags 的作用_docker_17


docker MountFlags 的作用_Docker_18


步骤三:利用创建的数据卷来创建容器

docker run -d --name vm1 -v vol1:/usr/share/nginx/html nginx
cd /nfs/vol1
ls

echo Black Mamba > index.html

docker MountFlags 的作用_数据_19


docker MountFlags 的作用_Docker_20


docker MountFlags 的作用_数据_21

docker MountFlags 的作用_Docker_22

步骤四:数据卷的删除

convoy delete vol1
PS ax
kill PID
rm -fr /etc/docker/plugins/
systemctl restart docker