0
点赞
收藏
分享

微信扫一扫

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镜像,wordpress和tomcat,如何判断这个镜像当时有没有声明过volume呢,使用inspect就可以看到。

docker  inspect wordpres

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

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

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

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

创建管理卷

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

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

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


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


 删除管理卷

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

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

  1、查看管理卷,docker volume ls

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


   2、使用docker volume rm  管理卷id

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


 管理卷拓展应用

  前面我们说了管理卷需要在Dockerfile里面使用Volume参数声明得来的,下面我们介绍另外一种使用方法,不需要Dockerfile生成。

  1、手动创建管理卷。

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


   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个文件,然后去容器中查看也有,说明测试成功。

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

 总结:

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

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

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

容器之间的数据共享

  方案一(绑定卷方式):

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

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


     总结:

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

  方案二(Union Volume):

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

    2、下面centos6.5这个镜像我在生成的时候,在里面明确了Volume参数,声明了容器中的/data作为管理卷绑定目录,而centos6.5v1.0没有声明Volume。

    3、所以必须要先使用一个在Dockerfile中声明过Volume参数的镜像的容器,否则其它容器不知道要跟这个容器的哪个目录进行数据共享。

    4、使用绑定卷的容器启动以后,其它需要跟这个容器进行数据共享的话,run的时候必须要加一个参数--volumes-from,作用是声明要跟哪个容器进行数据共享。

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


   总结:

    1、绑定卷和管理卷各有一套容器之间数据共享的解决方案,绑定卷可能更容易理解和操作。管理卷需要注意最开始的那个容器一定要要在Dockerfile中声明过Volume参数,或者用上面我们说的管理卷第二种方式创建的也可以。

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


Docker存储驱动是什么?

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

有三个主流方式

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

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

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

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

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

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




举报

相关推荐

0 条评论