本文共 4363 字,大约阅读时间需要 14 分钟。
为什么要用数据卷
是将主机上的目录或文件mount到容器里。
使用直观高效,易于理解。 使用 -v 选项指定路径,格式<host path>:<container path>
[root@server2 ~]# docker run -it --rm -v /data1:/data1 -v /data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/mnt/dvd.repo:ro busyboxbind mount 默认权限是读写rw,可以在挂载时指定只读ro。-v选项指定的路径,如果不存在,挂载时会自动创建。
bind mount必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录,那个路径名字会比较长。 默认创建的数据卷目录都在 /var/lib/docker/volumes 中。 如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。docker run -d --name web1 -p 80:80 -v /usr/share/nginx/html nginx指定数据目录
[root@server2 _data]# docker rm -f registry registry[root@server2 _data]# docker volume ls[root@server2 _data]# docker volume prune [root@server2 _data]# docker volume create registry[root@server2 _data]# docker run -d --name registry -v registry:/var/lib/registry registry[root@server2 _data]# docker inspect registry"Source": "/var/lib/docker/volumes/registry/_data",[root@server2 _data]# pwd/var/lib/docker/volumes/registry/_data
## 隐藏并替换[root@server2 _data]# docker run -d --name demo nginx[root@server2 _data]# curl 172.17.0.3Welcome to nginx! [root@server2 _data]# docker run -d --name demo -v /data1:/usr/share/nginx/html nginx [root@server2 _data]# docker exec -it demo bash[root@server2 data1]# echo www.westos.org > index.html[root@server2 data1]# curl 172.17.0.3www.westos.org[root@server2 data1]# pwd/data1
## 复制原有卷[root@server2 data1]# docker volume create webdatawebdata[root@server2 data1]# docker rm -f demo[root@server2 data1]# docker run -d --name demo -v webdata:/usr/share/nginx/html nginx[root@server2 data1]# cd /var/lib/docker/volumes/webdata/_data[root@server2 _data]# ls50x.html index.html[root@server2 _data]# curl 172.17.0.3
### 权限控制[root@server2 _data]# docker rm -f demodemo[root@server2 _data]# docker run -d --name demo -v webdata:/usr/share/nginx/html:ro nginx[root@server2 _data]# docker exec -it demo bashroot@2500afb7ea5a:/# cd /usr/share/nginx/html/root@2500afb7ea5a:/usr/share/nginx/html# ls50x.html index.htmlroot@2500afb7ea5a:/usr/share/nginx/html# echo www.westos.org >> index.htmlbash: index.html: Read-only file system
docker 卷默认使用的是local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动,可以查看以下链接:
链接: . docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。 链接: .convoy卷插件实现
支持三种运行方式:devicemapper、NFS、EBS。 以下实验使用nfs方式。 下载软件:https://github.com/rancher/convoy/releases/download/v0.5.0/ convoy.tar.gz 在所有节点提前挂载NFS存储。 链接: .[root@server1 ~]# yum install nfs-utils.x86_64 -y[root@server1 ~]# vim /etc/exports/nfsdata *(rw,no_root_squash)[root@server1 ~]# systemctl enable --now nfs[root@server1 ~]# showmount -eExport list for server1:/nfsdata *[root@server1 ~]# mkdir /nfsdata[root@server1 ~]# chmod 777 /nfsdata/
[root@server2 ~]# yum install nfs-utils.x86_64 -y[root@server2 ~]# showmount -e 172.25.1.1Export list for 172.25.1.1:/nfsdata *[root@server2 ~]# mkdir /nfsdata[root@server2 ~]# mount 172.25.1.1:/nfsdata /nfsdata[root@server2 ~]# cd /nfsdata/[root@server2 nfsdata]# touch file
server1和server2都需要部署convoy插件
[root@server1 ~]# tar zxf convoy.tar.gz[root@server1 convoy]# mv convoy* /usr/local/bin/[root@server1 convoy]# mkdir -p /etc/docker/plugins/ ##此目录下存放sock的路径[root@server1 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/nfsdata & ## 启动插件[root@server1 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec ## 指定sock的路径,使得docker调用的时候可以检测
在server1中生成会同步到server2中
convoy create vol1 自动生成数据目录:/nfsdata/vol1/ server2同步server1的卷docker run -it --name vm1 -v vol1:/data --volume-driver=convoy 镜像名字
可以在两个主机上同时运行容器,会发现数据目录中的数据是同步的。 即使server2中运行的容器删掉,但数据还在,在server1中运行容器 docker rm -f demo 在server1中运行上面的容器convoy list 列出卷convoy delete 删除卷convoy snapshot create 创建快照convoy snapshot delete 删除快照convoy backup create 创建备份convoy create res1 --backup 还原备份
转载地址:http://wihzi.baihongyu.com/