跳到主要内容

Docker存储架构

Docker 存储管理是 Docker 容器化技术中的重要部分,涉及镜像、容器、卷(Volumes)和绑定挂载(Bind Mounts)等的存储管理。在使用命令管理 Docker 存储之前,我们先了解 Docker 存储架构。

分层存储

Docker 使用分层存储机制来管理镜像和容器的文件系统:

  • 镜像层(Image Layers): 镜像是只读的,由多个分层文件系统组成。每一层代表 Dockerfile 中的一个指令。
  • 容器层(Container Layer): 容器在镜像的基础上添加一个可写层,用于存储运行时产生的数据。
  • 永久存储:
    • 数据卷(Volumes): 用于持久化容器数据,独立于容器的生命周期。(数据卷文件通常在/var/lib/docker/volumes路径下)
    • 绑定挂载(Bind Mounts): 将宿主机文件或目录直接挂载到容器中。(容器删除时,绑定挂载的目录仍然存在,因为它是宿主机的路径,Docker并不管理它。

Docker存储架构.drawio

分层存储的优缺点:

优点缺点
节省存储空间:多个镜像共享相同层,减少重复存储。性能开销:多层叠加可能导致性能下降,尤其在高频读写时。
加速构建与分发:复用现有层,只需传输新增层,提升效率。复杂性增加:多层结构使调试和管理更复杂。
简化管理:每层代表一个修改步骤,便于追踪和组合。存储碎片化:层数增加可能导致存储碎片化,影响性能。
增强安全性:只读层防止篡改,容器修改隔离在可写层。安全性风险:某一层的漏洞可能影响所有依赖该层的镜像和容器。
灵活支持:适配多种存储驱动,适应不同需求。兼容性问题:不同存储驱动或平台间可能存在兼容性问题。

利大于弊。

存储驱动

分层存储通过镜像层(只读)和容器层(可写)的组合,实现了高效的存储管理。存储驱动是连接分层存储和主机文件系统的关键组件,决定了存储的性能和兼容性。

+-----------------------------+
| Container | # 容器(可写层)
+-----------------------------+
| Image Layer 3 | # 镜像层 3(只读)
+-----------------------------+
| Image Layer 2 | # 镜像层 2(只读)
+-----------------------------+
| Image Layer 1 | # 镜像层 1(只读)
+-----------------------------+
| Storage Driver | # 存储驱动(如 Overlay2、AUFS)
+-----------------------------+
| Host File System | # 主机文件系统(如 ext4、XFS)
+-----------------------------+

存储驱动决定了分层存储的实现方式,例如:

  • Overlay2:将多层文件系统叠加为单一视图。
  • AUFS:通过联合挂载实现多层合并。
  • Btrfs:利用 Btrfs 的快照功能实现分层存储。

Docker 存储优化建议

  • 使用卷(Volumes)持久化数据: 避免将重要数据存储在容器的可写层中,使用卷来持久化数据。
  • 定期清理未使用的资源: 使用 docker system prune 定期清理未使用的镜像、容器和卷。
  • 选择合适的存储驱动: 在 Linux 上推荐使用 overlay2 存储驱动,性能较好且稳定。
  • 避免在容器中存储大量数据: 容器应尽量保持轻量,将数据存储在卷或外部存储系统中。

常用命令总结

命令功能描述
docker images查看镜像列表
docker rmi删除镜像
docker image prune清理未使用的镜像
docker ps -a查看容器列表
docker rm删除容器
docker container prune清理已停止的容器
docker volume ls查看卷列表
docker volume create创建卷
docker volume rm删除卷
docker volume prune清理未使用的卷
docker system prune清理未使用的镜像、容器、卷和网络
docker inspect查看镜像、容器或卷的详细信息
docker info查看 Docker 系统信息,包括存储驱动