docker容器数据卷管理,NFS实现数据卷的跨主机共享 - Go语言中文社区

docker容器数据卷管理,NFS实现数据卷的跨主机共享


1、什么是容器的数据卷?

容器的数据卷是指在运行一个容器的时候会产生一些数据,这些数据是独立于容器的生命周期,在停止或者删除容器的时候,它们并不会被回收,数据卷的设计就是为了数据的持久化,并且实现容器之间的数据共享。

有三种数据卷类型:

宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问(bind mount)
命名的数据卷:磁盘上Docker管理的数据卷,但是这个卷有个名字。
匿名数据卷:磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件。

备注:数据卷其实都在(如果没有网络文件系统等情况下)宿主机文件系统里面的,
只是第一种是在宿主机内的特定目录下,而后两种则在docker管理的目录下,这个目录一般是 /var/lib/docker/volumes/

2、数据卷的作用和特点

作用:
    1)、容器之间共享数据
    2)、保存容器生成的数据,方便查看
特点:
    1)、数据卷中的更改直接在容器中是生效的
    2)、数据卷的生命周期一直持续到没有容器使用它为止,而且不会无故消失
    3)、数据卷的更新不会保存到镜像中去

3、数据卷的添加

1)、命令行直接挂载
docker run -it -v  /宿主机绝对路径目录:/容器内目录:rwo 镜像名    如果路径不存在,会直接自动建立
    rwo:ro代表只读,rw是读写,一般情况就是这两种
    查看挂载的信息:
        docker ps -a查看出容器的id
        docker inspect  容器id        查看容器的详细信息,包含数据卷的挂载信息
2)、dockerfile添加数据卷
    FROM  镜像名
    VOLUME ["/生成的目录路径"]  -- privileged=true
    CMD echo "success build"
    CMD /bin/bash
docker build -f  /docker/DockerFile -t  命名空间/镜像名
docker run -d --name vm1 镜像名称        运行容器
docker images        查看自己通过dockerfile构建的镜像

我们知道有依赖关系,字容器依赖于父容器,当然其中就有数据卷的依赖,假设父级容器上挂有数据卷,那么依赖与它的容器也依赖于它的数据卷,可以实现数据卷的共享

父级容器:
    docker run -it -v /data:/data --name parentContainer  镜像名
子容器:
    docker run -it --name soncontainer1 --volume -from parentcontainer 镜像名
    docker run -it --name soncontainer2 --volume -from parentcontainer 镜像名
字容器依赖于父容器的数据卷,如果此时关掉父容器,那么两个子容器依旧可以数据共享,使用父容器的数据卷,
而且依赖与他们的新的容器也可以使用父容器的数据卷,知道没有容器使用这个数据卷,它的生命周期才会结束。

4、docker提供的两种数据卷的挂载方式:

1)、bind mount
    是将主机上的目录或文件mount到容器里。
    使用 -v 选项指定路径,格式 <host path>:<container path>
    bind mount 默认权限是读写rw,可以在挂载时指定只读ro

2)、docker managed volume
    bind mount必须指定host文件系统路径,限制了移植性。
    docker managed volume 不需要指定mount源。

5、数据卷的操作

数据卷的创建
    docker volume create voll        创建数据卷
    docker run -d --name registry2 -v voll:/var/lib/registry registry   挂载卷
    docker volume ls        查看数据卷
    docker volume prune     删除系统创建的无用的数据卷,自己创建的数据卷无法这样删除
    

6、卷插件实现跨主机容器之间的数据共享

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

convoy卷插件的三种运行方式:devicemapper,NFS,EBS

7、NFS实现跨主机数据的贡献

1)、首先在server1,server2上搭建NFS文件系统

server1

[root@server1 ~]# yum install -y nfs-utils	安装
[root@server1 ~]# systemctl start rpcbind	这个服务负责通知客户端服务器的NFS端口号的
[root@server1 ~]# mkdir /mnt/nfs	创建共享目录
[root@server1 ~]# chmod 777 /mnt/nfs	修改共享目录权限
[root@server1 ~]# vim /etc/exports	编辑共享目录文件,否则将不会被共享出去
[root@server1 ~]# cat /etc/exports
/mnt/nfs	*(rw,no_root_squash)
[root@server1 ~]# systemctl start nfs

