☰
私有 Docker 仓库怎么用:从安装到登录、推送和证书
2026/10/14 10:45:21 网站建设 项目流程

docker push报denied,或docker pull报x509——多半不是镜像坏了,而是私服还没接对:服务没起来、仓库类型不对、没 login,或主机名指错了。

下面用 AngusRepo社区版私有化部署,按操作顺序走完一遍:安装 → 建仓与令牌 → 登录 → 推送 → 拉取(含 CI / Kubernetes)。命令里的主机写成repo.example.com,换成你的域名即可。denied逐步拆解见 push denied 排查。

1. 安装(得到可打开的控制台)

前提:Docker Engine + Compose v2;约 2 核 / 4 GB;放行80;gm.example.com与repo.example.com已解析到本机(试用可写/etc/hosts)。完整步骤见 第一次跑通。

curl--fail--location--progress-bar-oAngusRepo-Community-1.0.0.zip\https://repo.anguskit.com/raw/raw-public/AngusKit/repo/AngusRepo-Community-1.0.0.zipunzipAngusRepo-Community-1.0.0.zipcdAngusRepo-1.0.0 ./install.sh

向导与快速开始对齐:Compose;Access 选2(捆绑反代);TLS 选4(HTTP:80);Database 选 Compose 内 MySQL;Public DNS name 填后缀如example.com。出现Install finished.后:

./bin/angusctl.sh doctor# 看到 doctor: OK

浏览器打开http://gm.example.com/登录,再打开http://repo.example.com/。

Windows 用curl.exe+.\install.bat。需要 HTTPS 时见 安装与部署。

下文默认HTTP 私有化:开发机 Docker 通常要配insecure-registries。控制台能打开后,先建仓库和令牌,再执行docker login。

2. 建仓、令牌与镜像命名

推送只能进HOSTED;PROXY、GROUP 只读。在http://repo.example.com/创建(名称可自定,后面命令保持一致):

