Docker KubernetesNotes

第 06 章:存储

zjc 于 2026-01-06 发布

这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 容器层随容器删除而消失。持久化数据必须明确使用 Volume 或 Bind Mount,并理解它们的生命周期与备份方式。

6.1 三种挂载

类型 说明
volume Docker 管理卷
bind mount 挂载宿主机路径
tmpfs 内存文件系统
docker run -d \
  --name postgres \
  -e POSTGRES_PASSWORD=postgres \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16

6.2 Volume

docker volume create pgdata
docker volume ls
docker volume inspect pgdata

特点:

  1. 由 Docker 管理;
  2. 与容器生命周期解耦;
  3. 删除容器不会删除卷;
  4. 便于备份和迁移;
  5. 可由驱动接入远端存储。

6.3 Bind Mount

docker run --rm \
  -v "$PWD/app.conf:/etc/app/app.conf:ro" \
  my-app

适合开发热更新配置和代码,但路径依赖宿主机布局,生产更推荐 Volume 或配置管理。

6.4 tmpfs

docker run --rm \
  --tmpfs /tmp:size=100m,mode=1777 \
  my-app

适合临时文件和敏感临时数据,容器停止后消失。

6.5 数据备份

备份 PostgreSQL 卷:

docker run --rm \
  -v pgdata:/source:ro \
  -v "$PWD/backup:/backup" \
  alpine tar czf /backup/pgdata-$(date +%F).tar.gz -C /source .

恢复:

docker run --rm \
  -v pgdata:/target \
  -v "$PWD/backup:/backup" \
  alpine sh -c 'rm -rf /target/* && tar xzf /backup/pgdata-2026-08-25.tar.gz -C /target'

数据库应优先使用数据库原生备份工具,而不是只备份文件。

6.6 清理与风险

查看占用:

docker system df -v

删除:

docker volume rm pgdata
docker volume prune

docker volume prune 会删除未被容器引用的卷,执行前必须确认业务影响。

本章小结

Volume 适合持久数据,Bind Mount 适合开发配置,tmpfs 适合临时数据。备份要考虑应用一致性,清理卷前必须确认引用关系。

思考题

  1. 容器可写层和 Volume 有什么区别?
  2. Bind Mount 有哪些生产风险?
  3. 什么时候使用 tmpfs?
  4. 如何备份数据库容器?
  5. volume prune 为什么危险?