欢迎光临
我们一直在努力

高级java每日一道面试题-2026年01月17日-实战篇[Docker]-如何实现镜像的同步和复制?

Docker 镜像同步与复制:原理、方法与实践(Java 实战视角)

在微服务交付流程中,镜像的同步与复制是跨环境(开发、测试、生产)、跨地域(多数据中心、混合云)及离线场景下保证应用一致性的关键操作。它不同于备份,更强调在不同 Registry 或主机之间主动搬运镜像,确保镜像版本、层内容及元数据的完整传递。掌握多种同步复制方案及其适用场景,是高级 Docker 与 DevOps 工程师的必备能力。


一、镜像同步与复制的定义和场景

场景描述典型示例
跨 Registry 复制 将镜像从一个 Registry 原样复制到另一个(如 Docker Hub → 私有 Harbor) 将公共基础镜像缓存到内网仓库加速拉取;将 CI 产物推送到生产仓库
多数据中心同步 在两个或多个 Registry 实例之间保持镜像一致 主备 Harbor 间的镜像复制,实现异地灾备和就近拉取
离线环境同步 在没有网络连接的环境中传递镜像 将镜像打包为 tar 文件,通过移动介质传输后导入离线 Registry
多架构镜像的完整同步 复制时不丢失 Manifest List,保持多平台支持 将 amd64/arm64 多架构 Java 镜像从构建仓库同步到部署仓库

二、核心方式概览

方法基本原理适用场景是否保留多层/元数据自动化程度
docker pull/tag/push 本地拉取 → 重新打标签 → 推送到目标仓库 临时复制少量镜像 低(手动或脚本)
docker save/load 将镜像层及清单导出为 tar,再导入本地或推送到仓库 物理隔离/离线环境
Registry 内置复制(如 Harbor) 在 Registry 服务器间直接传输 Blob 和 Manifest,无需本地中转 跨数据中心持续同步 高(事件驱动/定时)
专业工具(skopeo, crane) 直接调用 Registry API,实现无需本地 Docker 引擎的镜像复制 高效批量复制、CI 集成

三、基于 Docker 命令的复制(pull / tag / push)

此方式使用 Docker CLI 作为客户端,在本地主机上完成“拉取-标记-推送”三步曲。其理论本质是利用本地 Docker 守护进程作为中转站,将源 Registry 的镜像逐层下载到本地,然后重新上传到目标 Registry。

目标 Registry源 Registry本地 Docker 守护进程运维人员/脚本目标 Registry源 Registry本地 Docker 守护进程运维人员/脚本#mermaid-svg-MnxVFssOxlWUnM1V{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MnxVFssOxlWUnM1V .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MnxVFssOxlWUnM1V .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MnxVFssOxlWUnM1V .error-icon{fill:#552222;}#mermaid-svg-MnxVFssOxlWUnM1V .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MnxVFssOxlWUnM1V .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MnxVFssOxlWUnM1V .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MnxVFssOxlWUnM1V .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MnxVFssOxlWUnM1V .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MnxVFssOxlWUnM1V .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MnxVFssOxlWUnM1V .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MnxVFssOxlWUnM1V .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MnxVFssOxlWUnM1V .marker.cross{stroke:#333333;}#mermaid-svg-MnxVFssOxlWUnM1V svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MnxVFssOxlWUnM1V p{margin:0;}#mermaid-svg-MnxVFssOxlWUnM1V .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-MnxVFssOxlWUnM1V text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-MnxVFssOxlWUnM1V .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-MnxVFssOxlWUnM1V .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-MnxVFssOxlWUnM1V .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-MnxVFssOxlWUnM1V .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-MnxVFssOxlWUnM1V #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-MnxVFssOxlWUnM1V .sequenceNumber{fill:white;}#mermaid-svg-MnxVFssOxlWUnM1V #sequencenumber{fill:#333;}#mermaid-svg-MnxVFssOxlWUnM1V #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-MnxVFssOxlWUnM1V .messageText{fill:#333;stroke:none;}#mermaid-svg-MnxVFssOxlWUnM1V .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-MnxVFssOxlWUnM1V .labelText,#mermaid-svg-MnxVFssOxlWUnM1V .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-MnxVFssOxlWUnM1V .loopText,#mermaid-svg-MnxVFssOxlWUnM1V .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-MnxVFssOxlWUnM1V .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-MnxVFssOxlWUnM1V .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-MnxVFssOxlWUnM1V .noteText,#mermaid-svg-MnxVFssOxlWUnM1V .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-MnxVFssOxlWUnM1V .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-MnxVFssOxlWUnM1V .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-MnxVFssOxlWUnM1V .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-MnxVFssOxlWUnM1V .actorPopupMenu{position:absolute;}#mermaid-svg-MnxVFssOxlWUnM1V .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-MnxVFssOxlWUnM1V .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-MnxVFssOxlWUnM1V .actor-man circle,#mermaid-svg-MnxVFssOxlWUnM1V line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-MnxVFssOxlWUnM1V :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}docker pull src-registry/app:v1.0请求 manifest,下载所有层镜像层数据存储镜像,标记为 src-registry/app:v1.0docker tag src-registry/app:v1.0 dst-registry/app:v1.0创建新标签,不复制数据docker push dst-registry/app:v1.0检查目标仓库现有层,仅上传缺失层和 manifest确认接收

