不能通过 docker export 和 docker import 迁移“运行状态”,因其仅导出容器文件系统快照,不保留环境变量、CMD/ENTRYPOINT、镜像层、端口映射、卷挂载及进程内存等运行时信息。

不能通过 docker export 和 docker import 迁移“运行状态”。
这两个命令处理的是容器的文件系统快照,不是正在运行的进程、网络连接、内存数据或容器启动时的完整上下文。它们导出的是容器退出后(或运行中)的根文件系统内容,不包含:
- 环境变量(
ENV)、工作目录(WORKDIR)、默认命令(CMD、ENTRYPOINT)等镜像元数据 - 历史 layer 信息(所有构建层被扁平化为单一层)
- 端口映射、卷挂载配置、重启策略、资源限制等运行时参数
- 正在执行的进程、打开的 socket、临时内存状态
所以,“运行状态”本身无法被 export/import 捕获或还原。
export/import 的真实用途
它适合迁移一个静态的、已配置好的文件系统环境,比如:
- 从一个干净的 Ubuntu 容器里装好 JDK、Python、配置文件,再 export 成基础开发镜像
- 将调试完成的 Web 应用容器(含编译产物、日志目录、上传目录结构)打包分发给测试同学快速拉起服务
- 在无网络或受限 registry 的离线环境中,传递一个轻量级、无构建历史的定制镜像
导出容器并重新运行的典型流程
假设你有一个叫 myapp 的容器,已配置好所需文件:
- 先停止容器:
docker stop myapp - 导出为 tar:
docker export -o myapp.tar myapp - 传到目标机器(如用 scp)
- 导入为新镜像:
docker import myapp.tar myapp:latest - 启动时必须显式指定入口命令,例如:
docker run -d -p 8080:8080 --name myapp-new myapp:latest /bin/bash -c "java -jar /app.jar"
注意:不加 /bin/bash -c "..." 或类似命令会报错 No command specified,因为 import 后的镜像没有原始 CMD。
想真正迁移“运行状态”该怎么做?
如果目标是让另一台机器上的容器行为一致(含数据、配置、启动逻辑),推荐组合使用:
-
commit + save/load:先
docker commit myapp myapp:v1生成带元数据和历史的镜像,再docker save -o myapp-v1.tar myapp:v1,传输后docker load -i myapp-v1.tar。这样能保留 CMD、EXPOSE、VOLUME 等声明,启动更接近原容器 -
配合数据卷备份:export/import 不处理挂载卷。若容器依赖外部卷(如
/data),需单独用tar打包对应宿主机目录,并在目标机还原后挂载 -
用 Docker Compose 描述运行时配置:把 port、env、volumes、restart 等写进
docker-compose.yml,配合镜像一起迁移,才是可复现的运维方式
export/import 是轻量快照工具,不是状态同步方案。用对场景,才能避免启动失败或行为偏差。











