镜像拉来拉去都是 Docker Hub,但有些场景不适合用公共仓库——公司内部镜像不想公开、或者需要给不同团队分配权限。这时候就需要自建一个私有仓库。
为什么需要私有仓库
Docker Hub 虽然是默认的镜像仓库,但在实际使用中会遇到几个问题:
- 拉取限速:匿名用户有拉取次数限制,影响 CI/CD 流水线
- 没法私有:免费的 Docker Hub 仓库只能设为公开,想在团队内分享镜像需要付费
- 没有权限管理:谁可以推、谁只能拉,分不清楚
- 没有安全扫描:镜像有没有漏洞,Docker Hub 免费版不告诉你
自建仓库就是解决这些问题的。Harbor 是目前最流行的方案之一。
什么是 Harbor
Harbor 是一个开源的容器镜像仓库,VMware 开源后捐给了 CNCF。跟 Docker 官方提供的 registry:2 比,Harbor 多了不少东西:
- Web 管理界面:在网页上就能看镜像、删镜像、配项目
- 基于项目的权限控制:分项目、分用户,谁可以推谁只能拉一目了然
- 安全扫描:集成 Trivy,自动扫镜像里的漏洞
- 镜像复制:跨机房、跨云同步镜像
- Garbage Collection:清理没用的镜像层,回收磁盘空间
- OpenAPI:可以跟 CI/CD 系统集成
简单说,registry:2 是发动机,Harbor 是整车。
部署 Harbor
前提条件
- 一台 Linux 服务器(建议 4C8G 以上)
- 安装 Docker 和 Docker Compose
- 域名(可选,但推荐)和对应的 SSL 证书
下载安装
从 Harbor 的 GitHub Releases 页面下载离线安装包,或者直接用 wget:
wget https://github.com/goharbor/harbor/releases/download/v2.12.0/harbor-offline-installer-v2.12.0.tgz
tar xzf harbor-offline-installer-v2.12.0.tgz
cd harbor
复制配置模板并修改:
cp harbor.yml.tmpl harbor.yml
修改 harbor.yml 里的关键配置:
hostname: harbor.example.com # 改成你的域名或 IP
# HTTPS 配置(推荐)
certificate: /path/to/your/cert.pem
private_key: /path/to/your/key.pem
# 或者用 HTTP(仅测试用)
# 注释掉 https 相关配置,把 http.port 改成 80
harbor_admin_password: Harbor12345 # 管理员密码,部署后记得改
然后执行安装脚本:
./install.sh
安装完成后访问 https://harbor.example.com,用 admin / Harbor12345 登录。
用 Docker Compose 跑起来试试
如果想在本地快速体验,也可以直接用 Docker 官方提供的 registry:2:
docker run -d -p 5000:5000 --name registry registry:2
但这篇主要讲 Harbor,上面的方式只适合临时测试。
配置 Docker 信任 Harbor
Harbor 配了 HTTPS 的话这一步可以跳过。如果用的是 HTTP,Docker 默认不允许推送到非 HTTPS 的仓库,需要手动加到 insecure registries 里。
编辑 /etc/docker/daemon.json:
{
"insecure-registries": ["harbor.example.com"]
}
然后重启 Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
如果用 docker desktop,在 Settings → Docker Engine 里加一样的配置。
登录
在命令行登录 Harbor:
docker login harbor.example.com
输入用户名和密码,登录成功后会生成凭证存在 ~/.docker/config.json 里。
登出:
docker logout harbor.example.com
打标签
镜像推送到 Harbor 需要先给它打上对应的标签,格式是 仓库地址/项目名/镜像名:标签:
docker tag nginx:latest harbor.example.com/library/nginx:v1
harbor.example.com— Harbor 的地址library— 项目名(Harbor 默认有个 library 项目,所有人都能访问)nginx— 镜像名v1— 标签
推送
打完标签直接 push:
docker push harbor.example.com/library/nginx:v1
推送完成后在 Harbor 的 Web 界面里就能看到这个镜像了。
拉取
从 Harbor 拉镜像跟从 Docker Hub 拉一样:
docker pull harbor.example.com/library/nginx:v1
如果仓库是公开的,拉取不需要登录;如果是私有的,需要先 docker login。
日常维护
查看磁盘占用
docker run --rm -v /var/lib/harbor:/data alpine du -sh /data
停止和启动 Harbor
docker compose down # 停止
docker compose up -d # 启动
垃圾回收
镜像删掉之后,它占用的层不会自动释放,需要手动触发 GC:
docker run --rm -v /var/lib/harbor:/data goharbor/registry-photon:v2.12.0 gc
或者在 Harbor 的 Web 界面里操作:系统管理 → 垃圾回收 → 立即运行。