优点:简单直观,适用于任何兼容 Registry。
缺点:需要本地存储镜像的所有层,对大型镜像(如完整 JDK 镜像)开销大;手动操作多,不适合大规模自动化。


四、离线镜像同步:save / load

对于无网络连接的物理隔离环境(如政务内网、军工网络),可以将镜像序列化为 tar 包,经移动介质传递后再加载。

#mermaid-svg-mRsBFJ92tMjT2fz0{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mRsBFJ92tMjT2fz0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mRsBFJ92tMjT2fz0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mRsBFJ92tMjT2fz0 .error-icon{fill:#552222;}#mermaid-svg-mRsBFJ92tMjT2fz0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mRsBFJ92tMjT2fz0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mRsBFJ92tMjT2fz0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mRsBFJ92tMjT2fz0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mRsBFJ92tMjT2fz0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mRsBFJ92tMjT2fz0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mRsBFJ92tMjT2fz0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mRsBFJ92tMjT2fz0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mRsBFJ92tMjT2fz0 .marker.cross{stroke:#333333;}#mermaid-svg-mRsBFJ92tMjT2fz0 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mRsBFJ92tMjT2fz0 p{margin:0;}#mermaid-svg-mRsBFJ92tMjT2fz0 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-mRsBFJ92tMjT2fz0 .cluster-label text{fill:#333;}#mermaid-svg-mRsBFJ92tMjT2fz0 .cluster-label span{color:#333;}#mermaid-svg-mRsBFJ92tMjT2fz0 .cluster-label span p{background-color:transparent;}#mermaid-svg-mRsBFJ92tMjT2fz0 .label text,#mermaid-svg-mRsBFJ92tMjT2fz0 span{fill:#333;color:#333;}#mermaid-svg-mRsBFJ92tMjT2fz0 .node rect,#mermaid-svg-mRsBFJ92tMjT2fz0 .node circle,#mermaid-svg-mRsBFJ92tMjT2fz0 .node ellipse,#mermaid-svg-mRsBFJ92tMjT2fz0 .node polygon,#mermaid-svg-mRsBFJ92tMjT2fz0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mRsBFJ92tMjT2fz0 .rough-node .label text,#mermaid-svg-mRsBFJ92tMjT2fz0 .node .label text,#mermaid-svg-mRsBFJ92tMjT2fz0 .image-shape .label,#mermaid-svg-mRsBFJ92tMjT2fz0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-mRsBFJ92tMjT2fz0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mRsBFJ92tMjT2fz0 .rough-node .label,#mermaid-svg-mRsBFJ92tMjT2fz0 .node .label,#mermaid-svg-mRsBFJ92tMjT2fz0 .image-shape .label,#mermaid-svg-mRsBFJ92tMjT2fz0 .icon-shape .label{text-align:center;}#mermaid-svg-mRsBFJ92tMjT2fz0 .node.clickable{cursor:pointer;}#mermaid-svg-mRsBFJ92tMjT2fz0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mRsBFJ92tMjT2fz0 .arrowheadPath{fill:#333333;}#mermaid-svg-mRsBFJ92tMjT2fz0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mRsBFJ92tMjT2fz0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mRsBFJ92tMjT2fz0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mRsBFJ92tMjT2fz0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mRsBFJ92tMjT2fz0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mRsBFJ92tMjT2fz0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mRsBFJ92tMjT2fz0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mRsBFJ92tMjT2fz0 .cluster text{fill:#333;}#mermaid-svg-mRsBFJ92tMjT2fz0 .cluster span{color:#333;}#mermaid-svg-mRsBFJ92tMjT2fz0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mRsBFJ92tMjT2fz0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mRsBFJ92tMjT2fz0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-mRsBFJ92tMjT2fz0 .icon-shape,#mermaid-svg-mRsBFJ92tMjT2fz0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mRsBFJ92tMjT2fz0 .icon-shape p,#mermaid-svg-mRsBFJ92tMjT2fz0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mRsBFJ92tMjT2fz0 .icon-shape .label rect,#mermaid-svg-mRsBFJ92tMjT2fz0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mRsBFJ92tMjT2fz0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mRsBFJ92tMjT2fz0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mRsBFJ92tMjT2fz0 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

