什么是Volume?
使用容器数据卷,数据可以存储到宿主主机磁盘上;实现数据持久化、数据共享!
特点
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
如何使用数据卷
一、命令行挂载
1、路径挂载
docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口
# -it 交互式进入
# -v volume卷技术
# -p 主机端口
这个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的,里面的数据可以共享。如果我们不知道数据卷是否挂载成功时,我们可以通过以下方式来检查数据卷的挂载结果。
docker inspect 容器id
上面的命令可以查看容器的详细情况,命令返回的是JSON格式的字符串,运行命令之后我们在返回的JSON字符串中找到Volumes属性,假如挂载成功的话,Volumes里面显示的绑定结果应该是你在挂载时输入的命令参数 (/宿主机绝对路径目录: /容器内目录 ),如果与你们之前输入的一致的话,证明挂载成功。
Volumes里面显示的绑定结果可能有多个,但是只要找到目标结果就可以。挂载之后,当容器停止运行的时候,宿主机上对数据卷做的内容修改是会同步到容器内的。
2、匿名挂载
docker run -d -P --name tomcat01 -v /usr/local/tomcat/webapps tomcat02:1.0
# 通过 -v 容器内路径
上面就是匿名挂载,只写了 -v 就只关联容器内的路径,没有写容器外的路径!
3、具名挂载
docker run -d -P --name tomcat02 -v juming-tomcat:/usr/local/tomcat/webapps tomcat02:1.0
# 通过 -v 卷名:容器内路径
小结
如何确定是具名挂载还是匿名挂载,还是指定路径挂载?
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主主机路径:/容器内路径 # 路径挂载
如何查看已挂载的卷列表:
docker volume ls
拓展
通过 -v 容器路径: ro rw 可以改变读写权限
命令 | 诠释 | 描述 |
ro | readonly | 只读,只能通过宿主主机来改变数据,容器内部是无法改变数据的 |
rw | readwrite | 可读可写,容器有权限操作读写 |
至于只写的话我们一般不会用到,要么就是读写,要么就是只读,而且我们可以通过docker inspect 来查看容器的volumesRW来查看容器内数据卷的读写权限。
二、DockerFile添加
DockerFile就是用来构建 docker 镜像的构建文件!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!
CMD echo "----start----"
FORM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
生成镜像文件docker命令
docker build -f /home/docker/docker-file/docker-file-01 -t joila/centos:1.0 .
启动前面打包的的镜像
上述的两个卷,和外部一定有关联的同步目录!
查看卷挂载的路径
测试在容器关联的映射卷(volume01)内添加文件,宿主主机是否有映射到关联的文件:
宿主主机:
这种方式在未来,使用的会越来越多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂载卷,那就要手动镜像挂载 -v 卷名:容器内路径!
更多DockerFile操作,请参考:点我跳转
多容器如何共用数据卷?
一、关键选项命令
--volumes-from
二、示例
启动基础的容器
docker run -it --name docker01 joila/centos:1.0
启动第二个容器,关联第一个基础容器的数据卷
docker run -it --name docker02 --volumes-from docker01 joila/centos:1.0
此时,我们在docker01容器或者docker02容器中任意添加文件,都会同时操作同一个容器数据卷;其核心操作命令就是 –volumes-from 实现两边数据卷数据同步!
注意:若是此时删除了docker01容器,docker02容器还是继续操作数据卷的!
总结:
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。