igozhang

——

    镜像传输通用手册

    跨基地场景下,因网络隔离无法直推时:在基地 A pullsave,将产物带到基地 B loadtagpush


    1. 场景与约定

    说明
    基地 A 源 Harbor / 源仓库,可 pull
    传输物 docker save 生成的 .tar(或压缩包)
    基地 B 目标 Harbor,需 loadtagpush
    执行位置 有 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盘 / 网盘 / 堡垒机 ──────────────────────────┘
    

    原则:

    1. 先确认环境,再变更(版本、磁盘、登录态)。
    2. load / push 会占磁盘与带宽,尽量在维护窗口或测试机执行。
    3. 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> — 直接带原 tag
    • Loaded 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

    常见原因:

    1. 凭证错位:用户登录了,sudo 未带上(用 --config $HOME/.dockersudo docker login)。
    2. 项目权限不足:账号对目标项目无 push(联系 Harbor 项目管理员授权)。
    3. 项目/仓库名写错:路径与现网项目不一致或无权限。

    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 镜像迁移通用参考。仓库地址、项目名、账号以各基地现网为准。

    MP3