有网络环境

源 Registry或本地镜像

docker save生成 myapp.tar

移动介质U盘/光盘/网闸摆渡

docker load导入到本地 Docker

目标 Registrydocker push

原理:

  • docker save 将镜像的所有层、manifest 和标签打包为一个 tar 文件。
  • docker load 还原完整镜像到本地 Docker。
  • 之后可通过 docker push 上传到目标 Registry。

关键点:

  • save 保留所有层历史和元数据,load 后镜像与源一致。
  • 当传输多架构镜像时,docker save 默认只保存当前架构的 Image Manifest,如需保存 Manifest List,需使用 docker buildx imagetools 或工具。

五、Registry 内置复制功能(以 Harbor 为例)

Harbor 提供了原生的复制引擎,无需本地中转,直接在两个 Registry 之间搬运镜像。它通过 Job Service 调度复制任务,支持推模式和拉模式。

5.1 复制架构

#mermaid-svg-nhXYDNbhJ6RuSk6H{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nhXYDNbhJ6RuSk6H .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nhXYDNbhJ6RuSk6H .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nhXYDNbhJ6RuSk6H .error-icon{fill:#552222;}#mermaid-svg-nhXYDNbhJ6RuSk6H .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nhXYDNbhJ6RuSk6H .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nhXYDNbhJ6RuSk6H .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nhXYDNbhJ6RuSk6H .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nhXYDNbhJ6RuSk6H .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nhXYDNbhJ6RuSk6H .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nhXYDNbhJ6RuSk6H .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nhXYDNbhJ6RuSk6H .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nhXYDNbhJ6RuSk6H .marker.cross{stroke:#333333;}#mermaid-svg-nhXYDNbhJ6RuSk6H svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nhXYDNbhJ6RuSk6H p{margin:0;}#mermaid-svg-nhXYDNbhJ6RuSk6H .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-nhXYDNbhJ6RuSk6H .cluster-label text{fill:#333;}#mermaid-svg-nhXYDNbhJ6RuSk6H .cluster-label span{color:#333;}#mermaid-svg-nhXYDNbhJ6RuSk6H .cluster-label span p{background-color:transparent;}#mermaid-svg-nhXYDNbhJ6RuSk6H .label text,#mermaid-svg-nhXYDNbhJ6RuSk6H span{fill:#333;color:#333;}#mermaid-svg-nhXYDNbhJ6RuSk6H .node rect,#mermaid-svg-nhXYDNbhJ6RuSk6H .node circle,#mermaid-svg-nhXYDNbhJ6RuSk6H .node ellipse,#mermaid-svg-nhXYDNbhJ6RuSk6H .node polygon,#mermaid-svg-nhXYDNbhJ6RuSk6H .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nhXYDNbhJ6RuSk6H .rough-node .label text,#mermaid-svg-nhXYDNbhJ6RuSk6H .node .label text,#mermaid-svg-nhXYDNbhJ6RuSk6H .image-shape .label,#mermaid-svg-nhXYDNbhJ6RuSk6H .icon-shape .label{text-anchor:middle;}#mermaid-svg-nhXYDNbhJ6RuSk6H .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-nhXYDNbhJ6RuSk6H .rough-node .label,#mermaid-svg-nhXYDNbhJ6RuSk6H .node .label,#mermaid-svg-nhXYDNbhJ6RuSk6H .image-shape .label,#mermaid-svg-nhXYDNbhJ6RuSk6H .icon-shape .label{text-align:center;}#mermaid-svg-nhXYDNbhJ6RuSk6H .node.clickable{cursor:pointer;}#mermaid-svg-nhXYDNbhJ6RuSk6H .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-nhXYDNbhJ6RuSk6H .arrowheadPath{fill:#333333;}#mermaid-svg-nhXYDNbhJ6RuSk6H .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nhXYDNbhJ6RuSk6H .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nhXYDNbhJ6RuSk6H .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nhXYDNbhJ6RuSk6H .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-nhXYDNbhJ6RuSk6H .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nhXYDNbhJ6RuSk6H .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-nhXYDNbhJ6RuSk6H .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nhXYDNbhJ6RuSk6H .cluster text{fill:#333;}#mermaid-svg-nhXYDNbhJ6RuSk6H .cluster span{color:#333;}#mermaid-svg-nhXYDNbhJ6RuSk6H div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-nhXYDNbhJ6RuSk6H .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-nhXYDNbhJ6RuSk6H rect.text{fill:none;stroke-width:0;}#mermaid-svg-nhXYDNbhJ6RuSk6H .icon-shape,#mermaid-svg-nhXYDNbhJ6RuSk6H .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nhXYDNbhJ6RuSk6H .icon-shape p,#mermaid-svg-nhXYDNbhJ6RuSk6H .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-nhXYDNbhJ6RuSk6H .icon-shape .label rect,#mermaid-svg-nhXYDNbhJ6RuSk6H .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nhXYDNbhJ6RuSk6H .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-nhXYDNbhJ6RuSk6H .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-nhXYDNbhJ6RuSk6H :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

