第10章:企业级镜像仓库

第10章:企业级镜像仓库

本章目标:理解镜像仓库的作用,学会搭建和管理 Docker Hub、Harbor 等企业级私有镜像仓库。


10.1 镜像仓库概览

10.1.1 什么是镜像仓库

镜像仓库(Registry)是用于存储和分发 Docker 镜像的服务。它是容器化工作流的核心组件,负责镜像的存储、版本管理和分发。

复制代码
镜像仓库的工作流程:

开发者                        仓库服务                        部署环境
┌──────────┐              ┌──────────────┐              ┌──────────┐
│ docker   │  push        │              │  pull        │ 生产服务器│
│ build    │ ──────────►  │  Registry    │  ──────────► │          │
│          │              │  (镜像存储)   │              │          │
└──────────┘              └──────────────┘              └──────────┘

10.1.2 公有仓库 vs 私有仓库

特性 公有仓库(Docker Hub) 私有仓库(Harbor 等)
访问控制 公开或受限 完全自主控制
数据安全 数据存储在第三方 数据自主可控
网络速度 受国际带宽限制 内网高速访问
镜像扫描 有限功能 完整安全扫描
访问审计 基础日志 完整审计日志
成本 免费/付费 自建成本
适用场景 开源项目、个人 企业生产环境

10.2 Docker Hub

10.2.1 Docker Hub 简介

Docker Hub 是 Docker 官方的公共镜像仓库,也是最大的容器镜像社区。

bash 复制代码
# 注册 Docker Hub 账号
# 访问: https://hub.docker.com

# 登录
docker login
# Username: your-username
# Password: your-password

# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest

# 推送镜像
docker tag myapp:latest your-username/myapp:v1.0
docker push your-username/myapp:v1.0

10.2.2 Docker Hub 的限制

免费账户 付费账户
1 个私有仓库 无限私有仓库
100次/6小时 pull 无限 pull
无自动构建 自动构建
无组织管理 组织管理

10.3 Harbor 私有仓库

10.3.1 Harbor 是什么

Harbor 是由 VMware 开源的企业级容器镜像仓库,提供了镜像存储、访问控制、安全扫描、审计日志等功能。

复制代码
Harbor 架构:

┌──────────────────────────────────────────────────────────┐
│                      Harbor 架构                          │
│                                                          │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │
│  │   Web UI     │  │   Core API   │  │   Registry   │  │
│  │  (管理界面)   │  │  (核心服务)   │  │  (镜像存储)   │  │
│  └──────┬───────┘  └──────┬───────┘  └──────┬───────┘  │
│         │                 │                  │          │
│  ┌──────┴─────────────────┴──────────────────┴───────┐ │
│  │              Nginx (反向代理)                       │ │
│  └──────────────────────────────────────────────────┘ │
│                                                          │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐            │
│  │ Harbor DB│  │  Redis    │  │  Trivy   │            │
│  │ (PostgreSQL) │ (缓存)   │  │ (漏洞扫描)│            │
│  └──────────┘  └──────────┘  └──────────┘            │
└──────────────────────────────────────────────────────────┘

10.3.2 Harbor 安装部署

bash 复制代码
# 下载 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

# 复制配置文件
cp harbor.yml.tmpl harbor.yml

# 编辑配置文件
cat > harbor.yml << 'EOF'
# Harbor 配置
hostname: harbor.example.com

# HTTP 配置
http:
  port: 80

# HTTPS 配置(生产环境必须)
https:
  port: 443
  certificate: /data/cert/harbor.crt
  private_key: /data/cert/harbor.key

# 管理员初始密码
harbor_admin_password: Harbor12345

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

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

# 镜像存储配置
storage_service:
  s3:  # 如果使用 S3 存储
    accesskey: your-access-key
    secretkey: your-secret-key
    region: us-east-1
    bucket: harbor-images

# Trivy 漏洞扫描
trivy:
  ignore_unfixed: false
  security_check: vuln
  insecure: false
EOF

