第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 课后练习
- 基础题:使用 Docker Registry 搭建私有镜像仓库。
- 进阶题:使用 Trivy 扫描你的镜像,分析安全漏洞。
- 实践题:(选做)使用 Docker Compose 部署 Harbor。
📖 下一章:Docker 安全加固 ------ 深入理解 Docker 安全风险和防护措施