Docker将镜像搬移到其他服务上的方法
导出/加载镜像(保留分层、标签)和导出/导入容器快照(仅文件系统,丢失镜像历史与标签)。
一、把镜像打包带走(推荐)
适合把一个或多个镜像搬到离线/内网机器,保留分层与标签。
- 在源服务器导出(可压缩)
# 单个镜像
docker image save -o myapp_v1.2.tar myrepo/myapp:1.2# 多个镜像一起导出
docker image save -o pack.tar myrepo/myapp:1.2 redis:7-alpine nginx:1.27# 管道压缩(体积更小)
docker image save myrepo/myapp:1.2 | gzip > myapp_v1.2.tar.gz
- 传到目标服务器
任选其一:scp
/rsync
/U盘等
scp myapp_v1.2.tar.gz user@target:/tmp/
- 在目标服务器加载
# 若是压缩包
gunzip /tmp/myapp_v1.2.tar.gz
docker image load -i /tmp/myapp_v1.2.tar# 或者直接管道
gzip -dc /tmp/myapp_v1.2.tar.gz | docker image load
- 验证并运行
docker images | grep myapp
docker run --rm myrepo/myapp:1.2 --version
📌 小贴士
-
tar 内已包含标签;加载后会出现同名镜像与标签。若需要改名:
docker tag myrepo/myapp:1.2 registry.local/myapp:1.2
-
大文件可拆分传输:
split -b 2G myapp_v1.2.tar myapp.part. cat myapp.part.* > myapp_v1.2.tar
-
校验完整性:
sha256sum myapp_v1.2.tar # 源与目标对比
二、直接通过 SSH “边导边载”(省文件落地)
# 从源机把镜像流式传到目标机并加载
docker image save myrepo/myapp:1.2 | ssh user@target 'docker image load'
三、导出/导入“容器快照”(不是镜像)
如果你想把正在运行或运行过的容器的文件系统(含运行期数据的修改)打包走,用 export/import
。注意:这不会保留镜像分层、历史、ENV、CMD 等元数据。
- 在源服务器导出容器(先找容器名/ID)
docker ps -a
docker export -o myapp-rootfs.tar CONTAINER_ID_OR_NAME
- 传到目标服务器后导入成“新镜像”
docker import myapp-rootfs.tar myapp:from-export
- 运行时需自己补齐启动命令/环境变量/端口等:
docker run -e FOO=bar -p 8080:8080 myapp:from-export my_start_cmd --args
四、另一种思路:用镜像仓库同步
如果目标环境能访问源仓库或私有仓库,这是最省事的做法:
# 源机打标签并推送到私有仓库
docker tag myrepo/myapp:1.2 registry.local/myapp:1.2
docker login registry.local
docker push registry.local/myapp:1.2# 目标机拉取
docker login registry.local
docker pull registry.local/myapp:1.2
五、常见问题排查
-
no space left on device
:目标机磁盘或 Docker 数据分区不足,清理后重试:docker system df docker system prune -af # ⚠ 会删未使用对象,谨慎
-
open ... permission denied
:确保当前用户能访问 tar 文件路径,必要时用sudo
。 -
manifest unknown
:从仓库拉取时的标签错误或未推送该标签,先docker images
核对。 -
SELinux/权限导致加载失败:尝试放到
/tmp
或关闭强制策略测试。
如果你告诉我要搬运的镜像列表、体积和网络情况(能否 SSH/能否访问仓库),我可以按你的场景给一套最省事的命令串。