Docker 存储与数据共享
一、Docker存储基础
1、Docker镜像分层结构
- 容器由可读写的容器层和多个只读的镜像层组成
- 写时复制(Copy-on-Write) 机制:
- 新数据写入容器层
- 修改数据时,先从镜像层复制到容器层再修改
- 多层镜像中同名文件,容器中只显示最上层内容
2、联合挂载技术(Union Mount)
- 镜像层存储在
/var/lib/docker/<storage-driver>/
下 - 常用存储驱动:AUFS(Ubuntu)、OverlayFS(CentOS 7.1+)
- OverlayFS 是一种堆叠文件系统,不直接管理磁盘,而是合并多个目录
- Overlay2 是 Overlay 的改进版,inode 利用率更高
- 要求:Docker 17.06.02+,宿主机文件系统为 ext4 或 xfs
二、数据卷(Volume)类型
1、Bind Mounts(绑定挂载)
- 特点:
- 手动指定宿主机路径与容器路径的映射
- 支持文件和目录
- 可设置读写权限(默认读写,可设为只读
:ro
)
- 优点:灵活,可直接操作宿主机文件
- 缺点:依赖宿主机路径,移植性差
[root@docker ~]
[root@docker ~]
[root@docker ~]
[root@docker ~]

[root@docker ~]
2、Docker Managed Volume(Docker管理卷)
- 特点:
- Docker自动管理卷路径(默认在
/var/lib/docker/volumes/...
) - 容器启动时若目录不为空,会将其内容复制到卷中
- 支持 CLI 和 API 管理
- 优点:
[root@docker ~]
[root@docker ~]
[root@docker ~]
三、Volume 类型对比
特性 | Bind Mounts | Docker Managed Volume |
---|
路径指定 | 手动指定任意路径 | 自动在 /var/lib/docker/volumes/ |
对已有内容影响 | 隐藏并替换容器中原有内容 | 将容器中原有内容复制到卷 |
支持单个文件 | 支持 | 不支持 |
权限控制 | 支持只读(:ro ) | 默认读写,无法控制 |
移植性 | 差,依赖宿主机路径 | 强,不依赖具体路径 |
四、容器间数据共享
1、共享同一个 Volume
[root@docker ~]
[root@docker ~]
[root@docker ~]

2、Volume Container(数据卷容器)
- 创建一个专门提供卷的容器,其他容器通过
--volumes-from
共享
[root@docker ~]
[root@docker ~]
[root@docker ~]
[root@docker ~]

3、Data-Packed Volume Container(数据打包卷容器)
[root@docker ~]
FROM busybox:latest
ADD html /usr/share/nginx/html
VOLUME /usr/share/nginx/html
CMD [“/bin/bash”]
[root@docker ~]
[root@docker ~]
[root@docker ~]
五、总结
- Volume 类型:Bind Mounts 和 Docker Managed Volume
- 数据共享方式:
- 共享同一 Volume
- Volume Container
- Data-Packed Volume Container(最适合静态数据、配置等)
- 持久化方式:使用
-v
或 --mount
挂载卷,实现容器数据的持久存储与共享