# 生成自签名证书(生产环境使用正式证书)
mkdir -p /data/cert
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 \
  -nodes -keyout /data/cert/harbor.key \
  -out /data/cert/harbor.crt \
  -subj "/CN=harbor.example.com"

# 安装 Harbor
./install.sh --with-trivy --with-chartmuseum

# 验证安装
docker compose ps

10.3.3 Harbor 管理

bash 复制代码
# 访问 Harbor Web UI
# http://harbor.example.com
# 用户名: admin
# 密码: Harbor12345

# 停止 Harbor
docker compose down

# 启动 Harbor
docker compose up -d

# 查看日志
docker compose logs -f

# 修改配置后重新安装
./prepare
docker compose down
docker compose up -d

10.3.4 使用 Harbor 推送镜像

bash 复制代码
# 1. 登录 Harbor
docker login harbor.example.com
# Username: admin
# Password: Harbor12345

# 2. 给镜像打标签
docker tag nginx:latest harbor.example.com/library/nginx:v1.0

# 3. 推送镜像
docker push harbor.example.com/library/nginx:v1.0

# 4. 从 Harbor 拉取镜像
docker pull harbor.example.com/library/nginx:v1.0

10.3.5 Harbor 项目管理

复制代码
Harbor 项目管理最佳实践:

项目结构:
├── library          公共基础镜像
├── dev              开发环境镜像
├── staging          测试环境镜像
├── production       生产环境镜像
└── team-a           团队 A 的镜像

权限管理:
├── 系统管理员        完全控制
├── 项目管理员        项目级管理
├── 开发人员          推送/拉取
└── 访客              仅拉取

访问控制:
├── 公开项目          所有人可拉取
└── 私有项目          需要授权

10.4 Docker Registry(轻量级方案)

10.4.1 使用官方 Registry

bash 复制代码
# 启动官方 Registry
docker run -d \
  --name registry \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  registry:2

# 使用 Registry
docker tag nginx:latest localhost:5000/nginx:v1.0
docker push localhost:5000/nginx:v1.0
docker pull localhost:5000/nginx:v1.0

# 查看仓库中的镜像
curl http://localhost:5000/v2/_catalog
# {"repositories":["nginx"]}

# 查看镜像标签
curl http://localhost:5000/v2/nginx/tags/list
# {"name":"nginx","tags":["v1.0"]}

10.4.2 Registry 配置

yaml 复制代码
# docker-compose.yml
version: '3.8'

services:
  registry:
    image: registry:2
    container_name: docker-registry
    restart: unless-stopped
    ports:
      - "5000:5000"
    volumes:
      - registry-data:/var/lib/registry
      - ./config.yml:/etc/docker/registry/config.yml
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm

volumes:
  registry-data:
yaml 复制代码
# config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
  delete:
    enabled: true
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
  tls:
    certificate: /certs/registry.crt
    key: /certs/registry.key

10.5 镜像安全扫描

10.5.1 Docker Scout

bash 复制代码
# Docker Scout 是 Docker 官方的安全扫描工具
docker scout cves nginx:latest
docker scout recommendations nginx:latest

# 扫描本地镜像
docker build -t myapp:latest .
docker scout cves myapp:latest

10.5.2 Trivy(开源方案)

bash 复制代码
# 安装 Trivy
# macOS
brew install trivy

# Linux
sudo apt-get install trivy

# 扫描镜像漏洞
trivy image nginx:latest

# 只显示高危和严重漏洞
trivy image --severity HIGH,CRITICAL nginx:latest

# 输出 JSON 报告
trivy image -f json -o report.json nginx:latest

# 扫描并修复
trivy image --exit-code 1 --severity HIGH,CRITICAL nginx:latest

10.5.3 Clair(开源方案)

bash 复制代码
# Clair 是 CoreOS 开源的漏洞扫描器
# 通常与 Harbor 集成使用

# 单独使用 Clair
docker run -d --name clair \
  -p 6060:6060 \
  quay.io/coreos/clair:latest

# 使用 Clair 扫描
clair-scanner --clair http://localhost:6060 \
  --threshold LOW \
  nginx:latest

10.6 镜像签名与信任

10.6.1 Docker Content Trust(DCT)

