在容器化技术普及的今天,Docker镜像已经成为应用交付的标准格式。无论是个人开发者还是企业团队,都会频繁地构建和分享镜像。虽然Docker Hub提供了公共仓库服务,但在实际使用中你会发现几个痛点:
我去年参与的一个物联网项目就遇到过典型场景:团队开发了边缘计算节点的定制镜像,包含专有算法和设备驱动。最初我们使用Docker Hub的私有仓库,结果发现:
Harbor最核心的价值在于提供了完整的镜像治理方案。与简单搭建的registry不同,它实现了以下关键功能:
实际使用中,这些功能显著提升了我们的运维效率。例如设置保留最近5个nightly构建的规则后,CI服务器不再需要额外脚本清理旧镜像,存储空间占用减少了60%。
对于分布式团队,Harbor的复制功能(replication)特别实用。我们这样配置北京和深圳机房的同步策略:
yaml复制replication:
rules:
- name: "prod-images"
filters:
- repository: "library/nginx-*"
- tag: "v1.*"
destinations:
- registry: "https://sz-harbor.example.com"
trigger:
type: "event_based"
这表示所有匹配library/nginx-v1.*的镜像在推送到北京仓库时,会自动同步到深圳仓库。实测200MB的镜像跨机房同步仅需25秒,比人工操作快10倍以上。
虽然Harbor官方文档给出了最低配置要求,但根据实际负载需要更精确的计算。我们使用这个公式估算资源:
code复制所需CPU核心 = 并发推送数 × 0.2 + 并发拉取数 × 0.1
内存(GB) = 并发操作数 × 0.5 + 镜像数量 × 0.0005
存储空间 = 镜像平均大小 × 预计数量 × 1.3(元数据开销)
例如个人开发环境:
以Ubuntu 22.04为例,分步说明离线安装过程:
bash复制wget https://github.com/goharbor/harbor/releases/download/v2.7.0/harbor-offline-installer-v2.7.0.tgz
tar xvf harbor-offline-installer-v2.7.0.tgz
harbor.yml关键参数:yaml复制hostname: registry.yourdomain.com
http:
port: 8080
data_volume: /data/harbor
database:
password: "StrongPassword123!"
bash复制sudo ./install.sh --with-trivy --with-chartmuseum
注意:添加
--with-trivy启用漏洞扫描,--with-chartmuseum支持Helm charts存储
bash复制docker compose ps
正常应看到10个容器运行,包括core、portal、registry等组件
首次登录管理界面(http://localhost:8080)后,建议立即:
dev/yourname本地Docker客户端需要先登录才能推送镜像:
bash复制docker login registry.yourdomain.com -u admin -p StrongPassword123!
为避免密码明文存储,推荐使用凭证助手:
bash复制apt install pass
docker login --password-stdin registry.yourdomain.com <<< "StrongPassword123!"
以构建一个Python应用镜像为例:
dockerfile复制FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
bash复制docker build -t registry.yourdomain.com/dev/yourname/python-demo:v1 .
bash复制docker push registry.yourdomain.com/dev/yourname/python-demo:v1
混乱的标签命名会导致后期维护困难。我们团队采用这套规则:
| 标签前缀 | 含义 | 保留策略 |
|---|---|---|
| latest | 最新稳定版 | 始终保留1个 |
| v1.2.3 | 语义化版本 | 永久保留 |
| build-42 | CI构建号 | 保留最近10个 |
| test-* | 测试版本 | 7天后自动删除 |
在Harbor中可通过"策略->标签保留"界面配置自动清理规则。
现象:docker push时报错denied: requested access to the resource is denied
可能原因及解决方案:
未登录或认证过期
docker logout后重新登录~/.docker/config.json中的凭证是否有效项目权限不足
镜像路径不符合规范
registry地址/项目名/镜像名当从异地仓库拉取大镜像时,可以:
实测同步1.5GB的TensorFlow镜像:
Harbor默认不会自动删除镜像层数据,长期运行可能导致磁盘爆满。手动清理步骤:
bash复制docker compose stop
docker run -it --rm -v /data/harbor/registry:/registry \
goharbor/registry-photon:v2.7.0 garbage-collect /etc/registry/config.yml
bash复制du -sh /data/harbor/registry/docker/registry/v2/blobs/
bash复制docker compose start
重要:操作前确保备份关键镜像,垃圾回收会删除未被引用的数据层
在GitLab Runner中这样配置自动推送:
yaml复制build_image:
stage: build
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
variables:
CI_REGISTRY: registry.yourdomain.com
CI_REGISTRY_USER: gitlab-ci-token
CI_REGISTRY_PASSWORD: $CI_JOB_TOKEN
关键技巧:
对于生产环境,建议采用如下架构:
code复制 +-----------------+
| 外部负载均衡器 |
+--------+--------+
|
+----------------+----------------+
| |
+----------+---------+ +----------+---------+
| Harbor节点1 | | Harbor节点2 |
| - 双核CPU | | - 双核CPU |
| - 8GB内存 | | - 8GB内存 |
| - 共享存储(NFS) | | - 共享存储(NFS) |
+--------------------+ +--------------------+
关键配置:
Prometheus监控指标示例:
yaml复制scrape_configs:
- job_name: 'harbor'
metrics_path: '/metrics'
static_configs:
- targets: ['harbor-core:8080']
重要监控项:
harbor_registry_storage_usage_bytes:存储空间使用量harbor_http_requests_total:API请求量harbor_jobservice_pending_jobs:后台任务队列长度建议设置以下告警规则:
生产环境必须限制访问来源:
bash复制# 只允许CI服务器和内网访问
iptables -A INPUT -p tcp --dport 8080 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
更安全的做法是:
启用内容信任机制:
bash复制export DOCKER_CONTENT_TRUST=1
export DOCKER_CONTENT_TRUST_SERVER=https://registry.yourdomain.com:4443
docker push registry.yourdomain.com/dev/yourname/signed-image:v1
这会在推送时自动生成签名,拉取时验证签名是否匹配。我们团队要求所有生产环境镜像必须签名,防止中间人攻击。
Harbor的操作日志保存在数据库,可通过SQL查询敏感操作:
sql复制SELECT * FROM audit_log
WHERE operation = 'delete'
AND op_time > NOW() - INTERVAL '1 day';
建议将日志导出到ELK系统,设置以下告警规则:
使用registry-mirror配置可以极大提升构建效率:
json复制{
"registry-mirrors": ["http://registry.yourdomain.com"]
}
这样所有docker pull会优先从本地Harbor查找,不存在时才去Docker Hub。实测常用基础镜像的拉取时间从2分钟降至3秒。
有时需要给同事临时分享镜像,但不想长期存储:
temp-share在harbor.yml中添加这些参数可优化个人环境性能:
yaml复制resource:
registry:
max_requests: 20 # 并发请求限制
cache_size: 512m # 缓存大小
jobservice:
workers: 2 # 后台任务线程数
对于树莓派等低配设备,还需调整JVM参数:
bash复制export JAVA_OPTS="-Xms512m -Xmx1g"