将镜像推送到 Docker Hub 或私有仓库
概述
你已经学会了编写 Dockerfile 并构建出自己的镜像。
但这个镜像目前只存在于你的电脑上,别人无法使用,CI/CD 流水线也无法拉取。
要想让镜像被团队共享、在服务器上运行、或用于自动化部署,你需要把它推送到一个镜像仓库
什么是镜像仓库
镜像仓库(Registry) 是用来存储和分发 Docker 镜像的服务
常见的仓库类型:
| 类型 | 举例 | 适用场景 |
|---|---|---|
| 公共仓库 | Docker Hub | 开源项目、个人学习 |
| 私有仓库 | 阿里云 ACR、腾讯云 TCR、Harbor | 企业内部、敏感项目 |
你可以把它理解为:
Docker 镜像的“GitHub”
推送到 Docker Hub(公共/私有)
- 注册 Docker Hub 账号
访问 https://hub.docker.com,注册一个免费账号。
2.登录 Docker CLI
在终端登录你的 Docker Hub 账号:
docker login
输入你的 用户名 和 密码。
登录成功后,你就可以推送镜像了。
- 给镜像打标签(Tag)
Docker 要求推送的镜像必须有正确的命名格式:
<你的Docker Hub用户名>/<镜像名>:<标签>
例如:
docker tag my-node-app:1.0 your-dockerhub-username/my-node-app:1.0
如果不打标签,推送时会报错:
denied: requested access to the resource is denied
- 推送镜像
docker push your-dockerhub-username/my-node-app:1.0
推送过程会显示每一层的上传进度
- 验证结果
打开浏览器,访问:
https://hub.docker.com/r/你的用户名/my-node-app
你应该能看到你刚刚推送的镜像
- 别人如何使用
其他人只需运行:
docker pull your-dockerhub-username/my-node-app:1.0
docker run -p 3000:3000 your-dockerhub-username/my-node-app:1.0
即可运行你的应用
推送到私有仓库
企业项目通常使用私有仓库,保证代码安全。
以 阿里云容器镜像服务(ACR) 为例
- 开通阿里云 ACR
- 登录 阿里云控制台
- 搜索“容器镜像服务”
- 创建一个个人版实例(免费)
- 创建命名空间和镜像仓库
- 创建命名空间(如
my-namespace) - 在命名空间下创建镜像仓库(如
my-java-app)
- 获取登录信息
在 ACR 控制台找到:
- 公网地址:
registry.cn-beijing.aliyuncs.com - 用户名 和 密码(可在“访问凭证”中设置)
- 登录阿里云 Registry
docker login registry.cn-beijing.aliyuncs.com
输入用户名和密码
- 打标签
格式:
<公网地址>/<命名空间>/<镜像名>:<标签>
docker tag my-spring-app:1.0 registry.cn-beijing.aliyuncs.com/my-namespace/my-spring-app:1.0
- 推送镜像
docker push registry.cn-beijing.aliyuncs.com/my-namespace/my-spring-app:1.0
推送成功后,可在 ACR 控制台查看镜像
最佳实践
| 建议 | 说明 |
|---|---|
| 使用语义化标签 | 如 v1.0.0、latest、dev,避免用 latest 作为生产唯一标签 |
| 定期清理旧镜像 | 避免仓库臃肿 |
| 私有仓库开启访问控制 | 限制 IP、设置 RAM 权限 |
| CI/CD 中自动推送 | 使用 GitHub Actions、Jenkins 自动构建并推送 |
常见问题
Q:推送时提示 unauthorized: authentication required?
A:检查是否 docker login 成功,用户名密码是否正确。
Q:镜像太大怎么办?
A:使用 .dockerignore、轻量基础镜像、多阶段构建优化。
Q:如何删除已推送的镜像?
A:在 Docker Hub 或私有仓库控制台中删除。
总结
| 步骤 | 命令 |
|---|---|
| 登录仓库 | docker login <registry> |
| 打标签 | docker tag <源镜像> <目标镜像> |
| 推送镜像 | docker push <镜像名> |
推送镜像不是可选项,而是现代开发的标配。
它让镜像可共享、可复用、可自动化,是 CI/CD 和 Kubernetes 部署的基础
