关键是要用命名卷(Named Volume)持久化——Docker自动管理路径与权限,数据独立于容器生命周期,重启、重建或删除容器均不丢失;适用于数据库、应用状态等核心数据,禁用匿名卷和绑定挂载于生产环境。

要让容器更新或重启时数据不丢,关键不是“不让容器变”,而是把数据从容器里“搬出来”,放到它生命周期管不到的地方。最稳妥的做法,就是用 Docker 官方推荐的 命名卷(Named Volume) 做持久化映射——它由 Docker 自动管理路径、权限和清理逻辑,不依赖你手动指定宿主机目录,也不随容器起落而消失。
明确目标:哪些数据必须挂卷?
不是所有文件都需要持久化,重点盯住这几类:
-
数据库主数据目录:比如 PostgreSQL 的
/var/lib/postgresql/data、MySQL 的/var/lib/mysql -
应用状态目录:n8n 的
/home/node/.n8n(存工作流和凭据)、Nextcloud 的/var/www/html/data - 用户上传或生成的静态资源:如图片、PDF、日志归档等写入型内容
用命名卷实现安全挂载(生产首选)
命名卷由 Docker 全权托管,适合生产环境。执行以下三步即可生效:
- 创建卷:
docker volume create pgdata - 启动容器并挂载:
docker run -d --name pg-prod -v pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123 -p 5432:5432 postgres:15 - 验证是否生效:
docker volume inspect pgdata查看挂载路径;进容器执行ls /var/lib/postgresql/data确认有 base、global 等目录
此后无论 docker stop/start、docker restart,甚至删掉容器再用同样命令 docker run 重建,只要还挂这个 pgdata 卷,数据就原样保留。
绑定挂载只用于开发调试,慎用于生产
绑定挂载(-v /host/path:/container/path)虽然直观,但存在风险:
- 宿主机路径需提前创建且权限匹配(PostgreSQL 要求
uid=999),否则容器启动失败 - 路径硬编码后迁移困难,不同机器环境易出错
- 误删宿主机目录 = 数据永久丢失,Docker 不做任何保护
仅建议在本地开发时同步配置文件或代码,例如:docker run -v $(pwd)/conf:/etc/nginx/conf.d nginx。数据库、核心服务一律避开。
避免常见陷阱
几个高频翻车点务必注意:
- 不要用匿名卷(没名字的
-v /path)做关键数据存储——它无法被显式引用,容器删了就很难找回 - 启动容器时若忘记加
-v参数,即使镜像内已有数据,也不会自动迁移到卷中;必须先备份容器内数据,再挂卷重导 - 多个容器挂同一卷时,确认它们对目录的读写权限一致,尤其注意 PostgreSQL 和 MySQL 对
data目录的属主要求
不复杂但容易忽略。只要坚持用命名卷挂载关键路径,容器怎么更新、重建、迁移,数据都稳稳留在那里。


















