Docker 镜像仓库
镜像仓库(Registry)之于镜像,就像 Git 仓库之于代码——它是存放和分发镜像的中心。前面我们一直用 docker pull nginx,背后就是在从 Docker Hub 这个最大的公共仓库拉。本章讲怎么把自己的镜像推上去,以及怎么搭一个私有仓库。
什么是 Registry
Registry(镜像仓库)是一个服务端程序,提供镜像的存储、版本管理、上传下载 API。它有公共和私有之分:
- 公共仓库:任何人都能拉取镜像。Docker Hub 是最大的,官方镜像都在这。
- 私有仓库:需要登录才能访问,存放公司内部镜像、商业产品。
整套机制可以类比 Git:docker pull = git clone,docker push = git push,docker login = 配置 GitHub 凭证。
Docker Hub:公共仓库
# Docker Hub:最大的公共镜像仓库
# 浏览器访问 https://hub.docker.com 注册账号(免费)
# 假设用户名是 yourname
# 命令行登录(交互式输入密码,或用 access token 更安全)
docker login
# Username: yourname
# Password: ********
# Login Succeeded
# 用 access token 代替密码(强烈推荐)
# Hub 网站 → Account Settings → Security → New Access Token
# 好处:可随时吊销、不给主密码、不同机器不同 token
# 退出登录
docker logout
# 公共镜像无限拉,私有镜像需先 login几个要点:免费账号有1 个私有仓库额度(无限公共仓库);匿名拉取有速率限制(每 6 小时 100 次),登录后提升到 200 次。用 access token 而非密码登录是安全最佳实践——token 可独立吊销,泄露后不影响主账号。
推送镜像到 Docker Hub
把本地构建的镜像推到 Hub,核心是给镜像打对名字:
# 把本地镜像推送到 Docker Hub
# 镜像命名规范:仓库名/镜像名:标签
# yourname/myapp:1.0 用户镜像(yourname 是 Hub 用户名)
# library/nginx:latest 官方镜像(library 可省略,写成 nginx)
# 1. 给本地镜像打"正确名字"的标签(关键步骤!)
docker tag myapp:1.0 yourname/myapp:1.0
# 2. 推送
docker push yourname/myapp:1.0
# 3. 别人(或另一台机器)就能拉了
docker pull yourname/myapp:1.0
# 推多架构镜像(Apple Silicon + Linux 服务器都能用)
# 需要 buildx(新构建工具)
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 \
-t yourname/myapp:1.0 --push .新手最常踩的坑:直接 docker push myapp:1.0 报错 "denied"。原因是镜像名没有 Hub 用户名前缀,Docker 不知道推到哪去。必须先 docker tag 成 yourname/myapp:1.0 再推。多架构构建(buildx)是高级但值得学的技能——它让同一镜像标签在 Intel、ARM、Apple Silicon 上都能跑,推送时用 --push 一步到位。
自建私有 Registry
公司内部镜像不想公开,可以自建一个 registry。Docker 官方提供了 registry:2 镜像,几行命令就能跑:
# 自建私有 registry(用官方 registry 镜像)
# 1. 跑一个 registry 容器(本身也是一个 Docker 镜像)
docker run -d -p 5000:5000 --name registry \
-v registrydata:/var/lib/registry \
--restart always \
registry:2
# 2. 给本地镜像打"指向私有仓库"的标签
# 命名规范:仓库地址/镜像名:标签
docker tag myapp:1.0 localhost:5000/myapp:1.0
# 3. 推送
docker push localhost:5000/myapp:1.0
# 4. 另一台机器(同一内网)拉取
docker pull 192.168.1.100:5000/myapp:1.0
# 5. 默认 registry 用 HTTPS,自建的 HTTP 会被拒
# 要在客户端配置 insecure registry(仅测试用,生产要配 TLS)
# Linux:编辑 /etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.100:5000"]
}
# macOS / Windows:Docker Desktop → Settings → Docker Engine
# 重启 Docker 生效这种最简方案适合内网测试。生产环境强烈建议配 TLS 证书(用 Let's Encrypt 免费证书),否则用 insecure-registries 配置既不安全也麻烦。数据卷 registrydata 很重要——registry 容器删了,镜像数据还在,可恢复。
Harbor:企业级方案
裸 registry 太简陋(没 UI、没权限、没扫描),企业通常用 Harbor(CNCF 毕业项目,VMware 开源):
# Harbor:企业级私有仓库(带 UI、权限、扫描)
# Harbor 比 raw registry 多了:
# - Web 管理界面
# - 基于角色的权限控制(RBAC)
# - 镜像漏洞扫描(Trivy / Clair)
# - 镜像签名(Notary / Cosign)
# - 复制(多机房同步)
# - 审计日志
# - 垃圾回收
# 安装(离线包,生产推荐)
# 1. 下载 harbor-offline-installer-vX.Y.Z.tgz
wget https://github.com/goharbor/harbor/releases/download/v2.8.0/harbor-offline-installer-v2.8.0.tgz
tar xzf harbor-offline-installer-v2.8.0.tgz
cd harbor
# 2. 改配置
cp harbor.yml.tmpl harbor.yml
# 编辑 harbor.yml:hostname、https 证书、admin 密码
# 3. 安装并启动
./install.sh
# 4. 浏览器访问 https://your-host ,默认账号 admin / Harbor12345
# 客户端使用(和 Docker Hub 一样)
docker login your-host
docker tag myapp:1.0 your-host/project/myapp:1.0
docker push your-host/project/myapp:1.0Harbor 的漏洞扫描特别有价值:每次推送镜像自动用 Trivy 扫已知 CVE 漏洞,不合格的可以策略性阻止部署。复制功能适合多机房:主仓库推送后自动同步到各地分仓库,加速拉取。如果公司认真用容器,Harbor 几乎是标配。
仓库生态全景
除了 Docker Hub,还有很多选择:
# 镜像仓库生态全景
# 公共仓库(免费,任何人能拉)
# Docker Hub hub.docker.com 最大,官方
# quay.io Red Hat 运营 高质量,CI 友好
# GitHub Container ghcr.io GitHub 集成,免费额度大
# Amazon ECR Public AWS 公共镜像
# 云厂商托管(按存储/流量计费,免运维)
# Amazon ECR aws.amazon.com/ecr
# Google Artifact cloud.google.com/artifact-registry
# Azure ACR azure.com/container-registry
# 阿里云 ACR cr.console.aliyun.com
# 腾讯云 TCR cloud.tencent.com/product/tcr
# 自建(完全可控,要自己运维)
# registry:2 官方最简版,适合内部测试
# Harbor 企业级,功能全,生产首选
# Sonatype Nexus 通用制品库,也支持 Docker
# 选择建议:
# 个人/开源项目 → Docker Hub / GHCR(免费)
# 中小公司 → 云厂商托管(免运维)
# 大公司/合规 → Harbor 自建(完全可控)对个人开发者,GitHub Container Registry (GHCR) 是个隐藏宝藏——和 GitHub Actions 集成极好,CI 自动构建推送,免费额度大方,私有仓库也免费。开源项目可以同时推 Docker Hub 和 GHCR,给用户多个选择。
镜像加速器(回顾)
国内拉 Docker Hub 慢,前面 env 章讲过配镜像加速器。这里补充原理:加速器本质是一个只读的代理缓存 registry——你 pull 时它先看本地有没有缓存,有就直接返回(快),没有就代你向 Docker Hub 拉一份缓存下来(慢一次,之后快)。所以加速器对 pull 有效,但不能用来 push。推自己的镜像还是得直接推 Docker Hub 或私有仓库。
选择建议
- 个人开源项目:Docker Hub + GHCR,都免费,双推覆盖广。
- 个人私有镜像:GHCR 私有仓库(免费)或 Docker Hub 的 1 个免费私有额度。
- 中小公司:云厂商托管(ECR/ACR/TCR),按量计费、免运维、和云上其他服务集成好。
- 大公司/强合规:自建 Harbor,完全可控,配 LDAP/SSO、漏洞扫描、复制策略。
- 内网/离线:裸 registry 容器最简单,镜像 save/load 也能搬。
← 上一篇 Docker Compose
下一篇 Docker 最佳实践 →