1. 为什么你需要Harbor私有仓库
最近在帮客户部署Kubernetes集群时,我发现团队每次从Docker Hub拉取镜像都要等半天,特别是遇到网络波动时,一个基础镜像能卡十几分钟。更糟的是,有次生产环境部署时发现某个公共镜像居然被原作者删除了,导致整个发布流程中断。这时候我才真正意识到:企业级开发必须要有自己的私有镜像仓库。
Harbor就是为解决这些问题而生的。作为CNCF毕业项目,它不仅是简单的镜像存储,更像是个"镜像管家":能帮你扫描安全漏洞、管理用户权限、自动同步外部镜像。我经手过的金融类项目尤其看重这点——既不能把代码打包的镜像放在公网,又要确保所有依赖镜像都经过安全审核。
用Docker Compose部署Harbor是我最推荐的方式,相比Kubernetes部署方案,它更适合中小团队快速搭建。上周刚用这个方法给一个20人开发团队部署了私有仓库,从零开始到能正常推送镜像只用了40分钟。下面我就把实战中验证过的完整流程拆解给你看。
2. 环境准备:少走弯路的正确姿势
2.1 硬件配置不是越大越好
很多新手容易陷入一个误区——觉得私有仓库肯定很吃资源,上来就准备32核128G的服务器。其实根据我的压力测试,单节点Harbor在4核8G的机器上就能支撑日均5000次以上的镜像拉取请求。去年给某电商团队配置的8核16G服务器,到现在峰值并发200+都没出现过性能瓶颈。
关键是要确保磁盘性能:建议用SSD阵列,至少500GB起步。我有次用云平台的普通云盘,结果镜像推送时IO直接打满,导致整个仓库不可用。现在我的标准配置是:
- 计算型实例:4核8G(阿里云ecs.c6.xlarge或同等规格)
- 存储:500GB SSD(云盘IOPS建议≥3000)
- 带宽:建议≥5Mbps(内网传输可忽略)
2.2 软件依赖的隐藏坑
官方文档说Docker 18.09+就行,但我强烈建议用Docker 20.10.17以上版本。去年遇到过一个诡异的问题:Harbor的GC(垃圾回收)总在半夜卡死,查了三天才发现是Docker 19.03的某个内存泄漏bug。升级后立即解决。
安装前务必执行这几条命令:
# 关闭Swap(Kubernetes环境必须) sudo swapoff -a sed -i '/swap/s/^/#/' /etc/fstab # 调整内核参数 cat <<EOF | sudo tee /etc/sysctl.d/harbor.conf net.ipv4.ip_forward=1 net.bridge.bridge-nf-call-iptables=1 fs.file-max=1000000 EOF sudo sysctl --system3. 配置文件里的大学问
3.1 解剖docker-compose.yml
很多人直接复制官方模板就用,结果后面各种踩坑。我来解释几个关键参数:
services: harbor: environment: - HARBOR_ADMIN_PASSWORD=Harbor12345 # 一定要改!曾见过用默认密码被黑的案例 - DATABASE_URL=postgresql://harbor:Harbor12345@postgres:5432/harbor - REDIS_URL=redis://redis:6379/0 - _STOAGE_TYPE=filesystem # 小文件多用filesystem,大镜像建议s3数据库连接字符串里藏着三个地雷:
- 密码复杂度不够(至少12位混合字符)
- 没配置连接池(高并发时会爆)
- 没有定期备份配置(吃过亏的举手)
建议改成这样:
environment: - DATABASE_URL=postgresql://harbor:Jx@12sdf34!@postgres:5432/harbor?pool_size=20&timeout=153.2 数据持久化的正确姿势
见过最惨的案例是有人把数据卷挂载到/tmp目录,服务器重启后所有镜像消失。正确的持久化配置应该是:
volumes: - /data/harbor/registry:/var/lib/registry # 镜像存储 - /data/harbor/secret:/etc/harbor/secret # 证书密钥 - /data/harbor/database:/var/lib/postgresql/data # 数据库 - /data/harbor/redis:/data # Redis数据重要提示:/data/harbor目录权限必须设为10000:10000(Harbor服务的UID):
sudo chown -R 10000:10000 /data/harbor4. SSL证书配置实战
4.1 自签名证书的隐患
虽然用OpenSSL快速生成证书很方便:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout harbor.key -out harbor.crt \ -subj "/CN=your.domain.com" -addext "subjectAltName=DNS:your.domain.com"但在企业环境会遇到两个问题:
- 每台客户端都要手动信任证书(DevOps会骂人)
- 安全审计通不过(特别是金融行业)
更专业的做法是用Certbot申请Let's Encrypt证书:
sudo apt install certbot sudo certbot certonly --standalone -d harbor.yourdomain.com4.2 证书自动续期秘籍
Let's Encrypt证书90天过期,手动更新太麻烦。用这个crontab方案:
0 3 * * * /usr/bin/certbot renew --quiet && docker compose kill -s SIGHUP harbor原理是通过SIGHUP信号让Harbor重新加载证书,无需重启服务。我在三个生产环境用这套方案两年多,从没出过证书过期问题。
5. 安装后的必做检查清单
5.1 健康检查三连击
不要只看页面能打开就完事,执行这些深度检查:
# 检查服务状态 docker compose ps | grep -v "Up" # 测试API接口 curl -k https://localhost/api/v2.0/health | jq . # 模拟推送镜像 docker pull busybox docker tag busybox localhost/library/busybox docker push localhost/library/busybox5.2 安全加固五件套
- 修改默认管理项目配额(我见过有人传了1TB的镜像把磁盘塞满)
- 开启内容信任(防止被篡改镜像)
- 配置IP白名单(特别是暴露在公网时)
- 设置自动扫描漏洞(CVE漏洞天天有)
- 启用操作审计(出问题时能溯源)
具体操作在Harbor管理界面的"系统管理"→"配置"里都能找到。上周刚用审计日志逮到一个误删生产镜像的实习生...
6. 性能调优实战记录
给某游戏公司做优化时,发现他们的Harbor在高峰期响应慢。通过调整这些参数,吞吐量提升了3倍:
# 在docker-compose.yml的harbor服务下添加 environment: - REGISTRY_HTTP_MAX_CONNECTIONS=1000 - WORKERS=10 - CHART_REPOSITORY_WORKERS=5 - HTTP_PROXY=http://proxy.example.com:3128 # 如果有内网代理同时调整Nginx配置(在/data/harbor/nginx/nginx.conf):
worker_processes auto; worker_connections 10240; keepalive_timeout 300;记得用tcpcopy做压测验证效果,我通常模拟100并发持续10分钟来检验稳定性。