zoukankan      html  css  js  c++  java
  • 20200206 Docker 5. Docker容器数据卷

    Docker 5. Docker容器数据卷

    是什么

    先来看看Docker的理念:

    • 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
    • 容器之间希望有可能共享数据

    Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,
    那么当容器删除后,数据自然也就没有了。

    为了能保存数据在docker中我们使用卷。

    一句话:有点类似我们Redis里面的rdb和aof文件

    能干嘛

    卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:

    卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

    特点:

    1. 数据卷可在容器之间共享或重用数据
    2. 卷中的更改可以直接生效
    3. 数据卷中的更改不会包含在镜像的更新中
    4. 数据卷的生命周期一直持续到没有容器使用它为止

    作用:

    • 容器的持久化
    • 容器间继承+共享数据

    容器内添加数据卷

    直接命令添加

     docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
    

    示例:

    docker run -it -v /outData:/inData centos
    

    -v 命令有新建文件夹功能

    查看数据卷是否挂载成功

    docker inspect 容器ID
    

    如果存在数据卷,从json中可以看出

    ...
    	"HostConfig": {
                "Binds": [
                    "/outData:/inData"
                ],
    ...
    

    容器和宿主机之间数据共享

    类似于共享文件夹,文件夹内的文件和文件内容互通

    容器停止退出后,主机修改后数据依然同步

    命令(带权限)

    docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
    

    ro即read only,表示Docker容器对数据卷的权限为只读。

    备注

    Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
    解决办法:在挂载目录后多加一个--privileged=true参数即可

    DockerFile添加

    1. 根目录下新建mydocker文件夹并进入

    2. 可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

      VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
      

      说明:

      出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能直接在Dockerfile中实现。
      由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

    3. File构建

      在mydocker目录下创建dockerfile文件,内容如下:

      # volume test
      FROM centos
      VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
      CMD echo "finished,--------success1"
      CMD /bin/bash
      
    4. build后生成镜像

      docker build -f /mydocker/dockerfile -t hwj/centos .
      
    5. 使用镜像生成容器

      进入容器后可以发现在根目录存在两个数据卷目录

    6. 查看主机对应的目录地址

      docker inspect 容器ID
      

      返回的json串中有相关信息,这里与视频教程不同,应该是因为Docker版本差异导致

      "Mounts": [
                  {
                      "Type": "volume",
                      "Name": "adc7baa50e75533e1fbeab169cdfe532c99b9ec5daf5e85c1b09e9898f6af9e3",
                      "Source": "/var/lib/docker/volumes/adc7baa50e75533e1fbeab169cdfe532c99b9ec5daf5e85c1b09e9898f6af9e3/_data",
                      "Destination": "/dataVolumeContainer1",
                      "Driver": "local",
                      "Mode": "",
                      "RW": true,
                      "Propagation": ""
                  },
                  {
                      "Type": "volume",
                      "Name": "94e57b312fc3e44ee6029b94af08ab265dea04a0ccf34ab717bd17eea0ac419f",
                      "Source": "/var/lib/docker/volumes/94e57b312fc3e44ee6029b94af08ab265dea04a0ccf34ab717bd17eea0ac419f/_data",
                      "Destination": "/dataVolumeContainer2",
                      "Driver": "local",
                      "Mode": "",
                      "RW": true,
                      "Propagation": ""
                  }
              ],
      

    数据卷容器

    命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

    容器间传递共享(--volumes-from)

    1. 以上面的DockerFile添加创建的镜像,先启动一个父容器dc01

      在dataVolumeContainer2新增内容

    2. 启动容器dc02/dc03继承自dc01

      docker run -it --name dc02 --volumes-from dc01 hwj/centos
      
    3. 回到dc01可以看到02/03各自添加的都能共享了

    结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

  • 相关阅读:
    hdu 3790 最短路径问题
    hdu 2112 HDU Today
    最短路问题 以hdu1874为例
    hdu 1690 Bus System Floyd
    hdu 2066 一个人的旅行
    hdu 2680 Choose the best route
    hdu 1596 find the safest road
    hdu 1869 六度分离
    hdu 3339 In Action
    序列化和反序列化
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/12269302.html
Copyright © 2011-2022 走看看