适用范围与操作权限
本文配套 Docker 镜像管理,用于受控 Registry 中候选镜像的拉取故障与身份核验,状态为待验证。没有为项目创建仓库、拉取真实镜像或运行容器。开始前确认仓库地址、获准命名空间、只读账号、目标平台与网络出口;Docker daemon 访问权限本身可能具备很高的主机控制能力,不为只读诊断临时把用户加入高权限组。
检查分为读取本地元数据、访问仓库和拉取制品三类。拉取会写入 daemon 的本地存储并消耗网络与磁盘,应在批准的隔离客户端进行;运行未知镜像、覆盖标签、删除清单和垃圾回收不属于本篇诊断范围。
固定仓库、上下文与预期制品
先从发布记录取得完整镜像路径和摘要,登记其来源、生成时间、目标平台与允许的扫描报告。路径不带 https://;连接 Registry API 时才使用 HTTPS URL。不能从搜索结果或聊天粘贴的同名镜像替代发布系统里的受控制品。
docker context show
docker version
docker image ls --digests --no-trunc以上读取当前 Docker 上下文和本地镜像记录,输出只在有权查看该 daemon 的终端保存。预期上下文对应隔离验证节点;若它指向远程生产 daemon,立即停止拉取。客户端版本、服务端版本和镜像架构分别记录,不把本机 CPU 架构等同于远程 daemon 运行平台。
分辨 TLS、认证挑战与 API 路由
对已批准仓库进行一次无凭据 API 探测。<REGISTRY_HOST> 仅替换为登记的主机与可选端口,不包含路径;输出可能含内部认证服务信息,不对外公开。不要使用 -k 或改成 insecure registry 绕过证书问题。
curl --connect-timeout 5 --max-time 10 --silent --show-error --dump-header - --output /dev/null 'https://<REGISTRY_HOST>/v2/'200 表示该入口可响应版本探测;受认证保护的入口返回 401 和认证挑战也可能正常,不能据此认定整个仓库不可用。连接失败或证书错误先定位 DNS、代理、信任链与系统时间;404 或 HTML 页面则核对反向代理路由。/v2/ 成功不代表具体镜像、鉴权范围或后端对象存储都正常。Distribution API V2
用专用凭据检查仓库读取范围
优先复用已批准的凭据助手或短期只读账号。需要登录时,先核对账号仅能读取目标仓库,再在交互终端执行;不要把密码写进命令行、环境转储、shell 跟踪或公开工单。
docker login '<REGISTRY_HOST>' --username '<READ_ONLY_USERNAME>'此操作可能将凭据保存到当前客户端凭据存储,是明确的本地状态变更。Docker 官方建议使用凭据存储机制;没有助手时的配置保存不应误认为加密保险箱。自动化凭据传递可按批准机制使用 --password-stdin,但本篇不生成读取真实密钥的示例。Docker 登录与凭据存储
登录成功仍不证明拥有每个 repository 的 pull 权限。denied 或后续 401/403 需核对命名空间、账号授权、令牌有效期和 scope;不能给账号全仓库管理员权限来消除错误。
按摘要拉取并核对平台
只有批准镜像路径、摘要、目标平台和本地容量均已确认后,才执行下列写入客户端缓存的验证。<DIGEST_HEX> 是发布记录中的完整 SHA-256 十六进制串,不是示例随机值;<PLATFORM> 形如组织批准的 linux/amd64,以目标环境为准。
docker image pull --platform '<PLATFORM>' '<REGISTRY_HOST>/<REPOSITORY>@sha256:<DIGEST_HEX>'
docker image inspect '<REGISTRY_HOST>/<REPOSITORY>@sha256:<DIGEST_HEX>' --format '{{json .RepoDigests}}'
docker image inspect '<REGISTRY_HOST>/<REPOSITORY>@sha256:<DIGEST_HEX>' --format '{{.Id}} {{.Os}}/{{.Architecture}}'预期拉取成功,制品引用与批准摘要对应,输出平台符合计划。image inspect 只检查本地已有镜像,不替代远端拉取;“本地已有”也不证明仓库当前可恢复。按摘要拉取固定的是特定内容,后续安全更新需要新的受审批摘要,不能长期固定后就不再复核。Docker 镜像拉取、本地镜像检查
不把不同层级的摘要混为一谈
镜像标签是可移动引用;多平台索引关联各平台清单,清单又引用配置和层。本地 .Id 与仓库清单摘要并非同一对象,不能要求两者字符串相等。多平台镜像还需记录“索引摘要、选中平台、平台清单摘要”的关联,不能仅凭两个客户端显示不同摘要就判断供应链被篡改。Docker 多平台镜像结构
先比较同一仓库、同一媒体类型、同一平台和同一层级的对象;信息不完整时保持未通过,向制品负责人取得构建产物记录。HTTP 返回的摘要头是证据的一部分,不应压过客户端按请求摘要进行的内容校验。Distribution 摘要语义
拉取失败的决策分支
manifest unknown:核对仓库路径与发布记录,调查该摘要是否已上传完整或被保留策略影响;不要自动换成latest。- 没有匹配的平台清单:核对构建平台覆盖、目标 OS 与架构;为当前平台重新构建属于交付变更,不以强制运行其他架构当作修复完成。
- 限流或请求量过高:登记响应时间与重试提示,限制并发和有限退避;不要扩大账号池规避仓库限流。
- 空间不足:由主机负责人区分镜像缓存、构建缓存与业务卷,列明容量预算。禁止直接
system prune -a --volumes,以免删除恢复所需对象或业务数据。 - 摘要可查但层下载超时:检查 daemon 的代理、对象存储出口和请求关联 ID。人工工作站探测成功不能替代 daemon 的网络路径。
这些是调查方向而非单条错误的唯一根因;修复后用同一批准摘要复测,避免因偷偷换制品而失去可比较性。
停止与恢复边界
发现错误上下文、凭据泄露、来源不明镜像或无法解释的摘要差异时停止推进。保留失败请求与已有稳定制品,不删除仓库数据。拉取可以按操作终端的中止方式停止,但不会自动恢复磁盘至之前状态;清理需核对精确镜像引用、使用关系与回退保留清单后单独批准。
镜像扫描通过只表示当时规则和数据库下的检查结果,不替代来源、摘要和业务验证。回退到上一镜像还需要匹配配置与数据兼容性,参见 CI/CD 发布失败定位。临时登录仅在专用验证客户端结束后回收;共享客户端不可未经确认删除他人的凭据或缓存。
脱敏证据模板
工单 / 仓库与客户端别名 / 责任人 / 时间及时区:
镜像完整引用的受控记录编号 / 批准摘要 / 来源:
Docker 上下文 / 客户端与服务端版本 / 平台:
TLS 或 HTTP 结果 / 认证范围 / 关联请求 ID:
索引、平台清单、本地镜像 ID 的对应说明:
失败层级 / 错误摘要 / 有限重试次数与间隔:
扫描报告编号 / 规则与漏洞库时间 / 未验证项:
稳定制品保留位置 / 清理或凭据回收审批:
验证结论 / 原始证据权限 / 下一负责人:令牌、密码、认证头、带签名的对象存储 URL 和内部地址不写入公开摘要;镜像摘要通常不属于密码,但仍按组织的制品信息分级保存。