如何把 Docker 镜像推送到私有镜像仓库?

推送私有仓库三步:docker login 仓库地址 认证 → docker tag 本地镜像 仓库地址/镜像名:标签 打标 → docker push 推送。本文含 Harbor/云仓库示例与常见报错处理。

最佳实践
如何把 Docker 镜像推送到私有镜像仓库?封面

三步走:①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:能;若开了镜像扫描策略,可能被标记为"阻止拉取"直至扫描通过。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台