bash 复制代码
# 启用 Docker Content Trust
export DOCKER_CONTENT_TRUST=1

# 推送时自动签名
docker push myregistry.com/myapp:v1.0
# 会自动生成签名密钥

# 拉取时自动验证签名
docker pull myregistry.com/myapp:v1.0

# 禁用 DCT(临时)
export DOCKER_CONTENT_TRUST=0

10.6.2 Cosign(更现代的方案)

bash 复制代码
# 安装 Cosign
brew install cosign

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

# 签名镜像
cosign sign --key cosign.key myregistry.com/myapp:v1.0

# 验证签名
cosign verify --key cosign.pub myregistry.com/myapp:v1.0

10.7 镜像治理策略

10.7.1 镜像命名规范

复制代码
镜像命名最佳实践:

<registry>/<namespace>/<repository>:<tag>

示例:
# Docker Hub
docker.io/mycompany/webapp:v1.2.3

# Harbor
harbor.example.com/production/webapp:v1.2.3

# 阿里云
registry.cn-hangzhou.aliyuncs.com/mycompany/webapp:v1.2.3

# 标签规范
webapp:1.2.3          语义化版本
webapp:commit-a1b2c3d Git SHA
webapp:2024.06.15     日期标签
webapp:staging         环境标签

10.7.2 镜像生命周期管理

bash 复制代码
# 自动化镜像清理策略

# 1. 保留最近 N 个版本
# 2. 保留最近 N 天的镜像
# 3. 保留特定标签(如 production)

# Harbor 中配置保留策略
# Project → Configuration → Tag Retention

# 自定义清理脚本
#!/bin/bash
# 清理保留策略

REGISTRY="harbor.example.com"
PROJECT="production"
KEEP_TAGS=10
KEEP_DAYS=30

# 删除超过保留数量的标签
# (使用 Harbor API)

10.7.3 镜像缓存策略

bash 复制代码
# 使用代理缓存加速拉取

# 配置 Docker 使用代理
# /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com"
  ]
}

# 使用 Squid 作为本地缓存
docker run -d --name squid \
  -p 3128:3128 \
  -v squid-data:/var/cache/squid \
  squid

# 配置 Docker 使用 Squid 代理
# /etc/systemd/system/docker.service.d/proxy.conf
[Service]
Environment="HTTP_PROXY=http://squid:3128"
Environment="HTTPS_PROXY=http://squid:3128"

10.8 动手实验

实验 10.1:搭建私有 Registry

bash 复制代码
# 1. 启动 Registry
docker run -d \
  --name registry \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  registry:2

# 2. 推送镜像
docker tag nginx:latest localhost:5000/nginx:v1.0
docker push localhost:5000/nginx:v1.0

# 3. 验证
curl http://localhost:5000/v2/_catalog
curl http://localhost:5000/v2/nginx/tags/list

# 4. 删除本地镜像
docker rmi localhost:5000/nginx:v1.0

# 5. 从 Registry 拉取
docker pull localhost:5000/nginx:v1.0

# 6. 清理
docker rm -f registry
docker volume rm registry-data

实验 10.2:使用 Trivy 扫描镜像

bash 复制代码
# 1. 扫描官方镜像
trivy image nginx:latest

# 2. 只显示高危漏洞
trivy image --severity HIGH,CRITICAL nginx:latest

# 3. 扫描你自己的镜像
docker build -t myapp:latest .
trivy image myapp:latest

# 4. 输出报告
trivy image -f json -o trivy-report.json nginx:latest

10.9 本章小结

方案 特点 适用场景
Docker Hub 公有、免费、简单 开源项目、个人
Harbor 企业级、功能完整 企业生产环境
Registry 轻量级、简单 小型团队、测试

10.10 课后练习

  1. 基础题:使用 Docker Registry 搭建私有镜像仓库。
  2. 进阶题:使用 Trivy 扫描你的镜像,分析安全漏洞。
  3. 实践题:(选做)使用 Docker Compose 部署 Harbor。

📖 下一章:Docker 安全加固 ------ 深入理解 Docker 安全风险和防护措施