Docker 初学者第二大误区是:
“我把数据写进容器里,不就保存了吗?”
不稳。
Docker 官方文档对存储区分得很明确:
- 容器内部文件系统
- volume
- bind mount
- tmpfs
最关键先讲前两个。
#1. 容器层不是长期仓库
容器内部写的数据,跟这个容器强绑定。你一删容器,这些数据大概率就没了。
所以容器更像:
临时运行货柜
不是永久仓库#2. Volume —— Docker 管理的独立仓储区
Docker 官方文档对 volume 的核心思路是:
- 数据存放在 Docker 管理的宿主机目录里
- 生命周期可独立于容器
- 更适合持久化应用数据
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:直接映射宿主机路径
docker run --mount type=bind,src="$(pwd)",dst=/app node:22-alpine或者老写法:
docker run -v "$(pwd)":/app node:22-alpine官方文档还特别说明:
- 一般更推荐
--mount - 因为更显式
- 语义更清楚
- 选项更完整
#4. Volume 和 Bind Mount 怎么选
最实用的判断:
开发时想把本地代码映进容器
→ bind mount
数据库、消息队列、长期数据目录
→ volume#5. 一个非常重要的坑
Docker 官方文档明确提醒:
如果你把 bind mount 挂到容器中一个原本有内容的目录上,原内容会被“遮住”。
类比就是:
你把一整块外部仓库地面
直接盖到货柜内部已有货架上
原货架内容不是消失了
而是被新挂载遮住了