强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Docker 完全指南 / 15 - 镜像仓库

15 - 镜像仓库

搭建 Harbor 私有仓库、使用 Registry API 管理镜像,以及镜像签名与安全验证。


15.1 镜像仓库概述

公共 vs 私有仓库

仓库说明适用场景
Docker HubDocker 官方公共仓库公开镜像、社区镜像
GitHub Container Registry (ghcr.io)GitHub 配套仓库开源项目
AWS ECRAmazon 弹性容器仓库AWS 生态
Google Artifact RegistryGoogle Cloud 镜像仓库GCP 生态
Azure ACRAzure 容器仓库Azure 生态
Harbor开源企业级私有仓库自建私有仓库首选

15.2 Docker Registry(基础方案)

快速部署

# 运行基础 Registry
docker run -d \
    --name registry \
    -p 5000:5000 \
    -v registry-data:/var/lib/registry \
    --restart unless-stopped \
    registry:2

# 标记并推送镜像
docker tag nginx:alpine localhost:5000/nginx:alpine
docker push localhost:5000/nginx:alpine

# 拉取镜像
docker pull localhost:5000/nginx:alpine

# 查看仓库中的镜像
curl http://localhost:5000/v2/_catalog

# 查看镜像的标签
curl http://localhost:5000/v2/nginx/tags/list

带认证的 Registry

# 创建认证目录
mkdir -p auth

# 创建用户名和密码
docker run --rm \
    --entrypoint htpasswd \
    httpd:2 -Bbn admin password123 > auth/htpasswd

# 启动带认证的 Registry
docker run -d \
    --name registry \
    -p 5000:5000 \
    -v registry-data:/var/lib/registry \
    -v $(pwd)/auth:/auth \
    -e "REGISTRY_AUTH=htpasswd" \
    -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
    -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
    --restart unless-stopped \
    registry:2

# 登录
docker login localhost:5000
# 用户名: admin
# 密码: password123

带 TLS 的 Registry

# 生成自签名证书(测试用)
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 \
    -keyout certs/domain.key \
    -x509 -days 365 \
    -out certs/domain.crt \
    -subj "/CN=registry.example.com"

# 启动带 TLS 的 Registry
docker run -d \
    --name registry \
    -p 443:443 \
    -v registry-data:/var/lib/registry \
    -v $(pwd)/certs:/certs \
    -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
    --restart unless-stopped \
    registry:2

# 客户端信任证书
sudo mkdir -p /etc/docker/certs.d/registry.example.com
sudo cp certs/domain.crt /etc/docker/certs.d/registry.example.com/ca.crt
sudo systemctl restart docker

# 使用
docker login registry.example.com
docker tag nginx:alpine registry.example.com/nginx:alpine
docker push registry.example.com/nginx:alpine

15.3 Harbor 私有仓库

Harbor 简介

Harbor 是 VMware 开源的企业级容器镜像仓库,CNCF 毕业项目。

特性说明
镜像存储OCI 兼容,支持 Docker 和 Helm Chart
访问控制基于角色的访问控制 (RBAC)
安全扫描集成 Trivy 镜像漏洞扫描
镜像签名支持 Cosign / Notary 签名验证
镜像复制跨数据中心镜像同步
垃圾回收自动清理无用镜像
审计日志完整的操作审计记录
高可用支持多节点部署

Harbor 安装

# 1. 下载 Harbor 离线安装包
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
tar xzf harbor-offline-installer-v2.10.0.tgz
cd harbor

# 2. 复制并编辑配置文件
cp harbor.yml.tmpl harbor.yml

harbor.yml 关键配置

# harbor.yml

# 访问地址
hostname: harbor.example.com

# HTTP 配置
http:
  port: 80

# HTTPS 配置(推荐)
https:
  port: 443
  certificate: /data/cert/server.crt
  private_key: /data/cert/server.key

# 管理员初始密码
harbor_admin_password: Harbor12345

# 数据库配置
database:
  password: root123
  max_idle_conns: 100
  max_open_conns: 900

# 数据存储路径
data_volume: /data/harbor

# Trivy 安全扫描
trivy:
  ignore_unfixed: false
  skip_update: false
  insecure: false

# 日志配置
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor

安装 Harbor

# 运行安装脚本(包含 Trivy 扫描器和 Chart 仓库)
sudo ./install.sh --with-trivy --with-chartmuseum

# 验证服务状态
docker compose ps

# 预期输出:
# NAME                COMMAND                  SERVICE             STATUS
# harbor-core         "/harbor/entrypoint.…"   core                running
# harbor-db           "/docker-entrypoint.…"   postgresql          running
# harbor-jobservice   "/harbor/entrypoint.…"   jobservice          running
# harbor-log          "/bin/sh -c /usr/loc…"   log                 running
# harbor-portal       "nginx -g 'daemon of…"   portal              running
# nginx               "nginx -g 'daemon of…"   proxy               running
# redis               "redis-server /etc/r…"   redis               running
# registry            "/home/harbor/entryp…"   registry            running
# registryctl         "/home/harbor/start.…"   registryctl         running
# trivy-adapter       "/home/scanner/entry…"   trivy-adapter       running

