深色模式
制品与仓库:Nexus/Harbor 管理镜像
摘要:构建产物不能散落在服务器上。本文演示把容器镜像推到 Harbor、把通用包推到 Nexus,讲清 tag 策略与保留清理规则,以及为什么「不可变制品」是可靠发布的前提。
适用环境
- 一台 Linux 服务器(4C8G 起)用于部署 Harbor 或 Nexus
- 已安装 Docker 与 Docker Compose
- 一个域名或可解析的主机名 + HTTPS 证书(生产必需)
操作步骤
1. 概念分清
text
Harbor:容器镜像仓库(OCI 镜像、Helm Chart),带 RBAC、漏洞扫描、复制规则
Nexus :通用制品仓库(Maven、npm、PyPI、Docker、raw),适合非容器产物1
2
2
只做容器化 → Harbor 足够;还有 jar/npm/whl → Nexus 或两者并存。
2. 安装 Harbor
bash
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz
tar xzf harbor-offline-installer-v2.11.0.tgz && cd harbor && cp harbor.yml.tmpl harbor.yml
sudo ./install.sh && docker compose ps1
2
3
2
3
harbor.yml 关键项:hostname、harbor_admin_password(安装后立刻改)、data_volume。
3. 推送第一个镜像
bash
sudo tee /etc/docker/daemon.json <<'EOF'
{ "insecure-registries": ["harbor.example.internal"] }
EOF
sudo systemctl restart docker
docker login harbor.example.internal -u admin
docker tag nginx:alpine harbor.example.internal/library/nginx:1.0.0
docker push harbor.example.internal/library/nginx:1.0.01
2
3
4
5
6
7
2
3
4
5
6
7
4. tag 策略
text
推荐:语义化版本 + git sha,如 v1.2.3-a1b2c3d
禁止:只打 latest —— 无法追溯、无法回滚1
2
2
bash
docker build -t harbor.example.internal/app/myapp:${GIT_SHA} .
docker push harbor.example.internal/app/myapp:${GIT_SHA}1
2
2
5. 安装 Nexus 并上传 raw 制品
bash
docker run -d --name nexus -p 8081:8081 -v nexus-data:/nexus-data sonatype/nexus3
docker exec nexus cat /nexus-data/admin.password # 初始密码
curl -u admin:密码 --upload-file dist/app.tar.gz \
http://localhost:8081/repository/raw-hosted/app/1.0.0/app.tar.gz1
2
3
4
2
3
4
6. 保留与清理
Harbor:项目 → 策略 → 添加规则,如「保留最近 30 个 tag」并保留 release 前缀。Nexus:Repository → Cleanup Policies。
危险
清理策略必须先设例外规则(保留 release/prod 前缀),并在测试项目上演练。配错会静默删掉生产正在使用的版本。
验证
bash
docker pull harbor.example.internal/library/nginx:1.0.0
curl -sk https://harbor.example.internal/api/v2.0/projects | head -c 2001
2
2
- [ ] Harbor 页面能看到镜像及层数信息
- [ ] 换一台机器
docker pull能成功 - [ ] 镜像 tag 不含 latest,可追溯到具体 commit
常见坑
docker login 报 x509 / HTTP 错误
自签证书或纯 HTTP 场景需配 insecure-registries,或把 CA 放到 /etc/docker/certs.d/<host>/ca.crt。
磁盘被历史镜像吃满
没有清理策略的仓库几个月就会撑爆磁盘。上线同时就要配保留策略和磁盘告警。
默认 admin 密码没改
安装后必须第一时间改密码,并创建带最小权限的机器人账号供 CI 使用。