容器数据卷(Volumes)
容器数据卷概述
- Docker 镜像是分层结构,联合挂载,镜像中各层的文件都是只读的,容器中所有文件对外可见的状态是多层叠加后的可见状态。因此对于IO性能要求较高的容器,如果使用Overlayfs会严重影响容器的性能。
- 另外,容器在生命周期结束的时候会被删除,对于有数据持久化要求的容器而言,容器运行中有价值的数据并需要存储在外部的逻辑卷中。如果由容器直接使用共享存储系统,那么每次容器启动后都需要挂载,而且还需要具备与外界通信的能力,不仅繁琐,而且损失性能。
- 针对这种需求,docker推出了卷管理系统,在容器创建时直接使用宿主机的存储系统,当容器结束运行时,不会删除卷中的数据。

- 如图中,宿主机将远程NFS服务器中的数据盘挂载到本地/data/目录下,创建httpd容器时,将本地的/data/盘映射到容器中的网站根目录:/data/html中。
- 当httpd容器挂掉后,无论在哪台服务器,只要满足宿主机挂载NFS存储,并且httpd容器映射网站根目录到/data/html即可。针对不需要持久化存储的应用,则可以不使用存储卷管理。
- 将宿主机上的目录挂载到容器中有两种方式:
- Bind mount volume
手动指定宿主机目录和容器中目录的映射关系,或使用容器编排工具(k8s或者docker-compose)指定
- Docker-managed volume
Docker自动管理的挂载关系,这种情况下宿主机目录不固定,后期维护成本高,仅用于存放一些临时数据
使用数据卷
直接使用命令来挂载 -v
docker run -it -p 主机端口:容器内端口
docker run -it -v 主机目录:容器内目录
docker run -it -v /home/ceshi:/home centos /bin/bash
docker inspect 容器id 可以查看挂载信息
docker inspect 39f2fc482f42
...
"Mounts": [ 挂载
{
"Type": "bind",
"Source": "/home/ceshi", 主机内地址
"Destination": "/home", docker容器内的地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
...
测试,我们在主机的/home/ceshi下创建文件
[root@docker ceshi]
容器内数据同步
[root@39f2fc482f42 home]
maomao.py
然后我们在容器内创建文件
[root@39f2fc482f42 home]
主机内也同步了文件
[root@docker ceshi]
maomao.py zhuzhu.py
再次测试
将容器关闭,然后在maomao.py里面写入代码,再启动容器验证数据是否同步
vim maomao.py
print('hello maomao')
[root@docker ceshi]
hello maomao
验证成功
[root@39f2fc482f42 home]
print('hello maomao')