Harbor 使用

1. 访问管理界面: https://harbor.example.com
2. 用户名: admin
3. 密码: Harbor12345(首次登录后修改)

常用操作:
  ├── 项目管理: 创建项目(如 library, production)
  ├── 用户管理: 创建用户,分配项目权限
  ├── 镜像管理: 查看、删除、复制镜像
  ├── 安全扫描: 查看镜像漏洞报告
  ├── 配置管理: 系统配置、复制规则
  └── 日志审计: 查看操作日志

推送镜像到 Harbor

# 1. 登录 Harbor
docker login harbor.example.com

# 2. 标记镜像
docker tag my-app:v1.0 harbor.example.com/library/my-app:v1.0

# 3. 推送
docker push harbor.example.com/library/my-app:v1.0

# 4. 拉取
docker pull harbor.example.com/library/my-app:v1.0

Harbor 项目权限

角色权限
项目管理员管理项目成员、配置、标签
维护人员推送/拉取镜像、扫描、打标签
开发人员推送/拉取镜像
访客仅拉取镜像
受限访客仅拉取镜像(无日志)

15.4 镜像复制(Replication)

Harbor 支持跨数据中心的镜像同步。

镜像复制场景:
  ┌────── Harbor A ──────┐    ┌────── Harbor B ──────┐
  │   开发环境仓库         │    │   生产环境仓库         │
  │                       │───>│                       │
  │  推送镜像 → 自动同步   │    │  拉取镜像(只读)      │
  └───────────────────────┘    └───────────────────────┘
配置步骤:
  1. Harbor B → 系统管理 → 仓库管理 → 新建目标
     - 目标 URL: https://harbor.example.com
     - 认证信息: 用户名/密码

  2. Harbor B → 系统管理 → 复制管理 → 新建规则
     - 名称: sync-from-dev
     - 源项目: library
     - 目标仓库: Harbor A
     - 触发模式: 事件驱动 / 定时
     - 过滤: 镜像名 * , 标签 v*

15.5 镜像签名

Cosign 签名

# 安装 cosign
# https://github.com/sigstore/cosign
go install github.com/sigstore/cosign/v2/cmd/cosign@latest

# 生成密钥对
cosign generate-key-pair

# 签名镜像
cosign sign --key cosign.key harbor.example.com/library/my-app:v1.0

# 验证签名
cosign verify --key cosign.pub harbor.example.com/library/my-app:v1.0

Harbor 配置签名验证

1. 项目 → 配置 → 漏洞扫描策略
   - 自动扫描: 推送时自动扫描

2. 项目 → 配置 → 内容信任
   - 启用内容信任: 仅允许签名镜像

15.6 Registry API

# 列出仓库中的所有镜像
curl -s https://harbor.example.com/v2/_catalog | jq .

# 列出镜像的所有标签
curl -s https://harbor.example.com/v2/library/nginx/tags/list | jq .

# 获取镜像 manifest
curl -s -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
    https://harbor.example.com/v2/library/nginx/manifests/latest | jq .

# 删除镜像
# 需要先获取 digest
DIGEST=$(curl -s -I \
    -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
    https://harbor.example.com/v2/library/nginx/manifests/latest \
    | grep Docker-Content-Digest | awk '{print $2}' | tr -d '\r')

curl -X DELETE \
    "https://harbor.example.com/v2/library/nginx/manifests/$DIGEST"

15.7 垃圾回收

# Harbor 管理界面:
# 系统管理 → 垃圾回收 → 立即运行

# 手动触发 Harbor 垃圾回收
docker exec -it harbor-core harbor gc

# 基础 Registry 的垃圾回收
docker exec -it registry bin/registry garbage-collect /etc/docker/registry/config.yml

15.8 Docker Hub 配置

# 登录 Docker Hub
docker login

# 使用 Access Token(推荐,不用密码)
# Docker Hub → Account Settings → Security → New Access Token
docker login -u <username> --password-stdin <<< "<access-token>"

# 推送到 Docker Hub
docker tag my-app:v1.0 my-dockerhub-user/my-app:v1.0
docker push my-dockerhub-user/my-app:v1.0

# 配置私有仓库镜像
# /etc/docker/daemon.json
{
  "registry-mirrors": ["https://docker.1ms.run"]
}

要点回顾

要点核心内容
基础 Registry轻量方案,适合小型团队,注意配置认证和 TLS
Harbor企业级方案,RBAC、安全扫描、镜像复制、审计日志
镜像签名使用 Cosign 确保镜像来源可信
镜像复制跨数据中心同步,支持事件驱动和定时
API 管理Registry API 支持自动化管理镜像

注意事项

HTTPS 必须: 生产环境的私有仓库必须配置 HTTPS。Docker 默认不信任 HTTP 仓库(localhost 除外)。

定期清理: 镜像仓库会持续增长,配置垃圾回收策略清理无用镜像。

备份策略: 定期备份 Harbor 数据库和存储卷。


下一步

16 - CI/CD 集成:学习 Docker 与 CI/CD 流水线的集成。