核心是三步:打正确标签(含完整仓库地址)、成功登录认证、确保仓库地址可达;任一环节出错会导致推送失败或误推docker hub。
用 docker push 把本地镜像上传到私有仓库,核心就三件事:标签打对、登录成功、地址写准。不是命令不会用,而是这三处一错,推送就失败或误发到 docker hub。
确认私有仓库服务可用
推送前先确保仓库本身在运行且能连上:
- 本地 registry(如
registry:2):运行docker ps | grep registry,看容器是否在运行;默认端口5000不能被占用 - 远程仓库(如 Harbor 或自建 HTTPS registry):执行
curl -I https://your-registry.com/v2/,返回200 OK才算通;若用 HTTP,必须提前配置insecure-registries - 基础连通性检查:
ping your-registry.com或telnet your-registry.com 443(或对应端口)
给镜像打上带完整地址的标签
这是最容易出错的一步。镜像名必须包含仓库地址、命名空间、镜像名和标签四部分,缺一不可:
- 推到本地 registry:
docker tag myapp:v1.2 localhost:5000/myapp:v1.2 - 推到 Harbor:
docker tag myapp:v1.2 harbor.example.com/dev/myapp:v1.2 - 推到阿里云 ACR:
docker tag myapp:v1.2 registry-cn-hangzhou.aliyuncs.com/myteam/myapp:v1.2
⚠️ 警告:如果标签里没写仓库地址(比如只写 myapp:v1.2),docker push 会默认往 Docker Hub 推——轻则失败,重则泄露业务镜像。
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
完成登录认证
不登录,推送会被拒绝。登录方式取决于仓库类型:
- 本地 HTTP registry:
docker login localhost:5000(用户名密码通常为空,或按部署时设置) - Harbor 等带账号体系的仓库:
docker login harbor.example.com,然后输入有效用户名和密码 - HTTPS 自签名证书场景:需编辑
/etc/docker/daemon.json,加入{"insecure-registries": ["your-registry.com:5000"]},再执行sudo systemctl restart docker
执行推送并验证结果
最后一步最简单,但别跳过验证:
- 运行推送命令:
docker push localhost:5000/myapp:v1.2或docker push harbor.example.com/dev/myapp:v1.2 - 成功输出示例:
The push refers to repository [localhost:5000/myapp]后跟多行Pushed和digest信息 - 验证是否真传上去:
curl -X GET http://localhost:5000/v2/myapp/tags/list(HTTP)或访问 Harbor Web 页面查看










