3605 字
18 分钟
Docker Registry本地私有镜像仓库部署实战指南

企业级Docker本地镜像仓库完整指南:Registry与Harbor离线部署全解#

[!NOTE] 背景导读 在现代企业容器化转型过程中,本地私有镜像仓库已经成为不可或缺的基础设施组件。它不仅解决了公网镜像拉取速度慢、带宽成本高的问题,更重要的是保障了企业内部镜像的安全性和合规性。

一、企业为什么需要本地私有镜像仓库#

在深入介绍具体方案之前,我们先明确企业搭建本地私有镜像仓库的核心价值:

  • 极致的拉取速度:将镜像存储在企业内网,避免公网延迟和带宽瓶颈,尤其适合大规模集群部署场景
  • 数据安全与隐私保护:企业内部业务镜像包含敏感代码和配置,绝不能上传到公共仓库
  • 带宽成本节约:多个节点拉取同一镜像时,只需从公网下载一次,大幅节省出口带宽
  • 高可用性保障:不受公网网络波动和第三方服务中断的影响
  • 合规性管理:满足金融、政府等行业对数据本地化和安全审计的严格要求
  • 统一镜像治理:集中管理企业所有镜像,制定统一的版本控制和发布策略

二、两种主流企业级镜像仓库方案对比#

目前企业环境中最主流的本地镜像仓库方案有两种:Docker官方的Registry和VMware开源的Harbor。它们各有特点,适用于不同规模和需求的企业。

特性Docker RegistryHarbor
定位轻量级基础镜像仓库全功能企业级镜像仓库
资源消耗极低(单容器)中等(多组件架构)
部署难度非常简单中等(但有离线安装包)
Web管理界面无(需第三方)内置功能完善的Web UI
身份认证仅支持基础HTTP认证支持本地用户、LDAP、OIDC等多种方式
权限管理仓库级粗粒度项目级细粒度RBAC
镜像扫描无内置Trivy漏洞扫描
镜像签名无支持Cosign镜像签名与验证
镜像复制无支持跨仓库镜像同步
垃圾回收手动执行自动定时执行
审计日志无完整的操作审计日志
适用场景小型团队、测试环境、简单需求中大型企业、生产环境、复杂需求

[!IMPORTANT] 核心结论

  • 如果你的团队规模小于10人,只是需要一个简单的镜像存储和分发服务,Docker Registry完全够用。
  • 如果你的团队规模较大,需要企业级的安全、管理和治理功能,Harbor是绝对的首选,也是目前行业标准。

三、方案一:Docker Registry 轻量级私有仓库#

Docker Registry是Docker官方提供的开源镜像仓库实现,它的设计目标是简单、高效、可扩展。虽然功能相对基础,但对于小型团队和简单场景来说,它是最快速、最轻量化的选择。

3.1 环境准备#

  • 操作系统:CentOS 9 Stream / Ubuntu 22.04 LTS
  • Docker版本:20.10.0+
  • 磁盘空间:至少100GB可用空间
  • 内存:至少2GB
  • CPU:至少2核

3.2 基础HTTP仓库快速部署#

deploy-registry.sh
# 拉取官方镜像
docker pull registry:2
# 创建数据持久化目录
sudo mkdir -p /opt/registry/data
# 启动容器
docker run -d \
-p 5000:5000 \
--name registry \
--restart=always \
-v /opt/registry/data:/var/lib/registry \
registry:2
# 验证部署
curl http://localhost:5000/v2/_catalog
# 输出:{"repositories":[]}

3.3 生产环境安全加固#

[!WARNING] 安全警告 基础HTTP仓库没有任何安全措施,绝对不能用于生产环境。我们需要添加HTTPS加密和身份认证。

