镜像共享:Docker Hub 与私有仓库
本教程共 25 篇 · 第 15 篇 · 更新于 2026-07-26 · 约 9 分钟阅读
15. 镜像共享:Docker Hub 与私有仓库
本节目标:搞懂镜像仓库是什么,学会把本地镜像推到 Docker Hub、自建私有 registry,以及用国内云厂商的镜像仓库加速。
前面我们构建了镜像,但它只在你这一台机器上。想给同事用、想部署到服务器、想在 CI 里跑,都得把镜像传出去。这就需要「镜像仓库」(registry)。
这一章讲清楚仓库的概念,以及怎么把镜像推上去、拉下来。
仓库、镜像、标签的关系
先把几个容易混的词理清楚。
- 仓库(registry):集中存放镜像的地方,是服务器。Docker Hub 是公共仓库,你也可以自建私有仓库。
- 仓库源(repository):仓库里的一组相关镜像,可以理解成「一个项目」。比如
nginx就是一个 repository。 - 标签(tag):同一个 repository 下的不同版本。
nginx:1.27和nginx:alpine是同一个 repository 的两个 tag。
打个比方:registry 是应用商店,repository 是商店里某个 App,tag 是这个 App 的不同版本。完整镜像名 docker.io/library/nginx:1.27 就能拆成这几部分。
Note日常说话时「仓库」这个词容易指代不清。下文里我说的「镜像仓库」指 registry 这个服务,「仓库源」指某个镜像项目。
镜像名的完整结构是这样:
[HOST[:PORT]/]PATH[:TAG]
- 不写
HOST,默认是docker.io,也就是 Docker Hub。 - Docker Hub 上的官方镜像默认命名空间是
library,比如nginx等价于docker.io/library/nginx:latest。 - 个人镜像是
用户名/镜像名,比如docker.io/yourname/my-app:1.0。
Docker Hub:最常用的公共仓库
Docker Hub 是 Docker 官方的公共镜像仓库,也是 docker pull 默认的去处。前面章节里用的 nginx、ubuntu、node 都是从这儿拉的。
注册账号
要去 Docker Hub 推镜像,得先有账号:
- 打开 hub.docker.com,点 Sign Up。
- 用邮箱注册,或直接用 Google / GitHub 账号登录。
- 完成邮箱验证。
注册完就有了一个「命名空间」,默认是你的用户名。你的镜像都得挂在 你的用户名/镜像名 下面。
登录
命令行里登录:
docker login
输入用户名和密码(或访问令牌)。登录成功后凭证会存在本地,之后 push 不用再登。
Tip推荐用「访问令牌(Access Token)」代替密码登录。在 Docker Hub 的 Account Settings → Security 里创建,权限可控,泄露了能单独撤销,比主密码安全。CI 流水线里务必用令牌。
给镜像打标签
推镜像前,镜像名必须符合「用户名/仓库名」的格式。如果你之前构建的镜像只叫 my-app,直接推会失败,因为 Docker 找不到对应的仓库源。
用 docker tag 给它补个全名:
docker tag my-app yourname/my-app:1.0
这条命令不会复制镜像,只是给同一个镜像多挂个名字。yourname 换成你的 Docker Hub 用户名。
推送镜像
打完标签就能推了:
docker push yourname/my-app:1.0
Docker 会把镜像的每一层依次上传。如果某些层仓库里已经有了(比如基础镜像的层),会跳过,只传新增的部分。
推送完,去 Docker Hub 网页上就能看到你的镜像和标签了。
拉取镜像
在另一台机器上,拉下来就能用:
docker pull yourname/my-app:1.0
docker run -d -p 8080:3000 yourname/my-app:1.0
这就是镜像分发的完整闭环:本地构建 → 打标签 → 推送 → 别处拉取 → 运行。CI/CD 流水线里基本都是这套流程。
Warning推送时如果报
denied: requested access to the resource is denied,通常是两个原因:没登录,或者镜像名里的用户名和登录账号对不上。检查docker tag时的用户名是否拼写正确。
镜像标签管理
标签是镜像的版本标识,怎么管理标签直接影响发布流程是否顺畅。
不写标签默认是 latest。 docker pull nginx 等价于 docker pull nginx:latest。但 latest 只是个普通标签名,不代表「最新」—它指向哪个版本完全由推送者决定,而且会被覆盖。
生产环境千万别用 latest,它不可复现。今天拉的和下周拉的可能是两个不同的镜像,出了问题排查要命。
推荐的标签策略:
- 版本号标签:
my-app:1.0、my-app:1.2.3,对应发布版本,语义清晰。 - Git commit 标签:
my-app:abc1234,每次构建用 commit 短哈希,精确到某次提交,可追溯。 latest指向最新稳定版:作为便利标签,但不依赖它做生产部署。
一个镜像可以同时挂多个标签,方便不同场景使用:
docker tag my-app yourname/my-app:1.0
docker tag my-app yourname/my-app:abc1234
docker tag my-app yourname/my-app:latest
docker push yourname/my-app:1.0
docker push yourname/my-app:abc1234
docker push yourname/my-app:latest
私有仓库
Docker Hub 免费账号只能有一个私有仓库源,公开仓库无限。公司内部镜像不想公开,要么付费,要么自建私有 registry。
自建 registry
官方提供了一个 registry 镜像,跑起来就是一个私有仓库:
docker run -d -p 5000:5000 --name registry --restart=always \
-v /opt/registry/data:/var/lib/registry \
registry:2
这条命令启动一个 registry 服务,监听 5000 端口,数据存在宿主机的 /opt/registry/data,容器重启自动拉起。
用法和 Docker Hub 一样,只是镜像名前要带地址:
# 打标签
docker tag my-app localhost:5000/my-app:1.0
# 推送
docker push localhost:5000/my-app:1.0
# 拉取
docker pull localhost:5000/my-app:1.0
Warning自建 registry 默认用 HTTP,Docker 客户端默认只信任 HTTPS。在另一台机器上拉
主机IP:5000/...会报证书错误。需要在客户端的/etc/docker/daemon.json里把这个地址加进insecure-registries列表,然后重启 Docker。生产环境建议配上 TLS 证书或反向代理加 HTTPS。
自建 registry 适合内网、测试、学习。生产环境要考虑高可用、认证、镜像清理、UI 界面等,推荐用 Harbor、GitLab Container Registry 这类成熟方案,它们都基于 registry 协议,功能更全。
国内镜像仓库
国内访问 Docker Hub 慢,甚至偶尔连不上。这时候国内云厂商的容器镜像服务就派上用场了,速度快、网络稳定,还支持私有镜像。
阿里云容器镜像服务 ACR
阿里云 ACR(Container Registry)分个人版和企业版,个人版免费够用。流程:
- 登录阿里云控制台,开通「容器镜像服务」。
- 创建命名空间,比如
myteam。 - 创建镜像仓库,比如
my-app,关联一个代码源或选「本地仓库」。 - 在仓库详情页能看到登录地址,格式是
registry.cn-<地域>.aliyuncs.com,比如北京是registry.cn-beijing.aliyuncs.com。
登录:
docker login --username=你的阿里云账号 registry.cn-beijing.aliyuncs.com
密码是 ACR 单独设置的「固定密码」,在控制台的「访问凭证」里设置,不是阿里云登录密码。
打标签并推送:
docker tag my-app registry.cn-beijing.aliyuncs.com/myteam/my-app:1.0
docker push registry.cn-beijing.aliyuncs.com/myteam/my-app:1.0
拉取:
docker pull registry.cn-beijing.aliyuncs.com/myteam/my-app:1.0
Tip如果你的服务器在阿里云上,把地址里的
registry.cn-beijing.aliyuncs.com换成 VPC 内网地址registry-vpc.cn-beijing.aliyuncs.com,走内网拉取,又快又省流量费。控制台仓库详情页会同时给出公网和内网地址。
腾讯云 TCR
腾讯云容器镜像服务 TCR 用法类似。开通后会有一个接入域名,格式类似 ccr.ccs.tencentyun.com(个人版)或 xxx.tencentcloudcr.com(企业版)。
docker login --username=腾讯云账号ID ccr.ccs.tencentyun.com
docker tag my-app ccr.ccs.tencentyun.com/myteam/my-app:1.0
docker push ccr.ccs.tencentyun.com/myteam/my-app:1.0
阿里云、腾讯云、华为云的容器镜像服务,操作模式都差不多:开通服务 → 建命名空间 → 建仓库 → 登录 → 打标签 → 推送。区别只在域名和账号体系。选哪家看你服务器在哪家云上,同云内网拉取最快。
镜像加速器 ≠ 镜像仓库
这里要分清两个概念,新手容易搞混。
- 镜像加速器:代理 Docker Hub 的公共镜像,只读,用来加速
docker pull,不能推自己的镜像。第 5 章讲的就是这个。 - 镜像仓库:能推能拉,存放自己的镜像。Docker Hub、阿里云 ACR、自建 registry 都属此类。
如果你只是拉官方镜像慢,配个加速器就行,不用建仓库。要分发自己的镜像,才需要仓库。
小结
镜像共享的标准动作就三步:打标签、登录、推送。换什么仓库都一样,区别只在镜像名前面的地址。
记住几条要点:
- 镜像名要带仓库地址和用户名,格式
地址/命名空间/镜像名:标签。 - 生产环境别用
latest,用具体版本号或 commit 哈希。 - 国内优先用阿里云/腾讯云的镜像仓库,同云内网拉取又快又省钱。
- CI 里用访问令牌而不是密码。
- 自建 registry 适合内网测试,生产用 Harbor 这类方案。
下一章我们换个话题,讲数据持久化—容器删了数据就没了,怎么解决这个问题。