docker(12)——数据卷管理(convoy)

1.什么是Docker数据卷

数据卷是一个或多个容器中专门指定的目录,它能够绕过联合文件系统。 卷被设计用作数据持久化、并且是独立于容器的生命周期的。
因此,Docker不会在删除容器时自动删除数据卷卷,也不会主动“垃圾回收”掉容器不再使用的卷。

说白了,数据卷的存在就是想让的容器的数据持久化存在,而且可以实现容器之间的数据共享

当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的 而且容器之间我们希望能够实现数据共享

通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中 由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷

有三种数据卷类型:

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

2.数据卷的特点

1)数据卷可以在容器之间共享或重用数据
(2)数据卷中的更改可以直接生效
(3)数据卷中的更改不会包含在镜像的更新中
(4)数据卷的生命周期一直持续到没有容器使用它为止

3.为什么要用数据卷

在这里插入图片描述

bind mount

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

在这里插入图片描述
在这里插入图片描述

[root@server1 ~]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro busybox  ##只读挂载
/ # ls
bin    data1  data2  dev    etc    home   proc   root   sys    tmp    usr    var
/ # cd data1/
/data1 # ls
/data1 # touch file1
/data1 # ls
file1
/data1 # cd ../data2/
/data2 # touch file2
touch: file2: Read-only file system
/data2 # [root@server1 ~]# 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

docker managed volume

bind mount 必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

[root@server1 ~]# docker inspect vm1 | grep Source
                "Source": "/var/lib/docker/volumes/b91dda342e54706f75ca6fb497b72d49de4459f62d651af52b2c7749ce28bc67/_data",
[root@server1 ~]# cd /var/lib/docker/volumes/b91dda342e54706f75ca6fb497b72d49de4459f62d651af52b2c7749ce28bc67/_data
[root@server1 _data]# ls
[root@server1 _data]# 

source就是volume在host中的目录,是docker自动为容器生成的目录,如果挂载时指向的已有目录,原有数据会被复制到volume中。 注意,即使删除容器,管理卷也不会删除。

我们会发现,docker自动生成的目录名称会很长,不方便书写使用。我们可以在创建容器时自己定义目录名称。
在这里插入图片描述
接下来,创建新的容器并将管理卷voll挂载到容器内的指定目录
在这里插入图片描述

4.如何添加数据卷

添加数据卷的方式有两种,第一种是直接通过命令行挂载,第二种是通过dockerFile添加

(1)第一种通过命令行挂载的方式,命令如下:

docker run -it -v  /宿主机绝对路径目录:  /容器内目录  镜像名

这个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的,里面的数据可以共享
如果我们不知道数据卷是否挂载成功时,我们可以通过以下方式来检查数据卷的挂载结果

docker ps -a  ## 查看出容器的id
docker inspect 容器id

上面的命令可以查看容器的详细情况,命令返回的是JSON格式的字符串

我们再挂载的时候还可以给数据卷加上权限,假如我们要宿主机只能读取容器的数据卷内容不能修改,我们可以添加只读权限

docker run -it -v /宿主机绝对路径目录 : /容器内目录  :ro 镜像名

至于只写的话我们一般不会用到,要么就是读写,要么就是只读 而且我们可以通过docker inspect 来查看容器的volumesRW来查看容器内数据卷的读写权限。
(2)第二种就是利用dockerFile的形式添加

首先在linux服务器根目录上新建docker文件夹并建立DockerFile文件 /etc/docker
使用volume命令
(出于可移植可分享的的考虑,用以上 -v /宿主机绝对路径目录 : /容器内目录 的这种方式不能够直接在dockerFile中直接实现,因为宿主机目录是依赖于特定的宿主机的,并不能保证所有的宿主机都存在这样特定的目录)

编写的dockerFile文件如下:

FROM  镜像名
VOLUME ["/生成的目录路径"]  -- privileged=true
CMD echo "success build"
CMD /bin/bash

相当于命令行: docker run -it -v /宿主机目录路径 : /生成的目录路径 然后我们通过命令行docker build执行我们写好的dockerFile文件
(docker build和docker commit两个命令都可以建立docker镜像,docker commit 需要在容器内进行,docker build 不需要)

docker build -f /docker/DockerFile -t 命名空间/镜像名

执行后输入docker images就可以发现自己通过DockerFile所build的镜像,里面有挂载数据卷
那么问题来了宿主机所对应的目录是什么呢?
同上,我们可以通过docker inspect来查看当前容器的Volumes,里面会有宿主机的数据卷目录

上面介绍了docker容器数据卷,它的作用相当于生活中的活动硬盘`
那么数据卷容器就相当于把多个活动硬盘再挂载到一个活动硬盘上,实现数据的传递依赖。
官网解析:命名的容器挂载数据卷,其他的容器通过挂载这个父容器实现数据共享,挂载数据卷的容器,我们称为数据卷容器。

5. Docker卷插件(plugins)

如果想实现跨主机的容器之间的数据共享就要使用卷插件
使用了卷插件才可以使用网络文件系统实现数据共享

跨主机的volume就需要使用第三方的驱动,可以查看链接:
https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们下面的实验以 nfs的运行方式 来演示

实验目的:在server1和2底层用nfs来实现数据共享

	(1)首先在server1和server2上搭建nfs文件系统:

server1:

root@server1 ~]# yum install -y nfs-utils	安装
[root@server1 ~]# systemctl start rpcbind	
[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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:rpcbind服务必须是开启的。 这是因为:他是一个RPC服务,主要是在nfs共享时候负责通知客户端,服务器的nfs端口号的。 简单理解rpc就是一个中介服务。
server2:

[root@server2 ~]# yum install -y nfs-utils
[root@server2 ~]# systemctl start nfs-server.service
[root@server2 ~]# showmount -e 172.25.6.1    ##寻找server1的挂载目录
Export list for 172.25.254.1:
/mnt/nfs *
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]# 
[root@server2 ~]# mount 172.25.254.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.254.1:/mnt/nfs     6486016 2886912   3599104  45% /mnt/nfs

在这里插入图片描述测试:
在server2中:
在这里插入图片描述
在这里插入图片描述
(2)配置convoy环境

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

在server1中:

[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 
[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

在这里插入图片描述
说明:docker引擎默认扫描 /etc/docker/plugins目录中的convoy.spec—>访问/run/convoy/convoy.sock文件—>发起响应的api请求—>把数据写入vol1中—>底层通过nfs进行主机间的数据同步
(3)在server2中同样配置convoy环境:

在这里插入图片描述
(4)创建卷
在这里插入图片描述

在这里插入图片描述
(5)操作卷

在server2中运行容器,指定卷为刚才新创建的vol1:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明:docker引擎默认扫描 /etc/docker/plugins目录中的convoy.spec—>访问/run/convoy/convoy.sock文件—>发起响应的api请求—>把数据写入vol1中—>底层通过nfs进行主机间的数据同步
如何删除通过nfs创建的数据卷,让之后创建的数据卷都是本地的呢?

删除卷:

convoy delete vol1

实现本地驱动:

cd /etc/docker/plugins/
mv convoy.spec /mnt
systemctl restart docker

创建卷:

docker volume create vol1
ls
cd volumes/
ls	#可以看到vol1,默认创建在这个目录下
cd vol1/
ls
cd _data/
ls	#进入该目录,是空的

在这里插入图片描述

docker run -d --name vm1 -v vol1:/usr/share/nginx/html nginx
docker ps
ls	#看到nginx默认发布目录被挂到这里了

在这里插入图片描述
docker container prune #删除停止的容器
docker volume prune #删除没有被使用的卷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值