secure-registry-setup.sh
# 创建完整目录结构
sudo mkdir -p /opt/registry/{auth,certs,data}
# 生成包含IP SAN的自签名证书(解决Docker证书验证问题)
21 collapsed lines
sudo tee /opt/registry/certs/openssl.cnf <<-'EOF'
[req]
default_bits = 4096
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = CN
ST = Guangdong
L = Foshan
O = My Company
OU = IT Department
CN = 192.168.1.100
[v3_req]
subjectAltName = @alt_names
extendedKeyUsage = serverAuth
keyUsage = digitalSignature, keyEncipherment
[alt_names]
IP.1 = 192.168.1.100
DNS.1 = registry.mycompany.com
EOF
sudo openssl req -x509 -nodes -days 3650 \
-config /opt/registry/certs/openssl.cnf \
-keyout /opt/registry/certs/registry.key \
-out /opt/registry/certs/registry.crt
# 生成身份认证文件 (默认账号:admin)
sudo htpasswd -Bc /opt/registry/auth/htpasswd admin
# 启动安全加固后的Registry
docker run -d \
-p 5000:5000 \
--name registry \
--restart=always \
-v /opt/registry/data:/var/lib/registry \
-v /opt/registry/auth:/auth \
-v /opt/registry/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.key \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
registry:2

3.4 客户端配置与使用#

client-usage.sh
# 在所有客户端上配置证书信任
sudo mkdir -p /etc/docker/certs.d/192.168.1.100:5000
sudo scp user@192.168.1.100:/opt/registry/certs/registry.crt /etc/docker/certs.d/192.168.1.100:5000/ca.crt
sudo systemctl restart docker
# 登录仓库
docker login 192.168.1.100:5000
# 推送镜像
docker tag nginx:alpine 192.168.1.100:5000/nginx:alpine
docker push 192.168.1.100:5000/nginx:alpine
# 拉取镜像
docker pull 192.168.1.100:5000/nginx:alpine

3.5 垃圾回收机制#

Docker Registry默认不会自动删除未被引用的镜像层,需要定期手动执行垃圾回收:

garbage-collect.sh
# 停止服务
docker stop registry
# 预览垃圾回收效果
docker run --rm \
-v /opt/registry/data:/var/lib/registry \
registry:2 \
garbage-collect --dry-run /etc/docker/registry/config.yml
# 执行实际垃圾回收
docker run --rm \
-v /opt/registry/data:/var/lib/registry \
registry:2 \
garbage-collect /etc/docker/registry/config.yml
# 重启服务
docker start registry

四、方案二:Harbor 企业级镜像仓库(重点:离线部署)#

Harbor是由VMware开源并捐献给CNCF的企业级镜像仓库项目,它在Docker Registry的基础上增加了许多企业级必需的功能,如RBAC权限管理、镜像漏洞扫描、镜像签名、镜像复制等。Harbor是目前中大型企业的首选镜像仓库解决方案。

4.1 环境准备#

Harbor对服务器资源要求稍高,建议生产环境配置:

  • 操作系统:CentOS 9 Stream / Ubuntu 22.04 LTS
  • Docker版本:20.10.0+
  • Docker Compose版本:v2.0.0+
  • 磁盘空间:至少500GB可用空间(建议使用SSD)
  • 内存:至少8GB(推荐16GB以上)
  • CPU:至少4核(推荐8核以上)

4.2 下载Harbor离线安装包#

Harbor提供了非常方便的离线安装包,这对于无法访问互联网的企业内网环境来说至关重要。你可以直接访问其开源仓库获取最新版本:

goharbor
/
harbor
Waiting for api.github.com...
00K
0K
0K
Waiting...
download-harbor.sh
# 本文以v2.11.0版本为例
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz
# 解压安装包
tar xzf harbor-offline-installer-v2.11.0.tgz
cd harbor

4.3 配置Harbor#

复制配置文件模板并进行修改:

copy-config.sh
cp harbor.yml.tmpl harbor.yml

编辑harbor.yml文件,修改以下关键配置:

harbor.yml
# 主机名,必须修改为你的服务器IP或域名
hostname: 192.168.1.100
# HTTP配置
http:
port: 80
# HTTPS配置(生产环境必须启用)
https:
port: 443
# 证书文件路径
certificate: /opt/harbor/certs/registry.crt
# 私钥文件路径
private_key: /opt/harbor/certs/registry.key
# Harbor管理员初始密码
harbor_admin_password: Harbor12345
# 数据库配置
database:
password: root123
# 数据存储路径
data_volume: /opt/harbor/data
# 启用Trivy漏洞扫描
trivy:
enabled: true
skip_update: false
offline_scan: true
# 启用镜像签名验证
notary:
enabled: true
# 启用镜像复制功能
registry:
storage:
filesystem:
maxthreads: 100

