docker push 报 denied,又不想先上 Harbor 或裸 registry:2、再折腾证书与 insecure-registries——可以先走 HTTPS 云仓:控制台建 Docker HOSTED,开发机 docker login 后按 主机/仓库名/镜像:标签 推送。合作方只要匿名拉取时,把交付仓标公开,在 /explore 复制安装命令。
结论: 云服务可托管 Docker/OCI;
docker push只进 HOSTED,PROXY/GROUP 只读;镜像名不要手写/v2;公开分发用独立公开 HOSTED + 主机路径/explore。权限 = 仓库 ACL + 令牌,没有开箱tenant_id。Hub 限流与FROM改写见文末参考:Docker Hub 拉取限流怎么办。
从零私有化安装、配 insecure-registries 的完整教程见文末参考:私有 Docker 仓库怎么用。下文把云上 HTTPS 起步、第二台机器验收与 /explore 写满。
1. 云服务还是社区自建
| 路径 | 说明 |
|---|---|
| 云服务 | 托管 HTTPS;示例主机 https://repo.anguskit.com,一般不必配 insecure-registries。具体租户接入主机以控制台「接入配置」为准 |
| 社区版自建 | GPL-3.0;适合内网与离线——机器、证书与网络自担 |
用量与限额以控制台当前租户显示为准;触顶后推送会被拒绝。删旧 tag:在控制台对应 HOSTED 的制品 / 标签列表中删除不再需要的标签(菜单文案以控制台为准)。大层镜像优先用小 base、少保留历史 tag。
2. 最小拓扑
| 仓库名示例 | 类型 | 干什么 |
|---|---|---|
docker-hosted |
HOSTED | 唯一 push 目标 |
dockerhub-proxy |
PROXY | 缓存 Docker Hub(远程 https://registry-1.docker.io;建议配 Hub 账号) |
docker-group(可选) |
GROUP | 统一拉取入口,聚合 hosted + proxy |
从 Harbor 整仓迁移、保 digest 双跑,见文末参考:Harbor 迁移清单。多 Runner 撞 Hub 限额、改 FROM,见文末参考:Docker Hub 拉取限流怎么办——本文不展开 Hub 凭据细节。
docker push ──► docker-hosted (HOSTED,唯一写入)
docker pull ──► HOSTED 或 docker-group ──► hosted + dockerhub-proxy
合作方匿名 ──► /explore ──► public-docker(另建公开 HOSTED)
云仓 HTTPS ──► 一般不必配 insecure-registries
3. 可操作步骤
3.1 建仓与令牌
- 控制台创建 Docker HOSTED(及可选 PROXY/GROUP)。
- 签发 Deploy Token(
repod_)或用户访问令牌(PAT):push 账号对 HOSTED 有 Write;pull 账号对入口仓有 Read。 - 密码位填令牌;用户名填控制台用户名(以接入配置为准)。
3.2 登录用户名陷阱(Docker ≠ PyPI)
| 写法 | 结果 |
|---|---|
| 用户名 = 控制台账号,密码 = 令牌 | 正确 |
用户名填 __token__,密码填令牌 |
错误——那是 PyPI / 部分包格式手册里的哨兵,不要套到 docker login |
| 用户名填令牌、密码留空 | 失败;两端含义反了 |
| 用户名填邮箱别名但控制台账号不是该邮箱 | 以接入配置显示的用户名为准 |
3.3 登录、标记、推送
export REPO_HOST="repo.anguskit.com"
export REPO_USER="你的控制台用户名"
export REPO_TOKEN="你的令牌"
echo "$REPO_TOKEN" | docker login "$REPO_HOST" \
--username "$REPO_USER" \
--password-stdin
docker tag myapp:1.0.0 \
"${REPO_HOST}/docker-hosted/myapp:1.0.0"
docker push "${REPO_HOST}/docker-hosted/myapp:1.0.0"
镜像坐标是 主机/仓库名/镜像:标签。协议 API 里的 /v2 不要写进镜像名。用 --password-stdin,避免令牌进 shell 历史。
3.4 验收清单(本机 + 第二台 / 干净 CI)
在推送机器上:
# 直接从 HOSTED 拉回
docker pull "${REPO_HOST}/docker-hosted/myapp:1.0.0"
# 记下 digest,便于跨机核对
docker image inspect "${REPO_HOST}/docker-hosted/myapp:1.0.0" \
--format '{
{index .RepoDigests 0}}'
在第二台机器或干净 CI job(未残留本地 tag)上:
# 只 pull,不依赖本机刚 build 的层缓存误判
echo "$REPO_TOKEN" | docker login "$REPO_HOST" \
--username "$REPO_USER" --password-stdin
docker pull "${REPO_HOST}/docker-hosted/myapp:1.0.0"
docker image inspect "${REPO_HOST}/docker-hosted/myapp:1.0.0" \
--format '{
{index .RepoDigests 0}}'
两台机器 digest 一致,才算托管验收通过。若配置了 GROUP,只读拉取可改用 GROUP 名作入口(仍不能 push 进 GROUP):
# docker pull "${REPO_HOST}/docker-group/myapp:1.0.0"
经 PROXY/GROUP 拉 Hub 官方镜像时加上 library/(如 …/library/nginx:1.27)。细节见文末参考:Docker 格式手册。
4. /explore 公开发现(可操作)

