Docker 完全指南 / 15 - 镜像仓库
15 - 镜像仓库
搭建 Harbor 私有仓库、使用 Registry API 管理镜像,以及镜像签名与安全验证。
15.1 镜像仓库概述
公共 vs 私有仓库
| 仓库 | 说明 | 适用场景 |
|---|---|---|
| Docker Hub | Docker 官方公共仓库 | 公开镜像、社区镜像 |
| GitHub Container Registry (ghcr.io) | GitHub 配套仓库 | 开源项目 |
| AWS ECR | Amazon 弹性容器仓库 | AWS 生态 |
| Google Artifact Registry | Google Cloud 镜像仓库 | GCP 生态 |
| Azure ACR | Azure 容器仓库 | 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 流水线的集成。