Docker Hub 与镜像加速
Docker Hub 是公共容器镜像仓库。公共镜像代理的域名、可用性和运营方会频繁变化,因此本页不维护未经验证的“免费镜像源列表”。应优先使用 Docker Hub、云厂商为自己账号提供的镜像加速地址,或组织自行管理的 pull-through cache。
拉取可信镜像
优先选择 Docker Official Image 或经过核验的 Verified Publisher,并使用明确版本:
docker pull nginx:1-alpine
docker image inspect nginx:1-alpine
浮动标签可能指向新的镜像内容。对可重复部署要求较高时,应在验证后记录 digest:
docker image inspect nginx:1-alpine \
--format '{{index .RepoDigests 0}}'
docker pull nginx@sha256:<verified-digest>
镜像来源、签名/证明、漏洞扫描和 SBOM 都属于软件供应链审查的一部分,镜像能成功拉取不等于它适合生产环境。
登录与推送
交互式登录会避免把密码直接写进命令历史:
docker login --username <docker-id>
CI 中使用权限最小化的访问令牌,并通过标准输入传入:
printf '%s' '<access-token>' | \
docker login --username '<docker-id>' --password-stdin
docker tag sample-api:1.0.0 <docker-id>/sample-api:1.0.0
docker push <docker-id>/sample-api:1.0.0
令牌应来自 CI Secret Store,不能提交到脚本、Compose、镜像层或文档。
配置 registry mirror
如果组织已有受信任的 Docker Hub mirror,可在 Linux Docker Engine 的 /etc/docker/daemon.json 中合并 registry-mirrors 配置:
{
"registry-mirrors": [
"https://mirror.example.com"
]
}
不要覆盖文件中已有的日志、存储驱动、代理等设置。修改后验证 JSON 与 Docker 配置,再重启守护进程:
sudo dockerd --validate --config-file=/etc/docker/daemon.json
sudo systemctl restart docker
docker info
在 docker info 的 Registry Mirrors 中确认实际生效地址。Docker Desktop 应通过 Settings → Docker Engine 合并同名配置,并按界面提示重启。
:::warning 信任边界 镜像代理能够看到拉取请求并向客户端提供镜像内容。只使用来源明确、启用 HTTPS、受组织管理的服务;不要因为某个公共域名暂时可用就加入生产配置。 :::
自建 pull-through cache
多个 Docker 主机反复从 Hub 拉取相同镜像时,可以按 Docker 官方文档部署 Registry pull-through cache。核心配置是在 Registry 的 config.yml 中设置:
version: 0.1
proxy:
remoteurl: https://registry-1.docker.io
还需要为缓存配置持久化存储、垃圾回收、TLS、访问控制、容量监控和备份。若在缓存中配置 Docker Hub 私有账号,该账号可访问的私有内容也可能通过缓存暴露,因此必须给 mirror 本身增加认证和网络隔离。
Docker Hub mirror 只代理中央 Hub,不能把同一机制直接当作任意私有 Registry 的通用代理。
故障排查
| 现象 | 检查项 |
|---|---|
unauthorized | 仓库是否私有、令牌权限和账号是否正确、凭据是否过期 |
toomanyrequests / 429 | Docker Hub 使用限制、登录状态,以及 CI 是否应使用组织缓存 |
| TLS / 证书错误 | mirror 证书链、主机时间和企业代理;不要关闭证书验证规避问题 |
| mirror 未生效 | daemon.json 是否有效、守护进程是否重启、docker info 是否列出地址 |
| 拉到旧内容 | 检查标签是否可变、mirror 缓存状态,并用 digest 对比实际镜像 |