企业级容器镜像管理解决方案 | 基于 OpenClaw + Claude Code 的端到端研发自动化系统
Harbor 是由 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。Harbor 以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI、基于角色的访问控制 (RBAC)、AD/LDAP 集成、以及审计日志等企业用户需求的功能,同时原生支持中文。
用户与 Docker 镜像仓库通过"项目"进行组织管理,一个用户可以对多个镜像仓库在同一命名空间里有不同的权限。
镜像可以在多个 Registry 实例中复制(同步),适合负载均衡、高可用、混合云和多云的场景。
用户可以通过浏览器来浏览、检索当前 Docker 镜像仓库,管理项目和命名空间。
Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理。
记录所有操作日志,便于追踪和审计,满足企业合规要求。
集成 Trivy 进行镜像安全漏洞扫描,确保镜像安全性。
| 角色 | 创建项目 | 删除项目 | 添加成员 | 推送镜像 | 拉取镜像 | 删除镜像 | 扫描漏洞 |
|---|---|---|---|---|---|---|---|
| 超级管理员 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 项目管理员 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 开发人员 | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ |
| 访客 | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| 组件名称 | 端口 | 协议 | 功能描述 |
|---|---|---|---|
| Nginx Proxy | 80/443 | HTTP/HTTPS | 对外服务端口,反向代理 |
| Harbor Core | 8080 | HTTP | 内部 API 服务,核心业务逻辑 |
| Registry Service | 5000 | HTTP | 镜像仓库服务,存储镜像数据 |
| PostgreSQL | 5432 | TCP | 数据库服务 (内部),存储元数据 |
| Redis | 6379 | TCP | 缓存服务 (内部),会话管理 |
| Trivy Adapter | 8081 | HTTP | 漏洞扫描适配器 |
| 环境规模 | CPU | 内存 | 存储 | 适用场景 |
|---|---|---|---|---|
| 最小配置 | 2 核 | 4GB | 50GB | 测试/开发环境 |
| 标准配置 | 4 核 | 8GB | 200GB | 中小型团队 |
| 生产配置 | 8 核 | 16GB | 1TB+ | 大型企业 |
# 检查 Docker 版本 (需要 20.10.10+)
docker --version
# 检查 Docker Compose 版本 (需要 1.18.0+)
docker-compose --version
#!/bin/bash
# 文件名:prepare_environment.sh
set -e
# 1. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 2. 关闭 SELinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
# 3. 关闭 Swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 4. 安装 Docker
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
# 5. 安装 Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 6. 配置 Docker 加速器
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.cn-hangzhou.aliyuncs.com"
]
}
EOF
systemctl daemon-reload
systemctl restart docker
# 创建工作目录
mkdir -p /opt/harbor
cd /opt/harbor
# 下载 Harbor 离线安装包 (v2.10.0)
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
# 解压安装包
tar -zxvf harbor-offline-installer-v2.10.0.tgz
# 进入 Harbor 目录
cd harbor
# 复制配置模板
cp harbor.yml.tmpl harbor.yml
# 编辑配置文件
vim harbor.yml
# 执行准备脚本
./prepare
# 执行安装脚本
./install.sh
# 或使用 Docker Compose 直接启动
docker-compose up -d
# 查看容器状态
docker-compose ps
# 查看 Harbor 日志
docker-compose logs -f
# 检查服务端口
netstat -tlnp | grep -E '80|443|5000'
# 访问测试
curl -I http://localhost
# 创建 systemd 服务文件
cat > /lib/systemd/system/harbor.service << EOF
[Unit]
Description=Harbor Container Registry
After=network-online.target docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/harbor/harbor
ExecStart=/usr/bin/docker-compose up -d
ExecStop=/usr/bin/docker-compose down
[Install]
WantedBy=multi-user.target
EOF
# 重载 systemd 配置
systemctl daemon-reload
# 启用 Harbor 服务
systemctl enable harbor
systemctl start harbor
| 角色 ID | 角色名称 | 权限描述 |
|---|---|---|
| 1 | 超级管理员 | 系统最高权限,可管理所有项目和用户 |
| 2 | 项目管理员 | 管理单个项目的所有资源和成员 |
| 3 | 开发人员 | 推送/拉取镜像,管理 Helm Chart |
| 4 | 访客 | 仅可拉取镜像,查看项目信息 |
| 5 | 受限访客 | 仅可拉取公共项目镜像 |
# 使用 Harbor API 创建项目
curl -X POST "http://harbor.example.com/api/v2.0/projects" \
-H "Content-Type: application/json" \
-u "admin:Harbor12345" \
-d '{
"project_name": "production",
"public": false,
"metadata": {
"auto_scan": "true",
"enable_content_trust": "false"
}
}'
# 添加用户到项目
curl -X POST "http://harbor.example.com/api/v2.0/projects/1/members" \
-H "Content-Type: application/json" \
-u "admin:Harbor12345" \
-d '{
"role_id": 3,
"member_user": {
"username": "developer1"
}
}'
pipeline {
agent any
environment {
HARBOR_URL = 'harbor.example.com'
HARBOR_PROJECT = 'production'
IMAGE_NAME = 'myapp'
IMAGE_TAG = "${BUILD_NUMBER}"
}
stages {
stage('Checkout') {
steps {
git branch: 'main',
url: 'https://gitlab.example.com/team/myapp.git'
}
}
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('Build Docker Image') {
steps {
script {
docker.build("${env.HARBOR_URL}/${env.HARBOR_PROJECT}/${env.IMAGE_NAME}:${env.IMAGE_TAG}")
}
}
}
stage('Push to Harbor') {
steps {
withCredentials([usernamePassword(
credentialsId: 'harbor-credentials',
usernameVariable: 'HARBOR_USER',
passwordVariable: 'HARBOR_PASSWORD'
)]) {
sh '''
echo $HARBOR_PASSWORD | docker login ${HARBOR_URL} -u ${HARBOR_USER} --password-stdin
docker push ${HARBOR_URL}/${HARBOR_PROJECT}/${IMAGE_NAME}:${IMAGE_TAG}
'''
}
}
}
}
}
# .gitlab-ci.yml 示例
stages:
- build
- test
- docker-build
- deploy
variables:
HARBOR_URL: "harbor.example.com"
HARBOR_PROJECT: "production"
IMAGE_NAME: "myapp"
docker-build:
stage: docker-build
script:
- echo "$HARBOR_PASSWORD" | docker login $HARBOR_URL -u "$HARBOR_USER" --password-stdin
- docker build -t $HARBOR_URL/$HARBOR_PROJECT/$IMAGE_NAME:$CI_COMMIT_SHA .
- docker push $HARBOR_URL/$HARBOR_PROJECT/$IMAGE_NAME:$CI_COMMIT_SHA
only:
- main
# 配置 Docker 信任 Harbor 仓库
cat > /etc/docker/daemon.json << EOF
{
"insecure-registries": ["harbor.example.com"],
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
]
}
EOF
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
# 登录 Harbor
docker login harbor.example.com
# 推送镜像
docker tag myapp:latest harbor.example.com/production/myapp:v1.0
docker push harbor.example.com/production/myapp:v1.0
# 创建 Kubernetes Secret
kubectl create secret docker-registry harbor-secret \
--docker-server=harbor.example.com \
--docker-username=admin \
--docker-password=Harbor12345 \
--docker-email=admin@example.com \
-n default
# 验证 Secret
kubectl get secret harbor-secret -o yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: myapp
image: harbor.example.com/production/myapp:v1.0
ports:
- containerPort: 8080
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
在 KubeSphere 中,可以通过工作负载配置直接使用 Harbor 镜像,只需在容器组模板中指定 imagePullSecrets 即可。
#!/bin/bash
# 文件名:backup_harbor.sh
BACKUP_DIR="/backup/harbor"
DATE=$(date +%Y%m%d_%H%M%S)
HARBOR_DATA="/data/harbor"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 停止 Harbor 服务
docker-compose -f /opt/harbor/harbor/docker-compose.yml down
# 备份数据卷
tar -czf $BACKUP_DIR/harbor_data_$DATE.tar.gz $HARBOR_DATA
# 备份数据库
docker exec harbor-db pg_dumpall -U postgres > $BACKUP_DIR/harbor_db_$DATE.sql
# 启动 Harbor 服务
docker-compose -f /opt/harbor/harbor/docker-compose.yml up -d
# 清理 7 天前的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
# Prometheus 监控配置
scrape_configs:
- job_name: 'harbor'
static_configs:
- targets: ['harbor.example.com:9090']
metrics_path: /metrics
# 查看 Harbor 日志
docker-compose logs -f core
docker-compose logs -f jobservice
docker-compose logs -f registry
# 日志轮转配置
/var/log/harbor/*.log {
daily
rotate 50
size 200M
missingok
notifempty
compress
}
运行 docker-compose ps 确认所有容器正常运行
使用 Harbor API 或 UI 清理不再使用的镜像版本
对所有镜像执行漏洞扫描并修复高危漏洞
检查 Harbor 新版本并规划升级计划
# 检查 Docker 服务
systemctl status docker
# 检查端口占用
netstat -tlnp | grep -E '80|443|5000'
# 查看容器日志
docker-compose logs
# 检查磁盘空间
df -h
# 检查 Docker 登录状态
docker logout harbor.example.com
docker login harbor.example.com
# 检查 daemon.json 配置
cat /etc/docker/daemon.json
# 检查防火墙规则
iptables -L -n | grep -E '80|443'
# 检查数据库容器
docker-compose ps harbor-db
# 查看数据库日志
docker-compose logs harbor-db
# 测试数据库连接
docker exec -it harbor-db psql -U postgres -d registry
# 检查 Trivy 服务
docker-compose ps trivy-adapter
# 更新 Trivy 数据库
docker exec -it harbor-trivy-adapter trivy image --download-db-only
# 查看扫描日志
docker-compose logs trivy-adapter