• Docker容器数据卷


    1.引入原因:

    Docker容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
    将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的。
    容器之间希望有可能共享数据。
    为了能保存数据在docker中使用卷。

    2.卷的目的及其特点:

    卷就是目录或者文件,存在于一个或多个容器中,由docker挂载到容器,但是不属于联合文件系统,因此能够绕过 Union File Ssystem 提供一些用于持续存储或共享数据的特性。
    卷的设计目的就是为了数据的持久化,完全独立于容器的生存周期,因此Docker不会再容器删除时删除其挂载的数据卷。

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

    3.作用:

    ①:容器的持久化
    ②:容器间继承+共享数据

    4.容器内添加数据卷

    方式一:直接命令添加

    //命令
    docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
    例如:
    docker run -it -v /myDataVolume:/dataVolumeContainer 镜像名
    //查看数据卷是否挂载成功
    docker inspect 308d75b6301
    //容器和宿主机之间数据共享
    //容器停止退出后,主机修改后数据是否同步
        完全同步
    //命令(带权限),容器内的目录只读
    docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
    

    方式二:DockerFile添加

    //根目录下新建mydocker文件夹进入
    mkdir /mydocker
    cd /mydocker
    
    //可在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
    //VOLUME指令:
    VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
    处于可移植性和分享的考虑,用-v主机目录:容器目录这种方法不能够直接在Dockerfile中实现
    由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录
    
    //File构建
    vim Dockerfile
    //输入的示例脚本内容为:
    # volume test
    FROM centos
    VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
    CMD echo "finished,--------success1"
    CMD /bin/bash
    
    //build后生成镜像
    docker build -f /mydocker/Dockerfile  -t gg/centos . 
    //执行成功后会出现Successfullu built xxxx  ,执行 docker images 会出现自己刚才生成的镜像 gg/centos
    
    //run容器
    docker run -it gg/centos 
    
    //主机对应默认地址
    "Type": "volume",
                "Name": "e640ae814d532dc7d59dd77c4207290daf78d3cf8af58df7980bbbb159854f5f",
                "Source": "/var/lib/docker/volumes/e640ae814d532dc7d59dd77c4207290daf78d3cf8af58df7980bbbb159854f5f/_data",
                "Destination": "/dataVolumeContainer1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
                
    /var/lib/docker/volumes/e640ae814d532dc7d59dd77c4207290daf78d3cf8af58df7980bbbb159854f5f/_data   
    //此地址即为默认的地址,在此地址内进行相应的操作,也可以实现文件共享。
    

    5.数据卷容器

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

    //以上一步新建的镜像 gg/centos 为模板并运行容器dc01/dc02/dc03
    它们已经具有容器卷:/dataVolumeContainer1
                    /dataVolumeContainer2 
    
    容器间传递共享(--volumes-from)
      //先启动一个父容器 (在dataVolumeContainer2中新增内容)
      
      //dc02/dc03继承自dc01
      docker run -it --name dc02 --volumes-from dc01 gg/centos
      cd dataVolumeContainer2
      ls -l   //可以看到dc01_add.txt
      touch dc02_add.txt   //在此容器的此目录下添加dc02_add.txt文件
      
      docker run -it --name dc03 --volumes-from dc01 gg/centos
      cd dataVolumeContainer2
      ls -l   //可以看到dc01_add.txt,dc02_add.txt
      touch dc03_add.txt   //在此容器的此目录下添加dc03_add.txt文件
      
      //回到dc01可以看到02/03各自添加的都能共享了
      docker attach dc01
      ls -l  //可以看到dc01_add.txt,dc02_add.txt,dc03_add.txt
      
      //删除dc01,dc02修改后dc03可否访问
      可以正常访问,并且执行 ls -l 可以看到上面的三个文件
      
      //删除dc02后dc03可否访问
      可以访问,并且删除dc01后在dc02中的文件操作依旧和dc03共享
      
      //新建dc04继承dc03后在删除dc03
      dc04依旧能正常访问,并且可以对上面的文件共享
      
      //结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
  • 相关阅读:
    [ASP.NET][实例]用户控件的设计与使用
    构造器[java、C#]
    [转]clob和blob两个字段什么分别?
    C#的反射机制调用方法
    C# WinForm 控件美化之改变ListView Head 的背景色
    C# 创建快捷方式
    Copy Html To Clipboard
    改善C#程序的建议在线程同步中使用信号量
    Paste html from Clipboard
    Winform部署mshtml程序集出错的一个解决方案
  • 原文地址:https://www.cnblogs.com/gujun1998/p/11954432.html
Copyright © 2020-2023  润新知