15.9.2 私有仓库搭建与配置(Registry/Harbor)
私有镜像仓库用于在内网安全、稳定地存储与分发镜像,常见实现包括官方 Registry 与企业级 Harbor。Registry 轻量、部署简单,适合小规模;Harbor 提供权限、审计、扫描与复制等企业特性,适合生产环境。
原理草图:镜像推送/拉取与仓库组件
Registry 搭建与配置(单机示例)#
1)安装与运行
# 1. 创建数据目录
sudo mkdir -p /data/registry
# 2. 拉取官方镜像
docker pull registry:2
# 3. 运行(映射 5000 端口,持久化数据)
docker run -d --name registry \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
--restart=always \
registry:2
# 4. 验证服务
curl -s http://127.0.0.1:5000/v2/ | jq .
# 预期:返回 {} 或空 JSON 对象
命令解释
- -p 5000:5000:暴露 Registry API 默认端口。
- -v /data/registry:/var/lib/registry:镜像层存储持久化。
- /v2/:Registry V2 API 健康检查入口。
2)TLS 与基础认证(生产必做)
生成自签证书并启用 htpasswd 认证(示例域名:reg.example.com):
# 1. 生成证书
sudo mkdir -p /etc/registry/certs /etc/registry/auth
openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout /etc/registry/certs/registry.key \
-x509 -days 365 \
-out /etc/registry/certs/registry.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Ops/OU=Dev/CN=reg.example.com"
# 2. 创建认证文件(用户名: devops)
docker run --rm --entrypoint htpasswd \
httpd:2 -Bbn devops 'StrongPassw0rd' \
| sudo tee /etc/registry/auth/htpasswd
# 3. 运行带 TLS + 基础认证的 Registry
docker run -d --name registry \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
-v /etc/registry/certs:/certs \
-v /etc/registry/auth:/auth \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
--restart=always \
registry:2
客户端信任证书(Docker):
sudo mkdir -p /etc/docker/certs.d/reg.example.com:5000
sudo cp /etc/registry/certs/registry.crt \
/etc/docker/certs.d/reg.example.com:5000/ca.crt
sudo systemctl restart docker
3)推送/拉取验证
# 登录
docker login reg.example.com:5000
# 用户名: devops
# 密码: StrongPassw0rd
# 打标签并推送
docker pull nginx:1.25
docker tag nginx:1.25 reg.example.com:5000/base/nginx:1.25
docker push reg.example.com:5000/base/nginx:1.25
# 拉取验证
docker rmi reg.example.com:5000/base/nginx:1.25
docker pull reg.example.com:5000/base/nginx:1.25
4)垃圾回收(删除后释放空间)
# 1. 开启删除功能(registry config.yml)
cat >/etc/registry/config.yml <<'EOF'
version: 0.1
storage:
filesystem:
rootdirectory: /var/lib/registry
delete:
enabled: true
http:
addr: :5000
EOF
# 2. 以配置文件运行
docker run -d --name registry \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
-v /etc/registry/config.yml:/etc/docker/registry/config.yml \
--restart=always \
registry:2
# 3. 执行垃圾回收(需要停写入)
docker exec -it registry registry garbage-collect /etc/docker/registry/config.yml
Registry 常见排错
- x509: certificate signed by unknown authority
解决:在客户端安装 CA 证书并重启 Docker。
- denied: requested access to the resource is denied
解决:确认 docker login 与仓库权限,镜像命名符合 reg.example.com:5000/namespace/name:tag。
- manifest unknown
解决:确认镜像标签存在,重新 docker push。
Harbor 搭建与配置(离线安装包示例)#
1)准备与安装
# 1. 下载离线安装包并解压
tar zxvf harbor-offline-installer-v2.8.0.tgz
cd harbor
# 2. 复制并编辑配置
cp harbor.yml.tmpl harbor.yml
sed -i 's/hostname: reg.mydomain.com/hostname: harbor.example.com/' harbor.yml
# 3. 配置证书路径(确保证书已签发)
# harbor.yml 中关键项:
# https:
# port: 443
# certificate: /data/certs/harbor.crt
# private_key: /data/certs/harbor.key
# 4. 启动 Harbor
./install.sh --with-trivy
# 5. 访问 UI
# https://harbor.example.com
# 默认管理员:admin/Harbor12345(首次登录请立即修改)
Harbor 组件与目录结构
harbor/
├── harbor.yml # 主配置
├── common/ # 组件配置与证书
├── data/ # 持久化数据
├── docker-compose.yml # 组件编排
└── logs/ # 日志
2)配置外部数据库与存储(示意)
# harbor.yml 样例片段(关键项)
database:
type: external
external:
host: 10.0.0.10
port: 5432
username: harbor
password: HarborDBPass
db_name: registry
storage_service:
filesystem:
rootdirectory: /data/harbor
3)创建项目、权限与机器人账号
步骤:UI -> Projects -> New Project
- Project Name: base
- Access Level: Private
- 成员角色:Developer(推送)、Guest(拉取)
- Robot Account:用于 CI/CD 免交互登录
4)镜像复制(跨机房示例)
UI -> Administration -> Registries
- 添加目标仓库(目标 Harbor/Registry)
- 创建 Replication Rule:
- Source: harbor.example.com
- Destination: harbor-dr.example.com
- Trigger: Manual/Scheduled
- Filter: project=base, tag=*
Harbor 常见排错
- UI 无法访问:检查 docker ps 组件状态、nginx 端口、证书路径。
- jobservice 任务失败:检查 logs/jobservice.log 与权限配置。
- 扫描失败:确认 Trivy 数据库更新与网络访问,检查 scanner 容器日志。
客户端配置与使用建议#
Docker / Containerd 信任证书
# Docker 证书目录
sudo mkdir -p /etc/docker/certs.d/harbor.example.com
sudo cp /data/certs/harbor.crt /etc/docker/certs.d/harbor.example.com/ca.crt
sudo systemctl restart docker
命名规范与版本策略
# 推荐命名:<registry>/<project>/<app>:<semver>
docker tag app:1.2.3 harbor.example.com/base/app:1.2.3
docker push harbor.example.com/base/app:1.2.3
运维要点(备份/监控/高可用)#
备份与恢复要点
# 备份 Harbor 数据(简化示例)
tar zcvf /backup/harbor-data-$(date +%F).tgz /data/harbor /data/database
# 恢复:
# 停止 Harbor -> 恢复数据 -> 启动 Harbor
监控指标建议
- 存储容量与增长率
- 复制任务成功率
- 扫描失败率
- API 请求延迟
练习与实操任务#
- 部署 Registry,开启 TLS 与 htpasswd 认证,推送
nginx:1.25并成功拉取。 - 在 Harbor 创建私有项目
base,配置机器人账号并用于 CI 推送。 - 配置跨站点复制规则,并手动触发一次复制任务。
- 模拟证书不信任错误,修复后重新登录并推送镜像。
快速检查清单(上线前)#
- [ ] 证书与域名正确,客户端已信任
- [ ] 认证与权限策略已启用
- [ ] 数据目录已持久化
- [ ] 备份策略与恢复演练完成
- [ ] 监控与日志可用