如何把 Docker 镜像推送到私有镜像仓库?
推送私有仓库三步:docker login 仓库地址 认证 → docker tag 本地镜像 仓库地址/镜像名:标签 打标 → docker push 推送。本文含 Harbor/云仓库示例与常见报错处理。
三步走:①docker login <仓库地址> 登录认证;②docker tag 本地镜像 <仓库地址>/<项目>/<镜像>:<标签> 把镜像名改成带仓库前缀的完整路径;③docker push <仓库地址>/<项目>/<镜像>:<标签> 上传。镜像名里的仓库前缀决定了 push 的目的地。
完整示例
# 1. 登录(Harbor 示例)
docker login registry.example.com
# 输入用户名密码;云厂商仓库通常用临时令牌
# 2. 打标签
docker tag myapp:1.2 registry.example.com/team/myapp:1.2
# 3. 推送
docker push registry.example.com/team/myapp:1.2
推送完到仓库 Web 控制台或 docker pull 测试验证。
为什么必须重新 tag
镜像名的第一段含 . 或 : 时会被当作仓库地址:myapp:1.2 默认去 Docker Hub,而 registry.example.com/team/myapp:1.2 去你的私有仓库。tag 只是加别名,不复制数据,放心打。
常见报错处理
| 报错 | 原因 | 处理 |
|---|---|---|
unauthorized: authentication required |
没登录或令牌过期 | 重新 docker login |
denied: requested access ... denied |
无项目推送权限 | 检查账号在项目中的角色 |
http: server gave HTTP response to HTTPS client |
仓库是 HTTP 协议 | daemon.json 加 insecure-registries(内网限定),或给仓库配 TLS |
name 公开资料未说明: repository not found |
Harbor 项目不存在 | 先在 Harbor 建项目,或开启自动创建 |
给仓库配 HTTPS 或内网例外
自签名/HTTP 内网仓库,在 /etc/docker/daemon.json:
{ "insecure-registries": ["registry.example.com:5000"] }
重启 Docker 生效。仅限可信内网,公网仓库必须正经 TLS。
CI 中的推送
流水线里用密钥变量做非交互登录:
echo "$REGISTRY_TOKEN" | docker login registry.example.com -u ci-bot --password-stdin
docker push registry.example.com/team/myapp:${CI_COMMIT_SHORT_SHA}
用提交哈希做标签,镜像与代码版本一一对应。
观测云对照
镜像版本与线上行为关联。 部署的镜像标签作为版本标签进入观测云 APM/日志,出问题时按版本分组对比错误率,快速确认"是不是这次发版引入的"。
常见问题(FAQ)
Q:推送速度慢怎么优化?
A:镜像分层推送,共用层只传一次;减小镜像体积(多阶段构建、清缓存)是根本;内网仓库优先。
Q:能推到多个仓库吗?
A:打多个 tag 分别 push 即可,分层数据本地共享。
Q:Harbor 里推送后立刻能 pull 吗?
A:能;若开了镜像扫描策略,可能被标记为"阻止拉取"直至扫描通过。