docker(4)——数据卷

一、Docker数据卷管理

docker分层文件系统

  • 性能差
  • 生命周期容器相同

docker数据卷

  • mount到主机中,绕开分层文件系统
  • 和主机磁盘性能相同,容器删除后依然保留
  • 仅限本地磁盘,不能随容器迁移

docker提供了两种卷:

  • bind mount
  • docker managed volume

bind mount

是将主机上的目录或文件mount到容器里。

使用直观高效,易于理解。

使用- v选项指定路径,格式<host path>:<container path>

[root@server2 ~]# mkdir website
[root@server2 ~]# cd website/
[root@server2 website]# echo www.westos.org > index.html
[root@server2 website]# ls
index.html
[root@server2 website]# cd ..
[root@server2 ~]# docker run -d --name demo -v /root/website:/usr/share/nginx/html nginx
[root@server2 ~]# docker inspect demo

 此时访问一下,容器目录和本地目录同步

 bind mount默认权限是读写rw,可以在挂载时指定只读ro  , - v选项指定的路径,如果不存在,挂载时会自动创建。

docker managed volume

docker managed volume

  • bind mount必须指定host文件系统路径,限制了移植性。
  • docker managed volume不需要指定mount源,docker 自动为容器创建数据卷目录。
  • 默认创建的数据卷目录都在/var/lib/docker/volumes中。
  • 如果挂载时指向容器内已有的目录,原有数据会被复制到volume中。
删除不用的进程:
[root@server1 ~]# docker rm -f demo1
demo1
[root@server1 ~]# docker rm -f demo2
demo2
[root@server1 ~]# docker ps

[root@server1 ~]# docker run -d --name demo registry
[root@server1 ~]# docker inspect demo  ##查看进程信息

可以看到路径:

 创建卷:

[root@server2 website]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
dfc91830e845   nginx     "/docker-entrypoint.…"   14 minutes ago   Up 14 minutes   80/tcp    demo
[root@server2 website]# docker rm -f demo
demo
[root@server2 website]# docker run -d --name demo -v vol1:/usr/share/nginx/html:ro nginx
0ab86ab9e9da2a050aad1dea92e011cc2da1fa18d064006736e38df9d05190be
[root@server2 website]# curl 172.17.0.2

 

 

 bind mount与docker managed volume对比

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

二、卷插件

docker卷默认使用的是local类型的驱动,只能存在宿主机,跨主机的volume就需要使用第三方的驱动。

docker官方只提供了卷插件的api,开发者可以根据实际需求定制卷插件驱动。

  • Docker Plugin是以Web Service的服务运行在每一台Docker Host上的,通过HTTP协议传输RPC风格的JSON数据完成通信。
  • Plugin的启动和停止,并不归Docker管理,Docker Daemon依靠在缺省路径下查找Unix Socket文件,自动发现可用的插件。
  • 当客户端与Daemon交互,使用插件创建数据卷时,Daemon会在后端找到插件对应的socket 文件,建立连接并发起相应的API请求,最终结合Daemon自身的处理完成客户端的请求。

convoy

convoy卷插件实现

  • 支持三种运行方式: devicemapper. NFS. EBS.
  • 在所有节点提前挂载NFS存储

 

[root@server1 ~]# tar zxf convoy-v0.5.2.tar.gz 
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
convoy  convoy-pdata_tools  SHA1SUMS
[root@server1 convoy]# cp convoy convoy-pdata_tools /usr/local/bin/
[root@server1 convoy]# cd /usr/local/bin/
[root@server1 bin]# ls
convoy  convoy-pdata_tools  docker-compose
[root@server1 bin]# mkdir -p /etc/docker/plugins/
[root@server1 bin]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server1 bin]# cat /etc/docker/plugins/convoy.spec 
unix:///var/run/convoy/convoy.sock
[root@server1 bin]# ll /var/run/convoy/convoy.sock
ls: cannot access /var/run/convoy/convoy.sock: No such file or directory

所有节点都安装nfs-utils

[root@server1 ~]# yum install -y nfs-utils
[root@server1 ~]# vim /etc/exports
[root@server1 ~]# cat /etc/exports
/mnt/nfs      *(rw,no_root_squash)
[root@server1 ~]# mkdir /mnt/nfs
[root@server1 ~]# systemctl start nfs
[root@server1 ~]# showmount -e
Export list for server1:
/mnt/nfs *
[root@server1 ~]# 
[root@server2 ~]# ls
anaconda-screenshots  convoy-v0.5.2.tar.gz  website
[root@server2 ~]# yum install -y nfs-utils
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]# mount 172.25.52.1:/mnt/nfs /mnt/nfs
[root@server2 ~]# showmount -e
clnt_create: RPC: Program not registered
[root@server2 ~]# mount
[root@server1 ~]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
[1] 31426

[root@server1 ~]# docker volume ls
[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# ls
certs.d  daemon.json  key.json  plugins
[root@server1 docker]# cd plugins/
[root@server1 plugins]# ls
convoy.spec
[root@server1 plugins]# cat convoy.spec 
unix:///var/run/convoy/convoy.sock
[root@server1 plugins]# ll /var/run/convoy/convoy.sock

 

 [root@server1 plugins]# ls /mnt/nfs/
config
[root@server1 plugins]# convoy create vol1

[root@server1 plugins]# convoy list

 查看:

[root@server1 ~]# docker volume create -d convoy vol2

[root@server1 ~]# docker volume ls 

 [root@server1 ~]# convoy list

 在server2中:

 [root@server1 plugins]# scp convoy.spec server2:/etc/docker/plugins/

 

[root@server1 ~]# docker run -it --rm -v vol1:/data busybox

/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # cd data/
/data # ls
/data # ls       ##2中的数据同步过来
file2
/data # touch file1
/data # ls
file1  file2
/data # 

 

[root@server2 bin]# docker run -it --rm -v vol1:/data2 busybox  ##实现同步

/ # ls
bin    data2  dev    etc    home   proc   root   sys    tmp    usr    var
/ # cd data2/
/data2 # ls
/data2 # touch file2
/data2 # ls
file2
/data2 # ls
file1  file2
/data2 # 

 如果删除plugins,重启会非常慢,此时可以删除var/lib/docker/volumes/metadata.db

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值