Docker第六篇(docker容器中的数据卷管理和存储驱动)

网友投稿 262 2022-10-19

Docker第六篇(docker容器中的数据卷管理和存储驱动)

首先我们想几个问题:

1、docker容器中的数据存放在哪里?

2、我想让docker里面的程序的主要目录存放到我想让他存放的宿主机位置上怎么实现?

3、两个或多个docker虚拟机之间数据如何做共享?

先回答第一个问题,docker容器中的数据存放在宿主机的/var/lib/docker/volumes目录,前提是虚拟机在生成的过程中明确了volumes,如果没有明确这里就没有,这个叫docker的管理卷---Docker-managed Volume。其次是docker里面如果我不想把数据放到管理卷的目录下面,我想让他放到宿主机的指定目录,比如我们习惯在宿主机上面建立data目录,我想让他放到这里面,这叫docker绑定卷---Bind-mount Volume,这个是在启动docker虚拟机的时候使用-v参数指定的。最后是多个主机之间的数据共享,这个需求的解决办法叫Union Volumes。下面我们详细学习一下三种卷的实现方法和细节。

Docker-managed Volume(管理卷)

docker inspect wordpres

wordpress镜像在使用Dockerfile的使用了Volumes参数

tomcat镜像没有在Dockerfile的时候用Volumes参数

创建管理卷

1、首先我们先写一个简单的Dockerfile文件生成管理卷,前面我们pull过一个centos6.5的操作系统镜像。

FROM hasedon/centos6.5RUN touch /tmp/1.txt #我们知道容器前端需要一个运行的进程,否则启动后立刻停止,我们先创建一个文件RUN mkdir /data #在生成的镜像中的根目录创建一个data目录。Volume /data #把容器根下的data目录做成管理卷CMD tail -f /tmp/1.txt #使用tail打开创建的1.txt文件,让容器一直保持启动状态。这个有很多种方法,开心就好。

删除管理卷

默认我们使用docker rm -f命令删除容器的时候,管理卷是不会自动删除的,他就是这么设计的,原因很简单,如果删除容器就删除管理卷,那么数据就没有了,容器可以再启动,但是文件丢失就完犊子了。所以这么设计也符合常理。

如果删除容器的时候要删除管理卷,在rm的时候加上-v参数即可(docker rm -f -v 容器名/id),当然你还可以直接去/var/lib/docker/volumes下删除,但是如果你知道docker vulume ls命令的话就知道,如果你直接去目录里面删除,你再用这个命令查看的话里面还有有很多记录,所以日常建议搭建用-v参数或者直接来管理卷这里删除,命令如下。

1、查看管理卷,docker volume ls

2、使用docker volume rm  管理卷id

管理卷拓展应用

1、手动创建管理卷。

2、将管理卷应用到容器中,这里的应用方法有点类似于下面我们会说的绑定卷,在run的时候加上-v参数,分别是管理卷名字/容器中的目录的。

docker run --name centos6.5-vol -v volume1:/data -d centos6.5-volume

总结:

1、如果使用第二种方法,在删除容器的时候加上-v参数管理卷是不会删除的,而第一种方法会删除。

2、使用第一种Dockerfile生成的管理卷的话,以后不管在哪个宿主机上只要启动容器,自动就会创建好管理卷,而第二种方法则不会,它需要在启动容器的时候使用-v参数指定需要挂载的管理卷和容器里面的目录。

Docker Bind-mount Volume(绑定卷)

使用场景:如果我们拿到镜像以后发现这个镜像没有做过管理卷,又不想使用dockerfile再生成一遍,就可以使用绑定卷,使用非常简单。

1、首先我们在宿主机上创建了一个/data目录,并特意制作了一个镜像centos6.5v1.0这个镜像。

2、使用-v参数将宿主机上的/data和容器中的/data进行绑定。

3、最后我们在宿主机上的/data下创建了10个文件,然后去容器中查看也有,说明测试成功。

总结:

1、绑定卷可以将宿主机上的任意目录绑定到容器中,只要在run的时候使用-v参数即可,使用很方便。

2、容器删除以后目录不会消失。

3、绑定卷使用docker volume ls是查看不到的。

容器之间的数据共享

方案一(绑定卷方式):

我们知道绑定卷的使用方法是在run的时候,加上-v参数指定宿主机上的目录和容器上的目录进行绑定即可,我们可以利用这个方式进行容器间的数据共享。绑定卷中宿主机上的目录可以同时跟多个容器进行绑定,这样就实现的容器间的数据共享。

总结:

使用绑定卷的方式进行容器间的数据共享的话,需要借助宿主机的一个目录进行共享。

方案二(Union Volume):

1、Union Volume方案其实利用的就是管理卷的基础。

总结:

2、不管是哪种方式,其实都是利用了容器在宿主机上存储数据的这个功能实现,只不过绑定卷上的宿主机目录需要手动创建,而管理卷则不需要。

Docker存储驱动是什么?

Docker存储驱动(storage driver)是Docker的核心组件,它是Docker实现分成镜像的基础。

有三个主流方式

1、device mapper(DM),性能和稳定性存在问题,不推荐在生产中使用。

在老旧的机器上运行的较多,个人从业感觉除非万年不变的生产环境,大概很少有人使用这个存储驱动了。

2、btrfs,社区实现btrfs drivcer,稳定性和性能存在问题。

博主没有用过,据说还需要对硬盘进行分区,对已经是生产环境的平台来说就没法用了。

3、overlayfs,内核3.18overlayfs进入主线,性能和稳定性优异,第一选择。

如果内核版本不是3.18以后,那就不是运行的同样的overlay;运行在带有overlay 补丁的内核上,也就是我们说的“改造内核”。改造内核不可信。这不是说它行不通,它可能工作的很好,但是不可信。所以还是老实升级内核版本较为妥当。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:剑指Offer之Java算法习题精讲二叉树专题篇上
下一篇:Docker第五篇(docker网络管理)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~