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。
持久化存储
yamlservices: registry: image: registry:2 ports: - "5000:5000" volumes: - registry_data:/var/lib/registry volumes: registry_data:
默认镜像存在 /var/lib/registry,用 Volume 持久化防止容器重启后镜像丢失。
启用 TLS
HTTP 模式下 Docker 客户端会拒绝推送(安全限制)。加 TLS:
yamlservices: 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
yamlservices: 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,用云厂商的托管服务:
| 云厂商 | 服务名 | 特点 |
|---|---|---|
| AWS | ECR | 与 IAM 集成,按存储计费 |
| GCP | Artifact Registry | 与 GCP IAM 集成 |
| Azure | ACR | 与 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。