私有docker镜像仓库推荐:小团队用轻量registry(单命令启动、兼容v2 api),中大型企业用harbor(带ui、权限管理、漏洞扫描、https强制等);均需https加密与认证加固,生产环境禁用http裸跑。

搭建私有 Docker 镜像仓库服务,核心是选型 + 部署 + 安全加固 + 日常管理。不需要从零写代码,主流方案都支持容器化一键启动,关键在于按需匹配团队规模和安全要求。
明确需求再选型:Registry 适合小团队,Harbor 适合中大型企业
轻量级场景(开发测试、内部小项目)直接用 Docker Registry: - 单命令即可运行,50MB 镜像,内存占用不到 100MB - 支持标准 v2 API,与 docker push/pull 完全兼容 - 缺点是没界面、无权限分级、不自动清理旧镜像
企业级场景(多部门协作、等保合规、CI/CD 集成)推荐 Harbor:
- 自带 Web 控制台,支持项目隔离、用户组权限、LDAP/AD 对接
- 内置 Clair 漏洞扫描(可选启用)、镜像签名、操作审计日志
- 提供垃圾回收、跨地域复制、HTTPS 强制策略等生产必需功能
快速部署 Registry(5 分钟可通)
以下命令在已装 Docker 的 Linux 或 macOS 上直接执行:
- 创建持久化存储目录:
mkdir -p /data/registry - 启动带基础认证的仓库:
docker run -d \<br> --name registry \<br> -p 5000:5000 \<br> --restart=always \<br> -v /data/registry:/var/lib/registry \<br> -v /data/auth:/auth \<br> -e "REGISTRY_AUTH=htpasswd" \<br> -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \<br> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \<br> registry:2.8.1
- 生成账号密码(如 testuser/testpass):
docker run --entrypoint htpasswd registry:2.8.1 -Bbn testuser testpass > /data/auth/htpasswd
完成后,客户端需配置 Docker daemon 允许 insecure-registries(仅限内网 HTTP),或升级为 HTTPS(见下一条)。
必须做 HTTPS 和认证,否则不建议上生产
公网上裸跑 HTTP 仓库存在严重风险:任意人可拉取、覆盖甚至删除镜像。生产环境务必满足两点:
-
HTTPS 加密传输:用 Nginx 反向代理 Registry,或直接挂载证书启动 Registry。例如:
docker run -d \<br> -p 443:5000 \<br> -v $(pwd)/certs:/certs \<br> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \<br> -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \<br> registry:2.8.1
- 强制认证:不能跳过 htpasswd;若对接公司统一身份系统,Harbor 支持 OIDC、LDAP、GitHub SSO 等多种方式
- 客户端配置:在
/etc/docker/daemon.json中加入对应域名到insecure-registries(仅限测试)或配置可信 CA 证书
Harbor 部署更重但更省心
Harbor 不是单容器,而是由 7+ 个服务组成的集群(Core、Registry、Clair、Notary、Redis、PostgreSQL、Proxy),官方推荐用离线包 + docker-compose 部署:
- 下载离线安装包(如
harbor-offline-installer-v2.10.0.tgz),解压后编辑harbor.yml - 重点改几项:
hostname: harbor.yourdomain.com(必须可解析)https.port: 443+ 指定证书路径harbor_admin_password: YourPass123data_volume: /data/harbor - 执行
./install.sh --with-clair,自动拉镜像、启服务、初始化数据库 - 首次访问 https://harbor.yourdomain.com,用 admin 登录,创建项目、添加成员、设置推送策略
后续所有镜像操作(push/pull/tag)都走标准 Docker CLI,只是地址变成 harbor.yourdomain.com/project/repo:tag。
不复杂但容易忽略。