server2

[root@server2 ~]# yum install -y nfs-utils
[root@server2 ~]# systemctl start nfs-server.service
[root@server2 ~]# showmount -e 172.25.27.2
Export list for 172.25.27.1
/mnt/nfs *
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]# 
[root@server2 ~]# mount 172.25.27.1:/mnt/nfs/ /mnt/nfs/
[root@server2 ~]# df
Filesystem            1K-blocks    Used Available Use% Mounted on
/dev/mapper/rhel-root   6486016 1751120   4734896  27% /
devtmpfs                 497244       0    497244   0% /dev
tmpfs                    508264       0    508264   0% /dev/shm
tmpfs                    508264   13108    495156   3% /run
tmpfs                    508264       0    508264   0% /sys/fs/cgroup
/dev/sda1               1038336  141700    896636  14% /boot
tmpfs                    101656       0    101656   0% /run/user/0
172.25.27.1:/mnt/nfs     6486016 2886912   3599104  45% /mnt/nfs

测试:

[root@server2 ~]# cd /mnt/nfs/
[root@server2 nfs]# touch file
[root@server2 nfs]# ls
file
[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls
file

2)、配置convey环境

[root@server1 ~]# tar zxf convoy.tar.gz 
[root@server1 ~]# cd convoy/
[root@server1 convoy]# ls
convoy  convoy-pdata_tools  SHA1SUMS
[root@server1 convoy]# cp convoy* /usr/local/bin/  				##将二进制文件加入到PATH路径
[root@server1 convoy]# mkdir /etc/docker/plugins				##创建docker的插件目录
[root@server1 ~]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &> /dev/null &
[1] 8677
##第一次运行上面的convoy daemon命令的时候,会在/mnt/nfs目录下生成一个config文件夹,这个文件夹不要删除,不然客户端的convoy命令就会用不了
[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls
config  file
[root@server1 nfs]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
##将convoy守护进程开启生成的.sock文件放入/etc/docker/plugins目录下的convoy.spec文件中,docker就可以识别。(其中convoy.spec文件之前是不存在的)
[root@server1 nfs]# cat /etc/docker/plugins/convoy.spec
unix:///var/run/convoy/convoy.sock

3)、创建卷

[root@server1 nfs]# docker volume ls
DRIVER              VOLUME NAME
[root@server1 nfs]# convoy create voll
voll
[root@server1 nfs]# 
[root@server1 nfs]# ll
total 0
drwx------ 2 root root 34 Jul  4 19:19 config
-rw-r--r-- 1 root root  0 Jul  4 19:11 file
drwx------ 2 root root  6 Jul  4 19:19 voll

4)、将解压convoy目录给server2复制一份,配置convoy环境

[root@server1 ~]# scp -r convoy server2:  
[root@server2 ~]# cd convoy/
[root@server2 convoy]# cp convoy* /usr/local/bin/
[root@server2 convoy]# mkdir /etc/docker/plugins
[root@server2 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
[root@server2 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &> /dev/null &
[1] 2851
[root@server2 convoy]# cd /mnt/nfs/
[root@server2 nfs]# ls
config  file  voll

5)、卷的操作

convoy list            列出所有卷
docker run -it --name vm1 voll:/data --volume-driver=convoy ubuntu    直接挂载使用
                       可以在两台机器上同时运行容器,会发现目录中的数据是同步的
    cd /data
    touch file{1..10}
cd /mnt/nfs/voll
    ls file1 file2 file3 file4 file5 file6 file7 file8 file9 file10
创建convoy卷的快照
    convoy snapshot create voll --name voll_pic

 

 

 

 

 

 

 

 

 

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/SS_CC_Go/article/details/99228304
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 18:07:37
  • 阅读 ( 1341 )
  • 分类:docker

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