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文件
    
    

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

原文地址:https://www.cnblogs.com/xujunkai/p/13031586.html