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依旧能正常访问,并且可以对上面的文件共享
  
  //结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
 
        作  者:sweetheart1998
        
        出  处:https://home.cnblogs.com/u/gujun1998/
        
        如有问题或建议,请多多赐教!
        
        版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
        
        如果您觉得文章对您有帮助,可以点击文章右下角推荐一下!
        
    

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号