docker数据卷详解
一、docker数据卷
bind mount 模式
其中 -v选项指定的路径,如果不存在,挂载时会自动创建,也可指定多个挂载。
bind mount 示例:
[root@server1 ~]# docker run -d --name vm1 -v /opt/website:/usr/share/nginx/html nginx
92684dd0d2e25d8f0f458783e5ca6324f5d775e80df441faca0387eb84f8a59c
[root@server1 ~]# cd /opt/website/
[root@server1 website]# ls
此时访问nginx出现错误:
是因为在发布目录下没有默认发布文件,我们创建发布文件后再次访问:
修改的是宿主机/opt/website/目录下的文件,由于挂载到了容器内nginx的发布目录,因此可以成功访问,修改发布文件再次验证:
默认的挂载都是读写的,也可以指定读写权限挂载:
比如指定只读挂载:
[root@server1 ~]# docker run -it --name vm2 -v /opt/website:/data1 -v /etc/yum.repos.d/docker-ce.repo:/etc/yum.repos.d/docker-ce.repo:ro busyboxplus
/ # cd /etc/yum.repos.d/
/etc/yum.repos.d # ls
docker-ce.repo
/etc/yum.repos.d # vi docker-ce.repo
/etc/yum.repos.d # echo 1111 >> docker-ce.repo
/bin/sh: can't create docker-ce.repo: Read-only file system
docker managed volume模式
上面讲的bind mount模式必须指定host文件系统路径,限制了移植性,而docker managed volume模式不需要指定mount源,docker自动为容器创建数据卷目录。
默认创建的数据卷目录都在 /var/lib/docker/volumes中。
上图中的不用的volumes可以使用docker volume prune
命令来释放。
如果挂载时指向容器内已有的目录,原有数据会被复制到volumes中。
[root@server1 volumes]# docker run -d --name vm2 -v /usr/share/nginx/html nginx
[root@server1 volumes]# ls
34a310947a04095e60c5d1f6351cac34d39e6c0cbc731817721e0092729c1c95 metadata.db
[root@server1 volumes]# cd 34a310947a04095e60c5d1f6351cac34d39e6c0cbc731817721e0092729c1c95/_data/
[root@server1 _data]# ls
50x.html index.html
bind mount与docker managed volume对比
二、docker卷插件简介
convoy插件部署
convoy卷插件安装:
<1>两台主机安装并配置NFS
[root@server1 ~]# yum install -y nfs-utils
[root@server2 ~]# yum install -y nfs-utils
确保以下程序处于运行状态:
[root@server1 ~]# systemctl start rpcbind
[root@server2 ~]# systemctl start rpcbind
server1配置:
[root@server1 ~]# vim /etc/exports
[root@server1 ~]# cat /etc/exports
/nfs *(rw,no_root_squash) #设置所有用户对该共享目录可读写 no_root_squash参数表示登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# showmount -e
Export list for server1:
/nfs *
[root@server1 ~]# mkdir /nfs ##新建共享目录
server2配置:
[root@server2 ~]# mkdir /nfs
[root@server2 ~]# showmount -e server1
Export list for server1:
/nfs *
[root@server2 ~]# mount 172.25.63.1:/nfs/ /nfs/ ##客户端挂载共享目录
[root@server2 nfs]# echo redhat > file1 ##测试:客户端172.25.63.2访问目录并建立文件,可写
[root@server2 nfs]# cat file1
redhat
在服务端共享目录下面查看客户端创建的文件:
[root@server1 ~]# cd /nfs/
[root@server1 nfs]# ls
file1
[root@server1 nfs]# cat file1 # 文件已经同步,nfs配置成功
redhat
<2>两台主机安装convoy
server1配置:
[root@server1 ~]# tar zxf convoy.tar.gz
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
convoy convoy-pdata_tools SHA1SUMS
[root@server1 convoy]# mv * /usr/local/bin/
[root@server1 convoy]# mkdir /etc/docker/plugins
[root@server1 ~]# convoy daemon --drivers vfs --driver-opts vfs.path=/nfs & #启动Convoy守护进程
[root@server1 ~]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
server2配置:
[root@server2 ~]# tar zxf convoy.tar.gz
[root@server2 ~]# cd convoy
[root@server2 convoy]# cp * /usr/local/bin/
[root@server2 convoy]# mkdir /etc/docker/plugins
[root@server2 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/nfs & #启动Convoy守护进程
[root@server2 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
第一次运行上面的convoy daemon命令的时候,会在共享目录下生成一个config文件夹,这个文件夹不要删除,不然客户端的convoy命令就会用不了
<3>操作卷
[root@server1 ~]# convoy create vol1 ##创建convoy卷实例
[root@server1 ~]# convoy list ##查询卷
在共享目录内会自动生成一个同名文件夹,在这个卷同名的文件夹内创建文件等,等同于操作卷里面的内容。
[root@server1 vol1]# docker run -d --name vm1 -v vol1:/usr/share/nginx/html nginx
[root@server1 vol1]# ls
50x.html index.html #直接输出了容器内的数据
[root@server1 vol1]# echo www.11111.com > index.html
[root@server1 vol1]# cat index.html
www.11111.com
在server2查看是否同步:
[root@server2 convoy]# cd /nfs/vol1/
[root@server2 vol1]# ls
50x.html index.html
[root@server2 vol1]# cat index.html
www.11111.com
当容器销毁后数据卷还会在。
删除卷:
[root@server1 ~]# docker rm -f vm1 #首先删除容器
[root@server1 ~]# convoy delete vol1 #删除卷
[root@server1 ~]# convoy list
{}