全书目录

第十篇:Docker 完全指南 —— 国际港口集装箱宇宙

第九章:存储 —— 容器不是仓库,数据不能乱塞在柜子里

2 分钟 553 字 第 155 / 962 个阅读单元

Docker 初学者第二大误区是:

“我把数据写进容器里,不就保存了吗?”

不稳。

Docker 官方文档对存储区分得很明确:

  • 容器内部文件系统
  • volume
  • bind mount
  • tmpfs

最关键先讲前两个。

#1. 容器层不是长期仓库

容器内部写的数据,跟这个容器强绑定。你一删容器,这些数据大概率就没了。

所以容器更像:

text
临时运行货柜
不是永久仓库
#2. Volume —— Docker 管理的独立仓储区

Docker 官方文档对 volume 的核心思路是:

  • 数据存放在 Docker 管理的宿主机目录里
  • 生命周期可独立于容器
  • 更适合持久化应用数据
bash
docker volume create pgdata

docker run -d \
  --name pg \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data \
  postgres:17

这里:

  • 容器删了
  • pgdata 这个 volume 还在
  • 下次挂回去还能继续用
#3. Bind Mount —— 直接把宿主机路径挂进去

Docker 官方文档明确区分:

  • volume:由 Docker 管理
  • bind mount:直接映射宿主机路径
bash
docker run --mount type=bind,src="$(pwd)",dst=/app node:22-alpine

或者老写法:

bash
docker run -v "$(pwd)":/app node:22-alpine

官方文档还特别说明:

  • 一般更推荐 --mount
  • 因为更显式
  • 语义更清楚
  • 选项更完整
#4. Volume 和 Bind Mount 怎么选

最实用的判断:

text
开发时想把本地代码映进容器
→ bind mount

数据库、消息队列、长期数据目录
→ volume
#5. 一个非常重要的坑

Docker 官方文档明确提醒:

如果你把 bind mount 挂到容器中一个原本有内容的目录上,原内容会被“遮住”。

类比就是:

text
你把一整块外部仓库地面
直接盖到货柜内部已有货架上
原货架内容不是消失了
而是被新挂载遮住了