正井猫

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

docker数据卷(volumn)

一. 为什么需要数据卷

  docker镜像是由多个文件系统(只读层)叠加而成,当我们启动一个容器的时候,docker的服务端会加载镜像的只读层,并在最顶层创建一个可读写层。当运行的容器修改现有的文件,该文件会从只读层拷贝到读写层,其实并没有影响到镜像本身,依然存在于镜像中。当我们删除掉容器,容器运行时的数据都会丢失,当我们通过镜像重新run一个容器,该容器还是会回到最初的状态。那么问题来了,我们该如何保存我们运行中的数据了?这个问题有两种解决方法:a. 我们可以定期的将我们的容器通过commit的方式生成一个镜像;b.通过数据卷来实现。很明显我们不可能不停的commit来生成镜像,有些朋友可能会说你这么说的意思是通过数据卷来实现呗,可我都不知道什么是数据卷,怎么知道它好用了?那么接下来我们就开始来介绍数据卷。

二. 什么是数据卷

  数据卷就是容器内部的数据目录直接映射到宿主机上的目录上,无论在宿主机还是容器内对数据的修改在另外一方都是可见的。

三.数据卷的使用

3.1命令的使用

  我们还是通过前面篇章中使用的centos镜像来讲解,其实也就一个命令,我们的工作也就是围绕着该命令来讲解:docker run -it -v /dataVolumn:/containerDataVolumn centos

                                                

                                                

  至于其他的命令笔者在这里不作过多的解释,只解释一下 -v /dataVolumn:/containerDataVolumn 这个命令的意思,-v是绑定将容器中的目录挂载到宿主机的目录上,/dataVolumn:/containerDataVolumn中冒号前的路径是指自动在宿主机上创建的目录名(不用我们手动去创建),冒号后的路径是指在容器中自动创建的目录名。

3.2 数据卷的创建与测试

  我们前面提到过“论在宿主机还是容器内对数据的修改在另外一方都是可见的”,那么本小节我们回来测试这个问题。

  A.我们在容器中 /containerDataVolumn 目录下创建一个container.txt文件,并写入内容,命令:echo "hello world" > container.txt

                                                

  在宿主机的 /dataVolumn目录下会查看到有container.txt文件,并查看内容,如下图所示:

                                                

  B.在宿主机的 /dataVolumn目录下新建 host.txt文件,并写入内容,命令为:echo "welcome" > host.txt

                                               

  在容器的/containerDataVolumn目录下会看到host.txt文件,并查看内容,如下图所示:    

                                                    

  C.删除掉容器,查看宿主机 /dataVolumn目录,文件并没有丢失

                                              

   D.我们可以通过 docker inspect 容器ID 命令查看容器的信息,其中hostConfig.binds可以查看到绑定信息,如下图所示:

                                              

3.3 数据卷的其他创建方式

  通过上面的方式创建数据卷的时候,我们每次在运行镜像的时候都需要去指定宿主机目录和容器目录,不便于维护与迁移,给大家举个例子:例如我们的日志文件是存放在容器中的 /cloud-project/logs目录下,而且在项目的配置文件中也是指定到该目录下,对应到我们的宿主机是/mycloud-project/logs目录,如果说由于项目发布启动的时候,运维人员写错了目录名,那将是很大的问题。所以我们在生成镜像文件的时候就指定数据卷的目录岂不是更好。

  具体操作是,我们根据Dockerfile目录中通过VOLUMN指定数据卷的位置,至于什么是Dockerfile,在后续的篇章中笔者将会详细会大家讲解,当然读者也可以自己去查看其他的网络上优秀的文章,因为本篇博文并不是讲解Dockerfile。

  a. 新建一个空的目录:mkdir my-dockerfile

  b.新建Dockerfile文件

                                             

  c.在Dockerfile中添加如下内容: 

FROM centos
VOLUMN ["/containerDataVolumn"]
CMD /bin/bash

  d.执行命令 docker build -t mycentos:me .  生成名为mycentos,tag为me的新的镜像文件。注意:最后的一个点不能省略,它不是结束的句号(笔者在这里栽了很大的跟头)!!!    

                                                   

   e. 根据mycentos:me这个镜像启动一个容器,观察根目录下会生成 containerDataVolumn文件夹,如下图所示:  

                                                   

     f. 那么如何查看,容器中的数据卷目录对应的宿主机的目录呢?上一小节我们讲过,可以通过 docker inspect 容器ID 命令查看,结果如下图所示:  

                                                   

 

posted on 2019-06-28 19:06  正井猫  阅读(1083)  评论(0编辑  收藏  举报