4.4 准备SSL证书#

我们可以复用之前为Docker Registry生成的证书,或者重新生成:

prepare-certs.sh
sudo mkdir -p /opt/harbor/certs
sudo cp /opt/registry/certs/registry.crt /opt/harbor/certs/
sudo cp /opt/registry/certs/registry.key /opt/harbor/certs/

4.5 执行离线安装#

install-harbor.sh
# 运行安装脚本,启用所有常用组件
sudo ./install.sh --with-trivy --with-notary --with-chartmuseum
# 安装完成后,Harbor会自动启动
# 查看所有组件状态
docker compose ps

[!NOTE] 离线优势 安装过程会自动加载离线安装包中包含的所有Docker镜像,不需要从互联网下载任何内容,这就是离线安装的最大优势。

4.6 访问Harbor Web界面#

安装完成后,在浏览器中访问https://192.168.1.100即可打开Harbor的Web管理界面。

使用默认管理员账号登录:

  • 用户名:admin
  • 密码::spoiler[Harbor12345](你在配置文件中设置的密码)

登录后,你会看到Harbor的控制台,包含项目管理、用户管理、系统管理等多个功能模块。

4.7 客户端配置与使用#

harbor-client.sh
# 在所有客户端上配置证书信任
sudo mkdir -p /etc/docker/certs.d/192.168.1.100
sudo scp user@192.168.1.100:/opt/harbor/certs/registry.crt /etc/docker/certs.d/192.168.1.100/ca.crt
sudo systemctl restart docker
# 登录Harbor仓库
docker login 192.168.1.100
# 创建项目
# 在Web界面中创建一个名为"myproject"的项目
# 推送镜像
docker tag nginx:alpine 192.168.1.100/myproject/nginx:alpine
docker push 192.168.1.100/myproject/nginx:alpine
# 拉取镜像
docker pull 192.168.1.100/myproject/nginx:alpine

4.8 Harbor核心企业级功能演示#

4.8.1 细粒度RBAC权限管理#

Harbor支持基于项目的细粒度权限管理,你可以创建不同的用户和用户组,并为他们分配不同的角色:

  • 项目管理员:拥有项目的所有权限
  • 维护人员:可以推送、拉取、删除镜像
  • 开发者:可以推送和拉取镜像
  • 访客:只能拉取镜像
  • 受限访客:只能拉取指定标签的镜像

4.8.2 自动镜像漏洞扫描#

Harbor集成了Trivy漏洞扫描器,可以自动扫描镜像中的安全漏洞:

  1. 在项目设置中启用”自动扫描”
  2. 每次推送新镜像时,Harbor会自动触发扫描
  3. 扫描完成后,你可以在镜像详情页面查看漏洞报告
  4. 你可以设置漏洞阻止策略,阻止包含高危漏洞的镜像被拉取

4.8.3 镜像签名与验证#

Harbor支持使用Cosign进行镜像签名和验证,确保镜像在传输和存储过程中没有被篡改:

  1. 生成Cosign密钥对
  2. 将公钥添加到Harbor项目中
  3. 推送镜像时使用私钥签名
  4. 配置Harbor只允许拉取已签名的镜像

4.8.4 跨仓库镜像复制#

Harbor支持在不同的Harbor实例之间复制镜像,这对于多数据中心部署和灾备非常有用:

  1. 创建目标仓库注册信息
  2. 创建复制规则,指定要复制的项目和标签
  3. 可以选择手动触发或定时自动复制
  4. 支持增量复制,只复制发生变化的镜像

五、两种方案的选择建议#

[!TIP] 我的个人建议 对于绝大多数企业来说,直接选择Harbor是更好的决策。虽然Harbor的部署和维护稍微复杂一些,但它提供的企业级功能是Docker Registry无法比拟的。随着企业业务的发展,你迟早会需要这些功能,而从Docker Registry迁移到Harbor是一个比较麻烦的过程。

5.1 选择Docker Registry的情况#

  • 团队规模小(<10人)
  • 镜像数量少(<100个)
  • 不需要复杂的权限管理
  • 服务器资源有限
  • 只是需要一个简单的镜像存储和分发服务
  • 测试环境或开发环境使用