Harbor 实例 B

Harbor 实例 A

创建复制任务

拉取镜像列表 / Blob

推送 Blob 和 Manifest

Harbor Core

Job Service

Registry

Registry

Harbor Core

5.2 两种复制模式

模式方向描述
推模式(Push) 本地 → 远端 本地 Harbor 主动将镜像推送到远端 Harbor。适合将内部镜像分发给边缘节点。
拉模式(Pull) 远端 → 本地 本地 Harbor 从远端 Harbor 拉取所需镜像。适合从 Docker Hub 等公共仓库代理缓存。

复制触发方式:

  • 手动触发:管理员在 UI 或 API 中执行。
  • 定时触发:Cron 表达式,定期同步。
  • 事件驱动:本地镜像推送成功后立即触发复制,实现近实时同步。
  • 过滤器:可按项目、仓库名、标签名(如 release-*)筛选复制范围,避免全量复制。

六、专业工具:skopeo 与 crane

这些工具直接与 Registry API 交互,不需要运行 Docker 守护进程,也没有本地镜像存储开销,非常适合于脚本和 CI 流水线。

工具主要能力特点
skopeo 复制镜像(skopeo copy) 支持跨仓库复制、支持格式转换(dir, oci, docker),可直接复制多架构镜像(默认保留 Manifest List)
crane 复制(crane copy)、镜像分析 基于 Go 容器库,轻量,可轻松处理 Manifest List,支持远程操作

