镜像传输通用手册
跨基地场景下,因网络隔离无法直推时:在基地 A pull 并 save,将产物带到基地 B load → tag → push。
1. 场景与约定
| 项 | 说明 |
|---|---|
| 基地 A | 源 Harbor / 源仓库,可 pull |
| 传输物 | docker save 生成的 .tar(或压缩包) |
| 基地 B | 目标 Harbor,需 load、tag、push |
| 执行位置 | 有 Docker 的跳板机 / 业务机 |
示例(可替换为实际值):
原镜像:<源Harbor>:<端口>/<源项目>/<镜像名>:<tag>
新镜像:<目标Harbor>/<目标项目>/<镜像名>:<tag>
传输文件:<镜像包>.tar
2. 总体流程
基地 A 传输介质 基地 B
────── ──────── ──────
docker login (源) docker login (目标)
docker pull docker load -i xxx.tar
docker save -o xxx.tar docker tag <id|旧tag> <新tag>
│ docker push <新tag>
└────────── scp / U盘 / 网盘 / 堡垒机 ──────────────────────────┘
原则:
- 先确认环境,再变更(版本、磁盘、登录态)。
- load / push 会占磁盘与带宽,尽量在维护窗口或测试机执行。
sudo docker与普通用户 docker 的登录凭证相互独立(常见踩坑)。
3. 基地 A:拉取并导出
在能访问源仓库的机器上执行。
3.1 确认 Docker(按需 sudo)
sudo docker version
若报 permission denied 访问 docker.sock,确认是否使用了 sudo。
3.2 登录源仓库并拉取
sudo docker login <源Harbor地址>
sudo docker pull <原镜像完整tag>
3.3 导出为 tar
会生成本地文件,占用磁盘。
sudo docker save -o ./镜像名_tag.tar <原镜像完整tag>
ls -lh ./镜像名_tag.tar
将 .tar 传到基地 B(scp、堡垒机上传等,按现网规范)。
4. 基地 B:加载、打 tag、推送
以下命令默认在基地 B 目标机执行。
4.1 确认文件与 Docker
ls -lh <镜像包>.tar
sudo docker version
确认磁盘空间充足(建议可用空间 > tar 大小 × 2)。
4.2 确认本地是否已有镜像
sudo docker images | grep <关键字>
若已存在且 tag 正确,可跳过 load。
4.3 加载镜像(变更:写入本地镜像存储)
sudo docker load -i <镜像包>.tar
成功时常见两种输出:
Loaded image: <仓库>:<tag>— 直接带原 tagLoaded image ID: sha256:...— 仅有镜像 ID,无 tag(后续必须docker tag)
4.4 打新 tag(变更:仅增加本地引用,不改镜像内容)
有原 tag 时:
sudo docker tag <原镜像完整tag> <新镜像完整tag>
仅有镜像 ID 时:
sudo docker tag sha256:<完整或短 ID> <新镜像完整tag>
确认:
sudo docker images | grep <关键字>
4.5 确认目标 Harbor 登录态
sudo docker 读的是 root 的配置(通常 /root/.docker/config.json),不是当前用户 $HOME/.docker/config.json。
核对(只读,不打印密码):
grep <目标Harbor主机名> "$HOME/.docker/config.json"
sudo grep <目标Harbor主机名> /root/.docker/config.json
| 情况 | 处理 |
|---|---|
| 当前用户已登录,root 无配置 | sudo docker --config $HOME/.docker push ... |
| root 未登录 | sudo docker login <目标Harbor> |
| 两边都无 | 先 docker login(注意是否带 sudo) |
docker login <目标Harbor>
或:
sudo docker login <目标Harbor>
同时确认账号对目标项目有 push 权限。
4.6 推送(变更:向远程仓库上传)
当前用户已登录、root 无凭证时:
sudo docker --config $HOME/.docker push <新镜像完整tag>
若已用 sudo docker login 写好 root 凭证:
sudo docker push <新镜像完整tag>
成功标志:末尾出现 digest: sha256:...。
4.7(可选)清理本地
推送验证通过后,按需删除 tar 与本地镜像,释放磁盘:
sudo docker rmi <新镜像完整tag>
rm -f <镜像包>.tar
5. 一次完整命令清单(基地 B 最短路径)
将下方占位符换成实际值后,按序执行。
# 1) 环境
ls -lh <镜像包>.tar
sudo docker version
# 2) 加载
sudo docker load -i <镜像包>.tar
# 3) 打 tag(按 load 结果选一种)
sudo docker tag <原tag或sha256:ID> <新tag>
sudo docker images | grep <关键字>
# 4) 推送(使用当前用户已有登录配置时)
sudo docker --config $HOME/.docker push <新tag>
6. 常见问题
6.1 permission denied ... docker.sock
当前用户不在 docker 组。短期用 sudo docker;长期可将用户加入 docker 组(需重新登录,属权限变更,按运维规范审批)。
6.2 unauthorized ... action: push
常见原因:
- 凭证错位:用户登录了,
sudo未带上(用--config $HOME/.docker或sudo docker login)。 - 项目权限不足:账号对目标项目无 push(联系 Harbor 项目管理员授权)。
- 项目/仓库名写错:路径与现网项目不一致或无权限。
6.3 load 后没有原来的 Repository:Tag
save 时若按 ID 导出,或某些环境只保留 ID。用 docker tag sha256:... <新tag> 即可,不影响内容。
6.4 生产资源
load/push会占磁盘 IO 与网络带宽,尽量在维护窗口或测试机执行。- 大镜像会跑一段时间属正常,等命令结束即可。
6.5 TLS / 证书 / insecure-registry
若推送报证书错误,需将目标 Harbor 配入 Docker insecure-registries 或补全证书(属 Docker daemon 配置变更,需运维确认)。
文档用途:跨基地 Docker 镜像迁移通用参考。仓库地址、项目名、账号以各基地现网为准。