5.2 选择Harbor的情况#

  • 团队规模大(>10人)
  • 镜像数量多(>100个)
  • 需要细粒度的权限管理
  • 需要镜像漏洞扫描和安全审计
  • 需要镜像签名和验证
  • 需要跨数据中心镜像复制
  • 生产环境使用
  • 有合规性要求(如金融、政府行业)

六、生产环境最佳实践#

6.1 高可用部署#

对于生产环境,建议部署高可用的Harbor集群:

  • 使用共享存储(如NFS、Ceph)作为后端存储
  • 部署多个Harbor实例
  • 使用负载均衡器(如Nginx、HAProxy)分发流量
  • 部署独立的Redis和PostgreSQL集群

6.2 备份与恢复#

harbor-backup.sh
# 备份数据库
docker exec harbor-db pg_dump -U postgres harbor > harbor-backup.sql
# 备份数据目录
tar czf harbor-data-backup.tar.gz /opt/harbor/data
# 备份配置文件
tar czf harbor-config-backup.tar.gz /opt/harbor/harbor.yml

6.3 监控与告警#

监控Harbor的关键指标:

  • 磁盘空间使用率
  • 数据库连接数
  • Redis内存使用率
  • API响应时间
  • 镜像拉取和推送成功率

[!NOTE] 监控集成 使用Prometheus和Grafana搭建监控系统,Harbor已经内置了Prometheus指标端点,可以直接采集。

6.4 安全加固#

  • 定期更新Harbor到最新版本
  • 使用强密码并定期更换
  • 禁用不必要的组件
  • 配置防火墙,只允许必要的端口访问
  • 启用HTTPS并使用受信任的SSL证书
  • 配置镜像漏洞阻止策略
  • 启用操作审计日志

七、常见问题与解决方案#

[!CAUTION] 排错指南 部署和使用过程中遇到问题时,优先查看 docker compose logs 对应组件的日志输出。

7.1 Harbor离线安装失败#

问题:执行install.sh脚本时提示镜像拉取失败。 解决方案:

  1. 确保你下载的是离线安装包(文件名包含”offline”)
  2. 检查Docker服务是否正常运行
  3. 检查磁盘空间是否足够
  4. 手动加载镜像:docker load -i harbor.v2.11.0.tar.gz

7.2 无法登录Harbor#

问题:docker login时提示证书不信任错误。 解决方案:

  1. 确保你已经将证书复制到了Docker客户端的证书信任目录
  2. 确保证书文件的权限正确(644)
  3. 重启Docker服务
  4. 检查证书中的SAN是否包含Harbor的主机名

7.3 镜像推送失败#

问题:推送镜像时提示”denied: requested access to the resource is denied”。 解决方案:

  1. 确保你已经正确登录到Harbor
  2. 检查你是否有该项目的推送权限
  3. 确保镜像标签格式正确:harbor地址/项目名/镜像名:标签
  4. 检查项目是否设置为”公开”,如果是私有项目,必须登录才能访问

7.4 Trivy漏洞扫描失败#

问题:Trivy扫描一直处于”扫描中”状态,最终失败。 解决方案:

  1. 检查服务器是否能够访问互联网(Trivy需要下载漏洞数据库)
  2. 如果是离线环境,需要手动下载漏洞数据库并导入
  3. 增加服务器内存(Trivy扫描需要较多内存)
  4. 检查磁盘空间是否足够

八、总结#

在本文中,我们全面介绍了企业环境中两种主流的本地镜像仓库方案:Docker Registry和Harbor。

Docker Registry是一个轻量级、简单易用的镜像仓库,适合小型团队和简单场景。它部署快速,资源消耗低,但功能相对基础,缺乏企业级必需的安全和管理功能。

Harbor是一个全功能的企业级镜像仓库,它在Docker Registry的基础上增加了RBAC权限管理、镜像漏洞扫描、镜像签名、镜像复制等众多企业级功能。虽然部署和维护稍微复杂一些,但它是中大型企业生产环境的首选方案。

Harbor的离线安装包使得它在无法访问互联网的企业内网环境中也可以轻松部署,这对于很多企业来说是一个非常重要的特性。

Docker Registry本地私有镜像仓库部署实战指南
https://www.6ixblog.site/posts/linux-cloud-9-2/
作者
Licwic
发布于
2026-06-08
许可协议
CC BY-NC-SA 4.0