docker push推送自研镜像到私有仓库需三步:打正确标签(含完整仓库地址)、登录认证(注意HTTP/HTTPS配置)、执行推送并验证;每步均有常见坑点,如标签缺地址误推Docker Hub、未配insecure-registries导致HTTPS认证失败等。

要用 docker push 把自研业务镜像推送到私有仓库,关键不是“能不能推”,而是“标签对不对、认证通不通、地址写得准不准”。整个过程其实就三步:打标签、登录、推送,但每一步都有容易踩的坑。
确认私有仓库已就绪并可访问
推送前先验证仓库本身是否正常运行:
- 如果是本地测试用的
registry:2,执行docker ps | grep registry确认容器在运行,端口(默认5000)没被占用 - 如果是远程私有仓库(如 Harbor 或自建带 HTTPS 的 registry),用
curl -I https://your-registry.com/v2/检查是否返回200 OK;若用 HTTP,需确保客户端已配置允许不安全仓库(见下文) - 检查网络连通性:
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
⚠️ 注意:如果镜像名里没带仓库地址,docker push 会默认往 Docker Hub 推——这会导致失败或误传。
完成认证:登录私有仓库
登录命令格式为 docker login [地址[:端口]]:
- 本地 HTTP 仓库:
docker login localhost:5000(用户名密码默认为空,或按部署时设置填写) - Harbor 或带认证的仓库:
docker login harbor.example.com,然后输入有效账号密码 - 若使用 HTTPS 但证书不可信(如自签名),需在 Docker 客户端配置信任:
编辑/etc/docker/daemon.json,加入:{"insecure-registries": ["your-registry.com:5000"]}(仅限 HTTP 或测试环境)
修改后重启 Docker:sudo systemctl restart docker
执行推送并验证结果
运行推送命令即可:
docker push localhost:5000/myapp:v1.2docker push harbor.example.com/dev/myapp:v1.2
成功时会看到类似输出:
The push refers to repository [localhost:5000/myapp]e8f9a7b5c3d1: Pushed
v1.2: digest: sha256:abc123... size: 1234
验证是否真上传成功:
- 调用 registry API:
curl http://localhost:5000/v2/_catalog查看所有镜像列表 - 查具体镜像的 tag:
curl http://localhost:5000/v2/myapp/tags/list - 或直接拉取测试:
docker pull localhost:5000/myapp:v1.2


