仓库名示例类型干什么
docker-hostedHOSTEDdocker push的唯一目标
dockerhub-proxyPROXY缓存 Docker Hub(远程 URL:https://registry-1.docker.io;建议配 Hub 账号)
docker-group(可选)GROUP聚合上面两个,做一个拉取入口


镜像写成主机/仓库名/镜像:标签,例如repo.example.com/docker-hosted/myapp:1.0.0。

不要手写/v2。经 PROXY/GROUP 拉 Docker Hub 官方镜像时加上library/(如…/library/nginx:1.27)。

具体 URL 以控制台「接入配置」为准;独立端口等见 Docker 格式手册。

同一控制台继续准备:

  • 创建访问令牌(只显示一次,立刻保存)
  • 推送账号对docker-hosted有 Write;拉取账号对入口仓有 Read
exportREPO_USER="admin"# 控制台用户名,不是令牌名称exportREPO_TOKEN="your_access_token"# 密码位一律填令牌exportREPO_HOST="repo.example.com"# 换成你的 repo.<域名>

3. 登录和证书

HTTP(与快速开始一致)

无证书时 Docker 默认走 HTTPS,会失败。在守护进程加上不安全仓库后重启:

{"insecure-registries":["repo.example.com"]}

然后登录:

echo"$REPO_TOKEN"|dockerlogin"$REPO_HOST"\--username"$REPO_USER"\--password-stdin

用--password-stdin,避免令牌进 shell 历史。

改成 HTTPS 之后

配好可信证书后,从insecure-registries去掉该主机,再重新docker login。证书链不完整时仍会出现x509: certificate signed by unknown authority。

现象先查什么
x509/ 握手失败HTTP 是否漏配insecure-registries;HTTPS 时证书链是否完整
unauthorized/authentication required是否已 login;密码位是否为令牌;主机是否为私服域名

4. 推送内部镜像

dockerbuild-tmyapp:1.0.0.dockertag myapp:1.0.0"$REPO_HOST/docker-hosted/myapp:1.0.0"dockerpush"$REPO_HOST/docker-hosted/myapp:1.0.0"

目标必须是 HOSTED。往 GROUP 或 PROXY 推,会得到denied。

CI 里同样三步即可:

echo"$REPO_TOKEN"|dockerlogin"$REPO_HOST"\--username"$REPO_USER"--password-stdindockerbuild-t"$REPO_HOST/docker-hosted/myapp:$VERSION".dockerpush"$REPO_HOST/docker-hosted/myapp:$VERSION"

流水线阶段编排可另见 Jenkins 构建测试发布。推送被拒逐步查:push denied。

5. 拉取镜像

# 内部镜像dockerpull"$REPO_HOST/docker-hosted/myapp:1.0.0"# 经 PROXY 拉公共基础镜像(注意 library/)dockerpull"$REPO_HOST/dockerhub-proxy/library/nginx:1.27"# 若建了 GROUP,可统一从一个入口拉dockerpull"$REPO_HOST/docker-group/myapp:1.0.0"dockerpull"$REPO_HOST/docker-group/library/nginx:1.27"

Kubernetes

节点要能解析REPO_HOST。HTTP 私服时,节点上的 Docker / containerd 也需信任该仓库(与insecure-registries同类配置)。

kubectl create secret docker-registry repo-cred\--docker-server="$REPO_HOST"\--docker-username="$REPO_USER"\--docker-password="$REPO_TOKEN"\--namespace=default
apiVersion:apps/v1kind:Deploymentmetadata:name:myappspec:template:spec:imagePullSecrets:-name:repo-credcontainers:-name:myappimage:repo.example.com/docker-hosted/myapp:1.0.0

6. 日常维护(推拉跑通之后)

清理 tag— 镜像体积涨得快。建议每镜像保留最近 N 个 tag,并按名称清掉*-dev、pr-*。先 Dry Run 再执行,见 清理策略。

PROXY 与限流— Docker Hub 匿名拉取约 100 次/6h。给dockerhub-proxy配 Hub 账号;生产镜像钉死版本号,少用latest(缓存后不会自动跟着上游变)。

入库检查— 上传时有轻量门禁;需要更细的漏洞 / 许可证分析时再接外部扫描或安全产品。打开阻断前先处理误报,避免拦停正常拉取。概念见 入库门禁与 SBOM。

报错速查

报错常见原因怎么处理
denied无 Write,或 push 到了 GROUP/PROXY改 ACL;只推 HOSTED;见 push denied
manifest unknown仓库名 / 镜像 / tag 错;漏了library/核对「接入配置」与命名
pull 大镜像超时反代超时或 body 限制太小调大proxy_read_timeout与上传大小
登录成功但 push 401令牌过期,或环境变了没重新 login重新docker login

字段级说明见 Docker / OCI 格式手册。

FAQ

能不能往 GROUP 里 push?

不能。GROUP / PROXY 只读,推送必须指向 HOSTED。

镜像名要不要写/v2?

不要。客户端会自己走协议路径;写进镜像名会路径错误。

HTTP 环境必须配insecure-registries吗?

是。无证书时 Docker 默认 HTTPS,不配往往直接x509或握手失败。上了可信证书后应去掉该项。

小结

  • 安装并打开控制台 → 建 HOSTED(必选)、PROXY、可选 GROUP → 发令牌。
  • docker login后只向 HOSTED 推送;拉取可走 HOSTED、PROXY 或 GROUP。
  • HTTP 试用配insecure-registries;HTTPS 后去掉;镜像名不要手写/v2。
  • 跑通后配清理策略和 PROXY 凭据,避免磁盘与 Hub 限流拖垮构建。

参考文章

  • 第一次跑通
  • 安装与部署
  • Docker / OCI 格式
  • 清理策略
  • docker push denied 排查
  • Jenkins 构建测试发布
  • 入库门禁与 SBOM

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询