zoukankan      html  css  js  c++  java
  • Docker篇章6:Docker容器数据卷

    Docker篇章6:Docker容器数据卷

    • 首先将运行的环境打包形成容器来运行,但是我们对数据的要求希望是持久化的,容器之间要共享数据

    • docker容器产生的数据,如果不通过docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没了。为了能够保存数据在docker中我们使用卷,它类似于redis的持久化存储(RDB or AOF),它能够使容器数据持久化存储,容器间数据共享。

    • 特点:

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

    容器内添加数据卷

    1.命令添加

    • 直接在run时候命令添加

      docker run -it -v /宿主机的绝对路径:/容器内目录 [--privileged=true] 镜像名
      
      docker run -it -v /myDataVolume:/dataVolumeContainer centos
      # 执行上面命令会在宿主机根目录生成myDataVolume文件夹,并且启动的容器centos系统根目录内会生成dataVolumeContainer文件夹
      
    • 检查

      docker inspect 容器ID
      # 可以看到如下图,主机文件myDataVolume和容器内文件dataVolumeContainer进行绑定
      

    • cd /myDataVolume 到主机内myDataVolume文件下创建文件

      touch demo.txt
      
    • 此时容器内cd /dataVolumeContainer然后执行命令:

      [root@6a5f30987ade dataVolumeContainer]# ls
      demo.txt
      # 可以看到,主机创建的文件容器内也能看到
      
    • 容器内,编辑demo.txt

      echo "hello" >> demo.txt
      
    • 在主机执行,cat demo.txt 可以看到容器内编辑的文本

      [root@oldboy myDataVolume]# cat demo.txt 
      hello
      

      可以看到容器和宿主机之间数据共享。

    • 如果容器停止退出后,主机修改后数据是否同步

      # 关闭容器
      [root@6a5f30987ade dataVolumeContainer]# exit
      # 修改主机下myDataVolume  下demo.txt文件
      echo "hello world" > demo.txt
      # 启动刚才停止容器
      docker start 6a5f30987ade
      # 查看demo.txt
      [root@oldboy myDataVolume]# cat demo.txt 
      hello world
      

      只要启动容器还是同步数据。

    2.命令添加(带有权限)

    • 带有写保护,表示容器内的目录只读,不可写:

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

      容器内数据只允许查看,不能进行增删改。

    3.DockerFile添加

    • DockerFile是对镜像的描述模板文件。

    • 编写docker准备工作

      # 根目录下添加mydocker
      mkdir mydocker
      cd mydocker
      # 编写dockerfile
      vim mydockerfile
      
    • 构建

      # 可在Dockerfile中使用VOLUME指令来给镜像添加一个多个数据卷
      写入内容如下:
      # volume test
      FROM centos		#引入centos
      VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]#容器内创建2个数据卷用于与宿主机数据共享
      CMD echo " finished,-----success"#打印成功
      CMD /bin/bash
      
      
      #其实上面命令相当于:
      docker run -it -v /host1:/dataVolumeContainer1 -v /host1:/dataVolumeContainer2 centos /bin/bash
      
    • 用dockerfile构建自定义镜像

      docker build -f dockerfile路径 -t 镜像名
      docker build -f /mydocker/mydockerfile -t xjk/centos .#点表示当前路径
          Step 1/4 : FROM centos
           ---> 470671670cac
          Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
           ---> Running in fc3dab22127a
          Removing intermediate container fc3dab22127a
           ---> 82a10278b981
          Step 3/4 : CMD echo "finished,-----success"
           ---> Running in 047e68638e59
          Removing intermediate container 047e68638e59
           ---> 06bda10b7dd9
          Step 4/4 : CMD /bin/bash
           ---> Running in 057f899ab30d
          Removing intermediate container 057f899ab30d
           ---> a3e53fed0404
          Successfully built a3e53fed0404
          Successfully tagged xjk/centos:latest
      
    • 运行

      docker run -it xjk/centos /bin/bash
      [root@bf197575730a /]# ls
      	dataVolumeContainer2 dataVolumeContainer1 ...
      	#可以看到容器内新建了2个数据文件
      
    • 我们没有指定宿主机的存放数据文件路经,那么默认会分配到哪呢?

      docker inspect bf197575730a #bf197575730a为正在运行容器ID
      
    • 可以看到默认放入/var/lib/docker/volumes/.... 下目录:

      当然无论在宿主机增删改查,还是在容器内文件目录增删改查,数据都是能同步的。

    4.数据卷容器内数据生命周期

    • 主机到容器,容器到主机的硬盘进行挂载,实现数据传递的依赖。

      # 新建容器dc01
      docker run  -it --name dc01 xjk/centos
      # 在容器内共享数据文件夹dataVolumeContainer2内创建dc01-test.txt
      # 再启动一个容器dc02继承dc01,此时dc02容器的共享数据文件夹dataVolumeContainer2内有dc01-test.txt
      docker run -it --name dc02 --volumes-from dc01 xjk/centos
      # 并且在dc02创建 touch dc02-test.txt,dc01也是共享的。
      # 当dc01容器关闭并删除掉
      docker rm -f dc01
      # 此时其他容器还是能访问dc01容器创建的 dc01-test.txt文件
      
      

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

  • 相关阅读:
    问题解决-Plugin with id 'com.github.dcendents.android-maven' not found
    hadoop 04 一 HA高可用配置
    hadoop 03 一 Hadoop机架感知配置
    Windows平台安装配置Hadoop
    hadoop 02一 hadoop配置
    hadoop 01一 hadoop安装配置
    Centos7下载和安装教程
    mysql 命令行导出数据
    RabbitMQ 集群部署(linux-centos6.5)
    Spring 集成RabbitMq
  • 原文地址:https://www.cnblogs.com/xujunkai/p/13031586.html
Copyright © 2011-2022 走看看