首页 / Docker 入门教程 / 镜像共享:Docker Hub 与私有仓库

Docker 入门教程

镜像共享:Docker Hub 与私有仓库

本教程共 25 篇 · 第 15 篇 · 更新于 2026-07-26 · 约 9 分钟阅读

DockerDocker 入门教程Docker Hub镜像仓库私有 registry阿里云 ACR镜像推送

15. 镜像共享:Docker Hub 与私有仓库

本节目标:搞懂镜像仓库是什么,学会把本地镜像推到 Docker Hub、自建私有 registry,以及用国内云厂商的镜像仓库加速。

前面我们构建了镜像,但它只在你这一台机器上。想给同事用、想部署到服务器、想在 CI 里跑,都得把镜像传出去。这就需要「镜像仓库」(registry)。

这一章讲清楚仓库的概念,以及怎么把镜像推上去、拉下来。

仓库、镜像、标签的关系

先把几个容易混的词理清楚。

  • 仓库(registry):集中存放镜像的地方,是服务器。Docker Hub 是公共仓库,你也可以自建私有仓库。
  • 仓库源(repository):仓库里的一组相关镜像,可以理解成「一个项目」。比如 nginx 就是一个 repository。
  • 标签(tag):同一个 repository 下的不同版本。nginx:1.27nginx: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 默认的去处。前面章节里用的 nginxubuntunode 都是从这儿拉的。

注册账号

要去 Docker Hub 推镜像,得先有账号:

  1. 打开 hub.docker.com,点 Sign Up。
  2. 用邮箱注册,或直接用 Google / GitHub 账号登录。
  3. 完成邮箱验证。

注册完就有了一个「命名空间」,默认是你的用户名。你的镜像都得挂在 你的用户名/镜像名 下面。

登录

命令行里登录:

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.0my-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)分个人版和企业版,个人版免费够用。流程:

  1. 登录阿里云控制台,开通「容器镜像服务」。
  2. 创建命名空间,比如 myteam
  3. 创建镜像仓库,比如 my-app,关联一个代码源或选「本地仓库」。
  4. 在仓库详情页能看到登录地址,格式是 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 都属此类。

如果你只是拉官方镜像慢,配个加速器就行,不用建仓库。要分发自己的镜像,才需要仓库。

小结

镜像共享的标准动作就三步:打标签、登录、推送。换什么仓库都一样,区别只在镜像名前面的地址。

记住几条要点:

  1. 镜像名要带仓库地址和用户名,格式 地址/命名空间/镜像名:标签
  2. 生产环境别用 latest,用具体版本号或 commit 哈希。
  3. 国内优先用阿里云/腾讯云的镜像仓库,同云内网拉取又快又省钱。
  4. CI 里用访问令牌而不是密码。
  5. 自建 registry 适合内网测试,生产用 Harbor 这类方案。

下一章我们换个话题,讲数据持久化—容器删了数据就没了,怎么解决这个问题。