Docker 镜像与容器导出导入

离线或隔离内网里无法直接 pull/push 镜像,需要用 save/load 搬运镜像文件;export/import 则把运行中的容器打成快照。本章区分这两对命令的适用场景与差异。

docker save 与 docker load

save 把镜像连同全部历史层与元数据打包成 tar 文件,load 还原为镜像,适合跨机器、跨网络迁移:

docker save -o myapp-1.0.tar myapp:1.0
docker load -i myapp-1.0.tar
# 输出:Loaded image: myapp:1.0

支持一次打包多个镜像,并用 gzip 压缩减少体积:

docker save myapp:1.0 nginx:1.27-alpine -o bundle.tar
docker save myapp:1.0 | gzip > myapp.tar.gz     # 管道压缩后再传输
docker load -i myapp.tar.gz

docker export 与 docker import

export 把容器的文件系统导出为扁平 tar(不含镜像层与 CMD/ENTRYPOINT 等元数据);import 把该 tar 变成新镜像,启动命令需要重新指定:

docker export -o mysql-snapshot.tar mysql-prod     # 导出运行中容器的文件系统
docker import mysql-snapshot.tar mydb:snapshot     # 导入为镜像
docker run -d --name db-restore mydb:snapshot /entrypoint.sh mysqld   # 命令要重写

export 出的快照可作为「现场备份」恢复,但它不保留层结构与启动配置,别当普通镜像用。

两对命令对比

对比项save + loadexport + import
操作对象镜像运行中的容器
是否保留镜像层保留,可压缩、增量友好不保留,摊平成单层
是否保留 CMD/ENTRYPOINT 等元数据保留丢失,导入后要手动指定
典型用途镜像迁移、离线分发容器现场快照、排障取证

场景:离线内网部署

办公网与生产网隔离时,先在联网机器拉取或构建,save 打包拷入内网再 load:

docker pull myapp:1.0                   # 1. 联网机器拉取镜像
docker save -o /tmp/myapp.tar myapp:1.0 # 2. 打包(U 盘或内网传文件)
docker load -i /tmp/myapp.tar           # 3. 内网机器还原
docker images | grep myapp              # 4. 确认已加载

两台主机网络互通时还能免去中间文件:docker save myapp:1.0 | ssh server 'docker load'。

小结

迁移镜像用 save/load(保层、保配置、体积小),备份容器现场用 export/import(扁平快照、启动命令要重写);离线部署就是「联网打包 → 拷入内网 → load」三步。

笔记加载中…