合作方不愿收令牌时:
- 单独建
public-dockerHOSTED,勾选公开(isPublic)。不要公开日常docker-hosted,也不要公开聚合了私有仓的 GROUP。 - 用 Write 令牌只往
public-docker推正式标签(避免dev-tmp、日期乱 tag 进公开列表)。 - 无痕窗口打开
https://repo.anguskit.com/explore(或/explore/artifacts搜镜像名)。 - 打开制品详情,复制页面生成的免认证
docker pull命令。 - 在未
docker login团队私有仓的干净环境执行该命令;应能拉下且无需令牌。
勾选公开后索引可能有数十秒~数分钟延迟。门户顶栏「文档」仍禁用时,外链应指向 AngusKit 文档站,勿承诺门户内文档。完整门户规则见文末参考:私有仓制品怎么公开下载。
5. 边界与翻车表
| 现象 | 常见原因 | 处理 |
|---|---|---|
denied |
未 login、无 Write、推到了 GROUP | 确认 HOSTED 名与令牌权限 |
名称含 /v2 |
把协议路径写进镜像名 | 去掉 /v2,对照接入配置 |
| 存储满 / push 被拒 | 用量触顶(以控制台当前租户为准) | 删旧 tag;或改社区自建 |
| 合作方仍 401 | 仓未公开或链错私有仓 | 用 /explore 生成的命令 |
| Hub 官方镜像拉取失败 | PROXY 未配或未加 library/ |
查 PROXY;限流场景见限流文 |
unauthorized |
密码位不是令牌,或用户名错 | 见 §3.2;用户名 ≠ __token__ |
| 第二台 digest 对不上 | 推错 tag / 拉到旧缓存 | 显式拉 :标签 或按 digest pull |
同一套仓库还可管 Maven/npm 等格式;多格式同址的选型讨论见文末参考:选型文。
FAQ
云上还要配 insecure-registries 吗?
repo.anguskit.com 走 HTTPS 时通常不需要。HTTP 私有化才需要,见文末参考:私有 Docker 仓库怎么用。
能替代 Docker Hub 吗?
对你们自己的业务镜像与经 PROXY 缓存的公共镜像,可以替代「每台机器直连 Hub」。Hub 账号体系、官方星标页等不在替代范围内——详见文末参考:Docker Hub 拉取限流怎么办。
门禁默认开吗?
默认关。Repo 执法、Security 做深度引擎;上传成功不等于已扫过。
云服务镜像能跑生产吗?
能推能拉在技术上没问题。是否够用看控制台当前租户的用量与限额;不够可改社区自建(证书 / 网络自担)。
小结
- 云服务可跑通私有镜像主路径(HOSTED / PROXY / GROUP)。
- push → HOSTED;pull → HOSTED 或 GROUP;用第二台机器 digests 验收。
- 对外:
public-docker+/explore;镜像名勿带/v2;login 用户名不是__token__。
参考文章
- 私有 Docker 仓库怎么用(私有化):https://www.anguskit.com/zh/blog/private-docker-registry
- Docker 格式手册:https://www.anguskit.com/zh/docs/repo/manual/05-formats/02-docker
- 公开门户手册:https://www.anguskit.com/zh/docs/repo/manual/15-portal
- 私有仓制品怎么公开下载:https://www.anguskit.com/zh/blog/public-portal-launch
- 从 Harbor 迁镜像:https://www.anguskit.com/zh/blog/harbor-to-angusrepo-image-migration
- Docker Hub 拉取限流怎么办:https://www.anguskit.com/zh/blog/docker-hub-pull-limit-alternative
- Deploy Token 与 ACL:https://www.anguskit.com/zh/blog/angusrepo-deploy-token-pat-acl-guide
- 选型:一套仓库替换多套私服:https://www.anguskit.com/zh/blog/repo-selection-2026