Docker数据卷管理
1 Docker数据卷管理
1.1 为什么要用数据卷
- docker分层文件系统性能差,生命周期与容器相同
- 数据卷是容器可以访问,但是位置不在root文件系统中的一个目录。为了能让容器之间可以共享数据,Docker让“卷”(volume)可以绕过Docker镜像的层叠机制。容器中所有对镜像的改变全部都直接存储。每个容器都有固定的运行目录在/var/lib/docker目录下;而每个容器卷的数据则默认单独存储在/var/lib/docker/volumes/目录底下。
容器删除后依然数据卷保留,仅限本地磁盘,不能随容器迁移
1.2 bind mount
bind mount:是将主机上的目录或文件mount到容器里,在容器内对挂载的目录操作时会直接改变宿主机中相应的数据卷,对宿主机的数据卷操作也回应影响容器内的挂载目录,容器删除后宿主机的数据卷依然存在
(1) 创建容器时指定数据卷的挂载路径
docker run -it --rm -v /data1:/data1 -v /data2:/data2:ro -v /mnt/file:/mnt/file:ro busybox
##使用 -v 选项指定路径,宿主机:容器
##ro只读模式
##/data2 目录在只读模式,不能对目录作任何操作
##/mnt/file文件是只读模式,不能对该文件进行修改等操作
(2)在运行容器时如果不指定容器的挂载目录,那么数据卷自动挂载到/var/lib/docker/volumes目录下的随即命名的子目录: docker run -d --name registry registry
- 查看容器的详细信息:
docker inspect registry
- 进入到registry的数据卷挂载目录:
cd /var/lib/docker/volumes/737f8622aba697e5a63b9232cdacc8dfbfa86f60e015d9c190c74cbf1e4a7ebc/_data
- 删除容器:
docker rm -f registry
,此容器挂载的数据卷依然存在 - 查看docker的数据卷:
docker volume ls
- 清除未被使用的数据卷:
docker volume prune
1.3 docker managed volume
bind mount必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录
默认创建的数据卷目录都在 /var/lib/docker/volumes 中。
如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。
(1)创建数据卷
- 创建数据卷名为registry:
docker volume create registry
- 查看数据卷的信息:
docker volume inspect registry
(2) 运行容器时指定数据卷,不指定数据卷的挂载路径时,在容器内的挂载路径是 /var/lib/docker/volumes
目录下的随即名字的子目录:docker run -d --name registry -v registry registry
- 查看容器的信息:
docker inspect resgistry
-
删除容器registry:
docker rm -f registry
-
运行容器时指定数据卷和挂载目录:
docker run -d --name registry -v registry:/var/lib/registry registry
-
查看容器的信息:
docker inspect registry
(3) 对已有挂载点的影响
bind mount方式,隐藏并替换为valume
- 运行容器指定挂载点和挂载目录:
docker run -d --name demo -v /data1:/usr/share/nginx/html nginx
- 查看demo容器的信息:
docker inspect demo
- 测试:
curl 172.17.0.3
,nginx默认发布目录中的内容被覆盖
- 进入容器的交互方式:
docker exec -it demo bash
,容器的挂载目录中没有文件,编辑nginx的默认发布文件可以访问
- 删除demo容器:
docker rm -f demo
docker managed volume方式,会将原有的数据复制到valume中
- 创建数据卷:
docker volume create webserver
- 运行容器:
docker run -d --name demo -v webserver:/usr/share/nginx/html nginx
- 查看容器的信息:
docker inspect demo
- 测试:会将数据卷挂载目录中原有的数据复制到volume中
2 卷插件简介
docker 卷默认使用的是local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动
Convoy是一种支持多种存储类型的Docker存储卷宗插件,由Go语言编写,支持快照、备份和恢复。支持的后端存储设备有多种,devicemapper、NFS、DigitalOcean和EBS等。
2.1 nfs的配置
(1) server1安装nfs-utils:
yum install nfs-utils -y
(2) 编辑/etc/exports 文件:vim /etc/exports
/nfsdata *(rw,no_root_squash)
##共享目录:/nfsdata
## rw:读写
##root目录具有根目录的完全管理访问权限:no_root_squash
(3) 在server1和server2创建共享目录
- 创建挂载目录:
mkdir /nfsdata
- 修改挂载目录的权限:
chmod 777 /nfsdata
(4) server1启动nfs服务:systemctl enable --now nfs
(5) 查看server1的NFS共享目录:showmount -e 172.25.12.1
- 在server1的挂载目录创建文件,数据会在server2的/nfsdata目录同步,在server2修改挂载目录的内容server1中的也会被同步
2.2 convoy卷插件
(1) convoy卷插件的安装: tar zxf convoy.tar.gz
(2) 进入convoy的目录,将convoy和onvoy-pdata_tools移动到 /usr/local/bin/
cd convoy/
mv convoy convoy-pdata_tools /usr/local/bin/
(3) 设置Docker的卷插件
mkdir -p /etc/docker/plugins/
cd /etc/docker/plugins/
- 进入/var/run/convoy/目录,编辑convoy.sock文件
cd /var/run/convoy/
echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
4 启动Convoy守护进程
convoy daemon --drivers vfs --driver-opts vfs.path=/nfsdata &
运行上面的convoy daemon命令的时候,会生成一个config文件夹
cd /nfsdata/
(5) 创建convoy卷
- 查看帮助:
convoy create --help
- 创建卷vol1:
convoy create vol1
- 列出convoy卷:
convoy list
,卷的挂载路径是/nfsdata/vol1
(6) 使用convoy卷,将vol1挂载到nginx的默认发布目录/usr/share/nginx/html
docker run -d --name demo -v vol1:/usr/share/nginx/html --volume-driver convoy nginx
cd /etc/docker/plugins/
- 查看卷的挂载路径:
cd /nfsdata/vol1
- 查看容器的信息:
docker inspect demo
- 测试:访问nginx的默认发布目录
两个主机上同时运行容器,会发现数据目录中的数据是同步的
修改
- 在server2端修改数据卷挂载目录中的文件
echo hello world! > index.html
- 在server2删除容器:
docker ps
docker rm -f 56c340530ed5
- 在server1端运行nginx镜像的容器:
docker run -d --name demo -v vol1:/usr/share/nginx/html --volume-driver convoy nginx
- 查看容器的信息:
docker inspect demo
- 测试:在server2端修改挂载目录的文件后,server1端容器的信息也会同步