工作流程(以 skopeo 为例):

目标 Registry源 Registryskopeo用户 / CI 脚本目标 Registry源 Registryskopeo用户 / CI 脚本#mermaid-svg-yfvD53GSEZ2mBYKE{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yfvD53GSEZ2mBYKE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yfvD53GSEZ2mBYKE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yfvD53GSEZ2mBYKE .error-icon{fill:#552222;}#mermaid-svg-yfvD53GSEZ2mBYKE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yfvD53GSEZ2mBYKE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yfvD53GSEZ2mBYKE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yfvD53GSEZ2mBYKE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yfvD53GSEZ2mBYKE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yfvD53GSEZ2mBYKE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yfvD53GSEZ2mBYKE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yfvD53GSEZ2mBYKE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yfvD53GSEZ2mBYKE .marker.cross{stroke:#333333;}#mermaid-svg-yfvD53GSEZ2mBYKE svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yfvD53GSEZ2mBYKE p{margin:0;}#mermaid-svg-yfvD53GSEZ2mBYKE .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yfvD53GSEZ2mBYKE text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-yfvD53GSEZ2mBYKE .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-yfvD53GSEZ2mBYKE .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-yfvD53GSEZ2mBYKE .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-yfvD53GSEZ2mBYKE .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-yfvD53GSEZ2mBYKE #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-yfvD53GSEZ2mBYKE .sequenceNumber{fill:white;}#mermaid-svg-yfvD53GSEZ2mBYKE #sequencenumber{fill:#333;}#mermaid-svg-yfvD53GSEZ2mBYKE #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-yfvD53GSEZ2mBYKE .messageText{fill:#333;stroke:none;}#mermaid-svg-yfvD53GSEZ2mBYKE .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yfvD53GSEZ2mBYKE .labelText,#mermaid-svg-yfvD53GSEZ2mBYKE .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-yfvD53GSEZ2mBYKE .loopText,#mermaid-svg-yfvD53GSEZ2mBYKE .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-yfvD53GSEZ2mBYKE .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-yfvD53GSEZ2mBYKE .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-yfvD53GSEZ2mBYKE .noteText,#mermaid-svg-yfvD53GSEZ2mBYKE .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-yfvD53GSEZ2mBYKE .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yfvD53GSEZ2mBYKE .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yfvD53GSEZ2mBYKE .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yfvD53GSEZ2mBYKE .actorPopupMenu{position:absolute;}#mermaid-svg-yfvD53GSEZ2mBYKE .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-yfvD53GSEZ2mBYKE .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yfvD53GSEZ2mBYKE .actor-man circle,#mermaid-svg-yfvD53GSEZ2mBYKE line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-yfvD53GSEZ2mBYKE :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}skopeo copy docker://src/image:v1 docker://dst/image:v1获取 manifest (支持多架构)Manifest List / Image Manifest按层下载 Blob (仅缺失的)上传 Blob 和 Manifest复制完成

  • 自动处理层的重用,仅传输目标仓库缺失的 Blob,节省带宽和时间。
  • 支持 –all 选项复制 Manifest List 下所有平台镜像。
  • 可配合 –dest-creds, –src-creds 处理认证。

七、Java 项目中的实践考量

在 Spring Boot 微服务的 CI/CD 中,镜像同步复制通常发生在以下环节:

  • 依赖基础镜像缓存:通过定时复制任务将 eclipse-temurin:17-jre 从 Docker Hub 同步到内网 Harbor,加速构建速度并避免外网限流。
  • 多环境推广:CI 构建出应用镜像(如 harbor-dev/app:v1.0)后,通过 Harbor 复制规则将标签为 release-* 的镜像自动同步到生产仓库(harbor-prod/app:v1.0),并触发部署流水线。
  • 多架构交付:使用 skopeo copy –all 或 crane copy 保持 amd64/arm64 的 Manifest List 完整同步,确保所有架构的 K8s 节点均可拉取。
  • 离线交付:对于银行或政务项目,利用 docker save 将包含 JRE 和 fat jar 的镜像导出为 tar,经安全审查后导入内网 Harbor。

