自建镜像仓库
Harbor 是主流开源自建镜像仓库,提供项目级 RBAC、镜像漏洞扫描、远程复制、机器人账号与存储配额。它解决的是镜像分发的可控性:内网节点不依赖公网仓库,镜像来源有审计,漏洞可在拉取前拦住。典型用法是 CI 用机器人账号按最小权限推送,生产集群只从内网仓库拉取。
基本信息
| 核心概念 | 项目即命名空间,下设仓库与标签;成员角色有项目管理员、维护者、开发者、访客 |
|---|---|
| 机器人账号 | 为 CI 生成的专用账号,可限定只能推送指定项目 |
| 镜像扫描 | 集成 Trivy 等扫描器,可配置阻止存在严重漏洞的镜像被拉取 |
| 复制 | 多实例间镜像同步,用于异地灾备与多集群分发 |
| 配额与保留 | 项目级存储配额、标签保留策略,配合垃圾回收真正释放空间 |
| 部署 | 官方离线包或 docker compose 安装,对外建议启用 HTTPS |
典型使用场景
- 内网与隔离环境分发镜像,节点不依赖公网仓库与第三方速率限制
- 多集群或异地机房:配置复制规则,让各集群就近拉取同一镜像
- 合规门禁:推送即扫描,存在严重漏洞的镜像不允许进入生产项目
- CI 最小权限推送:机器人账号只授予目标项目的推送权限,凭据泄露影响面受限
- 审计追溯:通过操作日志确认镜像由哪个账号在什么时间推送
登录、推送与核对
登录、推送与核对
docker login harbor.example.com -u 'robot$ci' --password-stdin < token.txt # 机器人账号登录
docker tag myapp:1.2.3 harbor.example.com/team/myapp:1.2.3 # 加仓库前缀
docker push harbor.example.com/team/myapp:1.2.3 # 推送到项目
docker manifest inspect harbor.example.com/team/myapp:1.2.3 | head -5 # 核对远端已有该标签
docker pull harbor.example.com/team/myapp:1.2.3 # 生产节点拉取验证常见故障与原因
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
| server gave HTTP response to HTTPS client | 仓库用 HTTP,客户端默认走 HTTPS | 启用正式证书,或在客户端配置 insecure-registries |
| x509 certificate signed by unknown authority | 自签证书未被客户端信任 | 把 CA 放到客户端的 certs.d 目录并重启 docker |
| denied: requested access denied | 账号无该项目权限,或登录了错误域名 | 用机器人账号并核对项目成员权限 |
| no space left on device | 项目配额用满或后端存储磁盘满 | 扩配额、清理旧标签后执行垃圾回收 |
| pull 超时或解析失败 | 节点到仓库的网络或 DNS 不可达 | 在节点上直接 curl 仓库地址验证连通性 |
自签证书的内网仓库需要在每个客户端配置可信证书(或用 insecure-registries,形如在 daemon.json 中声明仓库域名);生产环境建议使用正式证书,避免为了省事把校验关掉。
机器人账号权限给成项目管理员,等于把全项目的镜像增删权交给 CI:流水线凭据一旦泄露即可覆盖或删除镜像。生产项目建议同时开启标签不可变规则,防止同名标签被覆盖推送。