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依旧能正常访问,并且可以对上面的文件共享
  
  //结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
原文地址:https://www.cnblogs.com/gujun1998/p/11954432.html