zoukankan      html  css  js  c++  java
  • Docker系列-8.容器数据存储

    Docker系列-8.容器数据存储

    宿主机上的一些数据,如果想在容器中能访问到那么这时候就需要用到docker的数据存储。

    常见的两种数据存储方式:数据卷( Data volumes)和数据卷容器( Data volume containers)

    数据卷Data volumes

    数据卷( Data volumes)的概念类似于Linux中mount的文件系统、Aix中mount的逻辑分区LogicVolume。用法也类似,在运行 docker run 命令时,通过设置 -v或者--volume甚至--mount选项将宿主机的卷挂载到容器中。

    这里以容器形式的Docker registry为例添加自定义的数据卷作为镜像仓库的存储媒介。

    [root@registry-docker-distribution ~]#mkdir -p /var/lib/volume4registry
    [root@registry-docker-distribution ~]#touch testvolume
    [root@registry-docker-distribution ~]# docker run -it -v /var/lib/volume4registry:/mnt registry /bin/sh        
    / # ls /mnt/
    testvolume
    

    Docker默认会以读写模式挂载数据卷,如果想以只读方式挂载数据卷,可以在名称后通过冒号设置相应的权限。比如读取宿主机上的配置文件,可以使用 -v /var/lib/volume4registry:/mnt :ro

    宿主机上可以通过docker inspect 命令来查看数据卷的挂载映射情况。

    [root@registry-docker-distribution ~]# docker inspect -f {{.Mounts}} 682ccdc258b6
    [{bind  /var/lib/volume4registry /mnt   true rprivate} {volume be1a3f1ba3b88af8def3c341bd82dacb9ea76b30858d0a6573c7e21a05de8d39 /var/lib/docker/volumes/be1a3f1ba3b88af8def3c341bd82dacb9ea76b30858d0a6573c7e21a05de8d39/_data /var/lib/registry local  true }]
    

    数据卷容器Data volume containers

    数据卷容器是一个专门用来提供数据卷供其它容器挂载的容器,适用于容器间共享数据,这样就可以让Docker去负责管理卷,这样做遵循了单一职责这一原则。

    使用docker run -v选项指定宿主机中的卷,以及该卷在容器中要挂载的路径。如果省略了宿主机中的路径,那么你就创建了一个数据卷容器。

    [root@registry-docker-distribution ~]# docker run -it -v /registryVol registry /bin/sh
    # touch -p /registryVol/testdir
    # ls /registryVol/
    testdir
    

    退出这个容器之后,可以通过 docker inspect 命令来查看这个数据卷被保存到了宿主机的什么位置。 Docker 会在 /var/lib/docker/volumes/ 下为这个卷创建对应的文件夹。

    [root@registry-docker-distribution ~]# docker inspect -f {{.Mounts}} b46cd30c04b6
    [{volume b5f2f34d55a767a2d4e041e1dbc7f2de67efec435391ae341afb56e884573453 /var/lib/docker/volumes/b5f2f34d55a767a2d4e041e1dbc7f2de67efec435391ae341afb56e884573453/_data /registryVol local  true }]
    
    [root@registry-docker-distribution ~]# ls  /var/lib/docker/volumes/b5f2f34d55a767a2d4e041e1dbc7f2de67efec435391ae341afb56e884573453/_data/
    testdir
    

    共享数据卷

    为了使容器中的卷共享给其他容器,可以使用 --volumes-from 选项。

    #创建一个数据容器data
    [root@registry-docker-distribution ~]#  docker run -v /data --name data ubuntu:latest
    
    [root@registry-docker-distribution ~]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    4cba4d6f93da        ubuntu:latest       "/bin/bash"         11 seconds ago      Exited (0) 11 seconds ago    
    
    [root@registry-docker-distribution ~]# docker inspect -f {{.Mounts}} data
    [{volume a79e7e24a481c22151f110892091c4ea16eb45501a0dab6b85f69189683847d2 /var/lib/docker/volumes/a79e7e24a481c22151f110892091c4ea16eb45501a0dab6b85f69189683847d2/_data /data local  true }]
    

    data容器并没有处于运行状态,但是它的卷映射关系已经存在,并且卷被持久化到/var/lib/docker/volumes下。通过 docker rm -v data 命令来删除容器和它的卷

    创建另一个容器通过 --volumes-from 来挂载容器卷

    [root@registry-docker-distribution ~]# docker run -it --volumes-from data centos:latest /bin/bash
    [root@b0420a27a5a7 /]# ls /d
    data/ dev/  
    [root@b0420a27a5a7 /]# touch /data/centosfile
    [root@b0420a27a5a7 /]# exit
    exit
    [root@registry-docker-distribution ~]# ls /var/lib/docker/volumes/a79e7e24a481c22151f110892091c4ea16eb45501a0dab6b85f69189683847d2/_data/
    centosfile
    

    参考

    Use volumes

    Data-only container madness

    Docker In-depth: Volumes

  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/elfcafe/p/13708154.html
Copyright © 2011-2022 走看看