zoukankan      html  css  js  c++  java
  • 5、Docker数据管理

    为了能够存储持久化数据以及共享容器间的数据,Docker提出了Volume的概念。让我们通过类似mount的方式将宿主机的文件或者目录挂载到容器中。

    在容器中管理数据主要有两种方式:

    • 数据卷(Data volumes)

    • 数据卷容器(Data volume containers)

    数据卷

    创建一个数据卷

    在使用docker run命令的时候,使用-v选项创建一个数据卷并挂载到容器里。

    下面创建一个测试容器nginx,并加载一个数据卷到容器的/data目录。

    [root@linux-node1 ~]# docker run -d --name nginx-volume-test1 -v /data nginx
    

    容器启动后,登录到容器会发现/data目录是空的。

    [root@linux-node1 ~]# ./docker_in.sh nginx-volume-test1
    root@00741a2a44ad:/# ls -l /data
    total 0
    

    上面的命令会挂载一个data目录到容器中,并绕过联合文件系统,我们可以在主机上直接操作该目录。任何在该镜像/data 路径的文件会将被复制到Volume。那么在我们宿主机上,这个目录到底在哪里呢。

    我们可以使用 docker inspect 命令找到Volume在主机上的存储位置:

    [root@linux-node1 ~]# docker inspect -f {{.Mounts}} nginx-volume-test1
    
    [{861cbee5b650461490633fc60bd94a0df0f8b01e4a4dcc4adff4825dff509159
    /var/lib/docker/volumes/861cbee5b650461490633fc60bd94a0df0f8b01e4a4dcc4adff4825dff509159/_data
    /data local true }]
    

    你会发现,容器中的/data目录实际上挂载到了/var/lib/docker/volumes/容器ID/_data的目录下。

    我们现在在宿主机该目录下创建一个文件。

    [root@linux-node1 _data]# touch mount-test
    

    我们再次在容器中查看,发现已经有了。

    [root@linux-node1 ~]# ./docker_in.sh nginx-volume-test1
    root@00741a2a44ad:/# ls -l /data
    total 0
    -rw-r--r-- 1 root root 0 Sep 2 18:58 mount-test
    

    指定一个宿主机目录作为数据卷

    有的时候,我们需要将宿主机的某个目录挂载到容器中来进行访问,可以通过-v 源路径:目标目录的方式进行。

    [root@linux-node1 ~]# mkdir -p /data/docker-volume-nginx
    [root@linux-node1 ~]# docker run -d --name nginx-volume-test2 
    -v /data/docker-volume-nginx:/data nginx
    

    你会发现,目前容器中的/data目录和宿主机中的/data/ docker-volume-nginx目录是相同的。

    文件挂载

    数据卷也可以挂载一个宿主机的文件作到容器中作为数据卷。

    [root@linux-node1 ~]# docker run -d --name nginx-volume-test3 
    -v /$HOME/.bash_history:/root/.bash_history nginx
    

    上面案例将宿主机的.bash_history挂载到了容器中,这样就可以记录容器中的命令历史记录。

    只读挂载

    Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

    [root@linux-node1 ~]# docker run -d --name nginx-volume-test 
    -v /data/docker-volume-nginx:/data:ro nginx
    

    数据卷生产实践

    那么这种将本地的目录挂载到容器中的方法,在生产中有哪些应用场景呢?

    在开发环境中

    在基于Docker的开发环境中,例如我们将本地的/home/code目录挂载到容器中的/data/webroot,然后容器的应用的webroot同样设置为/data/webroot,那么容器启动后,我们就可以自由的本地进行代码的编写和调试,对于解释性的语言,就比较方便了。如果你的Docker运行在虚拟机中,可以先将本地例如D:code目录通过虚拟机软件共享到虚拟机里,目前VirtualBox和Vmware workstation都支持目录映射。在Vmware中需要在虚拟机中安装Vmware Tools。

    在生产环境中

    如果我们的容器里面运行的程序需要写一些持久化的数据到硬盘,或者共享宿主机的一些文件或者目录,显然这种数据卷的挂载非常的方便。

    不过数据卷最大的缺陷应该是不灵活了,因为Docker的理念是Build、Ship、Run。因为有这个挂载目录的依赖,那么这个Docker镜像在新的宿主机上运行就需要考虑挂载的目录是否存在等问题。

    数据卷容器

    Docker还支持让一个容器访问另一个容器的Volume,我们可以使用 -volumes-from 参数挂载其它容器的卷。

    [root@linux-node1 ~]# docker run -d --name nginx-volume-test4 
    --volumes-from nginx-volume-test1 nginx
    7d650d332e3d9bf4086be35ae5a04b618f9d8e1df03fa2fef5f5766318a4ca12
    [root@linux-node1 ~]# ./docker_in.sh nginx-volume-test4
    root@7d650d332e3d:~# ls /data
    mount-test
    

    注意:不管数据卷容器nginx-volume-test1是否运行,nginx-volume-test4都可以访问到nginx-volume-test1里面挂载的数据卷。所以说数据卷容器,其实就是一个普通的容器,只不过是专门用来提供数据卷供其它容器挂载使用的。

    数据卷容器生产实践

    在生产中使用数据卷容器的方案有很多,一个非常典型的就是在进行日志收集的时候。我们可以在一台服务器上启动一个logstash或者filebeat的容器log-volume,然后其它所有应用容器启动都使用--volumes-from log-volume,将日志写入对应路径,然后使用统一收集,这样就避免在所有需要进行日志收集的容器中去部署logstash。相对于直接挂载本地目录也更加的方便。

  • 相关阅读:
    设计模式——模板方法模式
    设计模式——适配器模式
    设计模式——策略模式
    设计模式——工厂模式
    设计模式——代理模式
    设计模式——单例模式
    设计模式——总纲
    Hadoop的safeMode
    MapReduce中Combiner规约的作用以及不能作为MR标配的原因
    hdfs shell
  • 原文地址:https://www.cnblogs.com/wangyh702/p/11436195.html
Copyright © 2011-2022 走看看