Docker 容器退出/删除后如何保住数据?
容器可写层随删除消失,持久数据用命名卷或绑定挂载;tmpfs 用于临时数据,可能进入 swap。另有 docker cp 抢救已退出但尚未删除的容器数据。
核心认知:容器的文件写入默认可写层,容器删除即丢失。保数据必须在写入时就落到容器外——命名卷(docker run -v mydata:/app/data,数据库等首选)、绑定挂载(-v /host/path:/app/data,配置/日志直读宿主机)、或宿主机目录挂载。容器已退出还没删?docker cp 还能把数据抢救出来。
预防:写入时就挂卷
docker volume create appdata
docker run -d -v appdata:/app/data myimage
重建时复用同一卷可保留 /app/data 的内容,但不要删除该卷,且卷仍需备份。
抢救:容器已退出但未删除
已退出的容器可写层还在磁盘上:
docker ps -a # 找到退出的容器
mkdir -p ./rescue
docker cp exited-app:/app/data/. ./rescue/
整个目录拷出来,确认数据齐了再删容器。
三种挂载方式怎么选
| 方式 | 数据位置 | 适用 |
|---|---|---|
| 命名卷 | Docker 管理的宿主机目录 | 数据库、应用数据(首选,权限/迁移友好) |
| 绑定挂载 | 你指定的宿主机路径 | 配置文件、代码、要直接读写的日志 |
| tmpfs | 内存 | 反向需求:临时、非持久数据;可能进入swap,不保证不落盘 |
数据库类数据的特别强调
- 数据库应使用持久卷或适当的绑定挂载,且备份用 mysqldump/pg_dump 等工具做逻辑备份,不能只指望卷
- 升级镜像时先备份再换容器,验证新容器读写正常
- 卷也别忘纳入宿主机级备份策略
常见问题(FAQ)
Q:容器还在运行,数据安全吗?
A:运行中可写层一直在;但宿主机故障、误 rm 都会丢,重要数据挂卷+备份双保险。
Q:docker stop 会丢数据吗?
A:普通 stop 保留可写层;但以 --rm 创建的容器退出后会自动删除,tmpfs 内容也不会持久保留。
Q:匿名卷是什么?
A:-v /app/data(不指名)或 Dockerfile 的 VOLUME 指令产生的随机名卷,容器删后易成无主残留,可用 docker volume ls -f dangling=true 检查;--rm 或 rm -v 可能自动删除关联匿名卷,命名卷语义不同。