注意事项:

  • 保证目标 Registry 的认证凭据安全,建议使用短期令牌或机器人账户。
  • 复制后的镜像应重新进行安全扫描(Harbor 可自动触发)。
  • 标签策略一致,避免同步覆盖生产固定版本。

八、思维导图总结

#mermaid-svg-nEYfHrj7i4QcmdS0{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nEYfHrj7i4QcmdS0 .error-icon{fill:#552222;}#mermaid-svg-nEYfHrj7i4QcmdS0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nEYfHrj7i4QcmdS0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nEYfHrj7i4QcmdS0 .marker.cross{stroke:#333333;}#mermaid-svg-nEYfHrj7i4QcmdS0 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nEYfHrj7i4QcmdS0 p{margin:0;}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge{stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section–1 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section–1 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section–1 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section–1 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section–1 text{fill:#ffffff;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth–1{stroke-width:17;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-0 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-0 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-0 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-0 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-0 text{fill:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-0{font-size:40px;color:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-0{stroke-width:14;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-1 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-1 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-1 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-1 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-1 text{fill:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-1{font-size:40px;color:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-1{stroke-width:11;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-2 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-2 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-2 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-2 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-2 text{fill:#ffffff;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-2{stroke-width:8;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-3 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-3 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-3 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-3 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-3 text{fill:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-3{font-size:40px;color:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-3{stroke-width:5;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-4 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-4 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-4 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-4 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-4 text{fill:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-4{font-size:40px;color:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-4{stroke-width:2;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-5 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-5 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-5 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-5 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-5 text{fill:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-5{font-size:40px;color:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-5{stroke-width:-1;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-6 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-6 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-6 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-6 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-6 text{fill:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-6{font-size:40px;color:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-6{stroke-width:-4;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-7 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-7 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-7 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-7 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-7 text{fill:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-7{font-size:40px;color:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-7{stroke-width:-7;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-8 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-8 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-8 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-8 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-8 text{fill:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-8{font-size:40px;color:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-8{stroke-width:-10;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-9 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-9 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-9 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-9 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-9 text{fill:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-9{font-size:40px;color:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-9{stroke-width:-13;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-10 rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-10 path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-10 circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-10 polygon,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-10 text{fill:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .node-icon-10{font-size:40px;color:black;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge-depth-10{stroke-width:-16;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:lightgray;}#mermaid-svg-nEYfHrj7i4QcmdS0 .disabled text{fill:#efefef;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-root rect,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-root path,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-root circle,#mermaid-svg-nEYfHrj7i4QcmdS0 .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-root text{fill:#ffffff;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-root span{color:#ffffff;}#mermaid-svg-nEYfHrj7i4QcmdS0 .section-2 span{color:#ffffff;}#mermaid-svg-nEYfHrj7i4QcmdS0 .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-nEYfHrj7i4QcmdS0 .edge{fill:none;}#mermaid-svg-nEYfHrj7i4QcmdS0 .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-nEYfHrj7i4QcmdS0 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

镜像同步与复制

方式

Docker pull/tag/push

本地中转,简单,手工

Docker save/load

离线tar包,物理隔离

Harbor 复制

推模式

拉模式

事件/定时/手动触发

过滤器

专业工具

skopeo copy

crane copy

无需本地Docker

保留多架构

Java实战场景

基础镜像缓存加速

跨环境版本推广

多架构完整同步

离线安全交付

关键点

层复用减少传输

Manifest List 完整性

认证与安全

复制后重新扫描

通过以上体系,可以从原理、方法、工具到 Java 项目应用全面阐述镜像同步与复制的实现,展现对容器镜像生命周期管理的深刻理解。

赞(0)
未经允许不得转载:171主机测评 » 高级java每日一道面试题-2026年01月17日-实战篇[Docker]-如何实现镜像的同步和复制?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址