Chapter 09

镜像仓库

Docker Hub、GitHub Container Registry、Harbor 私有仓库,以及国内镜像加速

什么是镜像仓库(Registry)

镜像仓库是存储和分发 Docker 镜像的服务。它解决了镜像的共享和分发问题:你在本机构建的镜像,通过 Registry 可以被世界上任何地方的机器拉取和运行。

完整镜像引用格式:


# registry/namespace/repository:tag

docker.io/library/nginx:1.25         # Docker Hub 官方镜像(简写:nginx:1.25)
docker.io/username/myapp:1.0         # Docker Hub 个人镜像
ghcr.io/org/myapp:main               # GitHub Container Registry
registry.aliyuncs.com/ns/myapp:v1   # 阿里云镜像仓库
192.168.1.100:5000/myapp:latest      # 自建私有仓库

Docker Hub

Docker Hub(hub.docker.com)是默认的公共 Registry,提供:

推送镜像到 Docker Hub


# 1. 登录 Docker Hub
docker login
# 输入用户名和密码(或 Token)

# 2. 为镜像打标签(命名规则:username/repo:tag)
docker tag myapp:1.0 yourusername/myapp:1.0
docker tag myapp:1.0 yourusername/myapp:latest

# 3. 推送镜像
docker push yourusername/myapp:1.0
docker push yourusername/myapp:latest

# 4. 从任何机器拉取
docker pull yourusername/myapp:1.0
💡

使用 Access Token 代替密码 — 在 Docker Hub Settings → Security → New Access Token 中创建访问令牌,将令牌(而非账号密码)用于 CI/CD 环境,可以精细控制权限(读/写/删),并随时撤销。

GitHub Container Registry(ghcr.io)

GitHub 提供的容器镜像服务,与 GitHub 生态深度集成:


# 使用 GitHub Personal Access Token 登录
echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin

# 推送到 ghcr.io
docker tag myapp:1.0 ghcr.io/your-org/myapp:1.0
docker push ghcr.io/your-org/myapp:1.0

私有镜像仓库

为什么需要私有仓库

方案一:registry:2(官方简单方案)


# 启动一个私有 Registry(无认证,仅内网使用)
docker run -d \
  --name private-registry \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  --restart unless-stopped \
  registry:2

# 推送到私有仓库
docker tag myapp:1.0 localhost:5000/myapp:1.0
docker push localhost:5000/myapp:1.0

# 允许 Docker 使用 HTTP(不安全,仅测试)
# 在 /etc/docker/daemon.json 中添加:
# { "insecure-registries": ["192.168.1.100:5000"] }

方案二:Harbor(企业级推荐)

Harbor 是 CNCF 毕业项目,是功能最完整的开源私有 Registry:

功能说明
角色权限管理项目级别的用户/组 RBAC,精细控制读/写/管理权限
漏洞扫描集成 Trivy/Clair 自动扫描镜像 CVE,阻止有漏洞镜像部署
镜像签名集成 Notary,确保镜像真实性
复制策略跨 Registry 自动同步镜像(用于多机房/多云)
配额管理限制每个项目的存储空间
Helm Chart 仓库同时存储容器镜像和 Helm Chart
审计日志所有操作可追踪

# 用 Docker Compose 快速部署 Harbor
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-online-installer-v2.9.0.tgz
tar xzf harbor-online-installer-v2.9.0.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
# 编辑 harbor.yml:设置 hostname、HTTPS 证书、admin 密码等
sudo ./install.sh

镜像命名规范总结


# 格式:[registry[:port]/][namespace/]repository[:tag][@digest]

nginx                          # 简写:docker.io/library/nginx:latest
nginx:1.25                     # 指定版本
ubuntu:22.04                   # OS 镜像
node:18-alpine                 # 官方镜像变体

username/myapp:1.0             # Docker Hub 个人镜像
org/service-name:v2.3.1        # 组织镜像,语义化版本

ghcr.io/org/myapp:sha-abc123   # GitHub CR,Git SHA 标签
harbor.company.com/project/app:prod-20241201  # 私有仓库,日期标签

# 使用摘要(digest)确保完全不可变
nginx@sha256:a3e8e3c525c4b5c8e8e3c525...

国内加速:配置 Registry Mirror

在国内直接从 Docker Hub 拉取镜像速度很慢,可以配置镜像加速器:

Docker Desktop 配置

打开 Docker Desktop → Settings → Docker Engine,在 JSON 配置中添加:


{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://<your-id>.mirror.aliyuncs.com"
  ]
}

Linux(Docker Engine)配置


# 编辑 /etc/docker/daemon.json
sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置
docker info | grep -A 5 "Registry Mirrors"

本章小结 — 选择合适的 Registry 取决于场景:开源项目用 Docker Hub 或 ghcr.io;企业私有部署用 Harbor。无论哪种方案,都要建立清晰的镜像命名和标签策略,确保镜像可追溯。