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