• 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

  • 相关阅读:
    java一个简单的线程池小例子
    java通过反射复制实体类
    java通过反射获取Object的属性
    java时间对比
    软件工程基础最后第一次作业 总结
    C++语言程序化设计——第五次作业
    软件工程基础——第四次作业
    C++语言程序化设计——第四次作业
    软件工程基础第三次作业——原型设计
    C++语言程序化设计——第三次作业
  • 原文地址:https://www.cnblogs.com/elfcafe/p/13708154.html
Copyright © 2020-2023  润新知