docker start 重启容器会保留数据:容器可写层文件、已挂载的卷(Volumes)和绑定挂载(Bind Mounts)中的数据均原样保留;但执行 docker rm 后重建容器或未持久化写入临时路径则数据丢失。
直接用 docker start 就能拉起已停止的容器,并且默认保留所有文件变更——前提是这些变更写在容器的可读写层或挂载的卷里。
哪些数据会自动保留
容器停止再启动时,以下内容天然保留,无需额外操作:
-
容器自身的读写层文件:比如你在容器里用
echo "test" > /app/config.txt创建的文件,只要没删容器,docker start后还在 -
已配置的卷(Volumes):创建时加了
-v myvol:/data,重启后卷内数据原样存在 -
绑定挂载(Bind Mounts):用了
-v /host/path:/container/path,宿主机目录里的修改始终同步,不受容器启停影响
哪些操作会导致数据丢失
不是启动方式的问题,而是误操作会丢数据:
- 执行
docker rm 容器名再docker run—— 这是新建容器,读写层清空,未持久化的文件就没了 - 没挂载卷或绑定目录,又把数据全写在
/tmp或/root这类非持久路径下,容器一删就消失 - 应用本身没做落盘(比如日志只打到 stdout,没写文件),那“重启”和“进程崩溃重连”效果一样,内存态数据自然不存
确保数据不丢的实用做法
日常操作中,按这几条做基本不会踩坑:
- 启动容器时,明确挂载存储:优先用命名卷
docker run -v app-data:/var/lib/app ...,比临时路径更可控 - 检查已有容器是否用了卷:
docker inspect 容器名 | jq '.Mounts',确认关键路径有对应挂载项 - 对已运行但没挂载的容器,不要硬改;稳妥做法是
docker commit保存当前状态为新镜像,再用新镜像 + 卷重新run - 避免依赖
docker restart来“救急”——它本质是 stop+start,对数据无额外保护,该丢的照样丢
验证数据是否真保留了
启动后快速确认两件事:
- 进容器看文件:
docker exec -it 容器名 ls -l /data/,对比上次写入的文件时间或内容 - 查挂载情况:
docker inspect 容器名 | grep -A 5 Mounts,确保路径映射关系和之前一致
不复杂但容易忽略:docker start 本身不改变任何存储行为,它只是唤醒一个“睡着的容器”,所有磁盘上的东西都在原地等着你回来。


















