Docker 容器退出/删除后如何保住数据?
容器可写层随删除消失,保数据靠三类挂载:命名卷(应用数据首选)、绑定挂载(要直接访问宿主机文件)、tmpfs(反之,内存不留痕);另有 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 # 找到退出的容器
docker cp exited-app:/app/data ./rescue
整个目录拷出来,确认数据齐了再删容器。
三种持久化方式怎么选
| 方式 | 数据位置 | 适用 |
|---|---|---|
| 命名卷 | Docker 管理的宿主机目录 | 数据库、应用数据(首选,权限/迁移友好) |
| 绑定挂载 | 你指定的宿主机路径 | 配置文件、代码、要直接读写的日志 |
| tmpfs | 内存 | 反向需求:敏感数据不留盘 |
数据库类数据的特别强调
- 数据库容器必须挂卷,且备份用 mysqldump/pg_dump 等工具做逻辑备份,不能只指望卷
- 升级镜像时先备份再换容器,验证新容器读写正常
- 卷也别忘纳入宿主机级备份策略
观测云对照
日志数据的持久化交给采集链路。 应用日志与其靠容器内文件,不如实时采集到观测云:容器生灭与日志留存解耦,存储策略集中管理,随时可查历史。
常见问题(FAQ)
Q:容器还在运行,数据安全吗?
A:运行中可写层一直在;但宿主机故障、误 rm 都会丢,重要数据挂卷+备份双保险。
Q:docker stop 会丢数据吗?
A:不会,stop 只停进程;docker rm 才删可写层。
Q:匿名卷是什么?
A:-v /app/data(不指名)或 Dockerfile 的 VOLUME 指令产生的随机名卷,容器删后易成无主残留,定期 docker volume ls -f dangling=true 检查。