6月6日 20:29

Docker 私有仓库怎么搭建?Registry 和 Harbor 选型

Docker Hub 是公开的,你的私有镜像不想让外人看到。企业内部需要一个私有 Registry 存放自己的镜像,CI/CD 推送镜像到私有仓库,生产服务器从私有仓库拉取。

最简方案:Docker 官方 Registry

Docker 官方提供了一个极简的 Registry 镜像,几分钟就能跑起来:

bash
# 启动私有仓库 docker run -d -p 5000:5000 --name registry registry:2
bash
# 推送镜像 docker tag myapp:latest localhost:5000/myapp:latest docker push localhost:5000/myapp:latest # 拉取镜像 docker pull localhost:5000/myapp:latest

这就够了——一个能推能拉的私有仓库。但生产环境需要持久化存储、认证、TLS。

持久化存储

yaml
services: registry: image: registry:2 ports: - "5000:5000" volumes: - registry_data:/var/lib/registry volumes: registry_data:

默认镜像存在 /var/lib/registry,用 Volume 持久化防止容器重启后镜像丢失。

启用 TLS

HTTP 模式下 Docker 客户端会拒绝推送(安全限制)。加 TLS:

yaml
services: registry: image: registry:2 ports: - "5000:5000" environment: REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt REGISTRY_HTTP_TLS_KEY: /certs/domain.key volumes: - registry_data:/var/lib/registry - ./certs:/certs:ro
bash
# 自签名证书(测试用) mkdir certs openssl req -newkey rsa:4096 -nodes -sha256 \ -keyout certs/domain.key \ -x509 -days 365 \ -out certs/domain.crt \ -subj "/CN=registry.example.com"

所有拉取镜像的机器都要信任这个证书:

bash
# 把证书复制到 Docker 信任目录 sudo mkdir -p /etc/docker/certs.d/registry.example.com:5000 sudo cp certs/domain.crt /etc/docker/certs.d/registry.example.com:5000/ca.crt sudo systemctl restart docker

基本认证

bash
# 创建用户密码文件 mkdir auth docker run --entrypoint htpasswd httpd:2 -Bbn admin password123 > auth/htpasswd
yaml
services: registry: image: registry:2 environment: REGISTRY_AUTH: htpassd REGISTRY_AUTH_HTPASSWD_REALM: "Registry Realm" REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd volumes: - ./auth:/auth:ro
bash
# 登录后才能推送 docker login registry.example.com:5000 # Username: admin # Password: password123

Harbor:企业级私有仓库

Docker 官方 Registry 功能太简陋——没有 Web 界面、没有镜像扫描、没有 RBAC。Harbor 是 VMware 开源的企业级 Registry,补全了这些能力。

Docker Compose 部署 Harbor

bash
# 下载 Harbor wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz tar xzf harbor-offline-installer-v2.10.0.tgz cd harbor # 编辑配置 cp harbor.yml.tmpl harbor.yml
yaml
# harbor.yml 关键配置 hostname: registry.example.com http: port: 80 https: port: 443 certificate: /certs/domain.crt private_key: /certs/domain.key harbor_admin_password: Harbor12345 data_volume: /data/harbor
bash
# 安装 ./install.sh # 访问 Web 界面 # https://registry.example.com # 用户名: admin 密码: Harbor12345

Harbor 的企业级功能

功能说明
Web 管理界面浏览镜像、标签、层信息
RBAC项目级权限控制(只读/开发/管理员)
镜像扫描Trivy 集成,自动扫描漏洞
镜像签名Docker Content Trust,防止篡改
垃圾回收清理无引用的镜像层,回收磁盘
复制规则跨 Registry 同步镜像
审计日志记录所有推送/拉取操作

项目和权限

Harbor 用"项目"组织镜像,类似 GitHub 的仓库:

shell
项目: frontend ├── api-gateway:v1.2.3 ├── web-app:v2.0.0 └── auth-service:v1.0.0 项目: backend ├── user-service:v3.1.0 └── order-service:v2.5.0

每个项目可以设不同的成员和权限——前端团队只能推拉 frontend 项目,后端团队只能推拉 backend 项目。

云厂商托管 Registry

不想自己运维 Registry,用云厂商的托管服务:

云厂商服务名特点
AWSECR与 IAM 集成,按存储计费
GCPArtifact Registry与 GCP IAM 集成
AzureACR与 Azure AD 集成
阿里云容器镜像服务国内访问快
bash
# AWS ECR 示例 aws ecr get-login-password | docker login --username AWS --password-stdin 123456789.dkr.ecr.us-east-1.amazonaws.com docker tag myapp:latest 123456789.dkr.ecr.us-east-1.amazonaws.com/myapp:latest docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/myapp:latest

托管服务的优势:不需要维护服务器、自动 TLS、自动漏洞扫描。劣势:网络延迟(国内拉海外镜像慢)、费用随存储量增长。

选择决策

场景推荐方案
个人/小团队测试Docker 官方 Registry
团队 5-20 人Harbor(Docker Compose 部署)
企业生产环境Harbor(高可用部署)
全部在云上云厂商托管 Registry
国内访问为主阿里云容器镜像服务

起步建议:先用官方 Registry 跑起来,等需要 Web 界面和权限管理时迁移到 Harbor。

标签:Docker