基于认证的 Harbor 容器镜像仓库
一、Harbor 概览
1.1.Harbor 的核心定位
Harbor 是由 VMware 开源的企业级 Docker 镜像仓库,专为解决容器化应用在企业级部署中的痛点而设计。它提供了镜像存储、管理、安全和分发的全生命周期管理,是 Docker Registry 的企业级增强版本。
1.2.核心功能与用途
-
镜像存储与分发
-
支持多租户隔离,通过 “项目” 组织镜像资源
-
提供 HTTP/HTTPS 协议访问,支持镜像的拉取、推送和复制
-
兼容 Docker 和 OCI 镜像格式
-
-
企业级安全能力
-
基于角色的访问控制(RBAC)
-
镜像内容扫描(集成 Clair)
-
镜像签名与验证(支持 Notary)
-
审计日志记录所有操作
-
-
高可用性与扩展性
-
支持分布式部署和跨数据中心同步
-
可扩展的存储后端(本地文件系统、S3、Ceph 等)
-
水平扩展的微服务架构
-
-
与云原生生态集成
-
无缝对接 Kubernetes、Helm、Jenkins 等工具
-
支持 Helm Chart 仓库(需启用 ChartMuseum)
-
提供 Webhook 支持 CI/CD 流水线
-
1.3.核心优势
-
企业级安全防护
-
通过镜像扫描实现漏洞检测(CVE 分析)
-
支持镜像签名确保来源可信
-
细粒度的权限控制(项目→仓库→标签)
-
-
高效协作与管理
-
基于项目的资源隔离
-
镜像版本管理与标签策略
-
支持镜像复制与垃圾回收
-
-
高可用架构设计
-
分布式部署架构支持跨数据中心容灾
-
负载均衡与自动故障转移
-
支持容器化部署(Docker Compose/Kubernetes)
-
-
成本优化
-
镜像分层存储减少冗余
-
支持镜像代理缓存加速拉取
-
离线安装包支持内网环境
-
-
开放生态集成
-
兼容 Docker CLI 和 OCI 标准
-
支持与 Prometheus、Grafana 集成监控
-
提供 RESTful API 支持二次开发
-
1.4.典型应用场景
-
私有云 / 混合云环境
-
企业内部镜像存储库,替代 Docker Hub
-
跨公有云 / 私有云的镜像同步
-
-
CI/CD 流水线
-
作为镜像仓库支撑持续集成与部署
-
结合 Jenkins 实现自动化构建 - 测试 - 发布
-
-
微服务架构
-
管理大量微服务镜像版本
-
支持灰度发布与回滚
-
-
敏感数据保护
-
金融、医疗等行业的镜像加密存储
-
审计日志满足合规性要求
-
二、安装配置 Harbor
1.1.安装 Docker-ce
构建 Docker 软件仓库,用于下载 Docker。
echo >> /etc/yum.repos.d/docker.repo << EOF
[docker]
name=docker
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/rhel/9.3/x86_64/stable/
gpgcheck=0
EOF
安装 Docker-ce
yum install docker-ce -y
1.2.配置加速器
在安装 Docker 后,配置 /etc/docker/daemon.json 文件并添加加速器地址具有多方面的重要作用,以下为你详细介绍:
1.2.1.作用
加速镜像拉取过程
在默认情况下,Docker 从 Docker Hub 等官方镜像仓库拉取镜像时,由于网络等因素,速度可能会比较慢。尤其是在国内,由于网络距离以及网络限制等问题,拉取镜像的速度常常不尽人意。
通过配置 /etc/docker/daemon.json 文件添加加速器,例如阿里云、网易云等提供的镜像加速器服务,Docker 会优先从这些加速器节点获取镜像。这些加速器节点通常在国内有多个数据中心,并且和 Docker Hub 等官方仓库有稳定快速的连接,能缓存大量常用镜像。这样一来,当你拉取镜像时,就可以直接从离你较近且速度快的加速器节点获取,大大缩短了镜像拉取的时间。
提高镜像拉取的稳定性
网络状况不稳定可能导致镜像拉取过程中出现中断、超时等问题,使得拉取操作失败,这会影响开发和部署的进度。
镜像加速器通过优化网络架构和采用分布式存储等技术,能够提供更稳定的服务。即使 Docker Hub 等官方仓库出现网络故障或者负载过高的情况,加速器节点依然可以为你提供镜像服务,保证镜像拉取的稳定性。
节省网络带宽和成本
由于镜像加速器节点可以缓存镜像,当多个用户或者多台服务器通过同一个加速器拉取相同镜像时,加速器节点可以直接提供缓存的镜像,无需每次都从官方仓库重新下载。
这样不仅减少了对官方仓库的访问压力,也降低了对本地网络带宽的占用,对于企业级用户来说,还能在一定程度上节省网络带宽成本。
支持多镜像源
/etc/docker/daemon.json 文件除了可以配置镜像加速器地址,还可以配置多个镜像源。这意味着你可以根据不同的需求,指定从不同的镜像仓库拉取镜像。
例如,你可以同时配置 Docker Hub 的加速器和国内其他的镜像仓库地址,当 Docker 在拉取镜像时,会按照配置的顺序依次尝试从这些镜像源获取,增加了获取镜像的途径和灵活性。
对 Docker 守护进程进行更多配置
/etc/docker/daemon.json 文件不仅仅用于配置镜像加速器,它还是 Docker 守护进程的配置文件。你可以在这个文件中进行其他各种配置,如调整 Docker 日志的存储方式、限制容器的资源使用、开启实验性特性等。
1.2.2.配置
echo >> /etc/docker/daemon.json << EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io", # DaoCloud 提供的 Docker 镜像加速器地址。
"https://hub-mirror.c.163.com", # 网易云
"https://mirror.baidubce.com", # 百度云
"https://docker.nju.edu.cn", # 南京大学
"https://register.liberx.info",
"https://mirror.ccs.tencentyun.com", # 腾讯云
"https://2i1r7dqv.mirror.aliyuncs.com" # 阿里云
]
}
EOF
加载配置并启动 Docker。
systemctl daemon-reload
systemctl enable --now docker
1.3.搭建基于认证的 Docker
1.3.1.生成认证 Key 和证书
创建存放证书的目录。
mkdir /root/certs
生成证书和 Key。
openssl req -newkey rsa:4096 -nodes -sha256 -keyout /root/certs/harbor.org.key -addext "subjectAltName = DNS:reg.harbor.org" -x509 -days 365 -out /root/certs/harbor.org.crt
-
openssl req:使用 openssl req 命令创建、处理证书签名请求,结合参数生成自签名证书
-
-newkey rsa:4096:用 RSA 算法生成 4096 位新私钥,位数越高安全性越好
-
-nodes:私钥不加密,方便使、用但要保障文件安全
-
-sha256:使用 SHA - 256 哈希算法保障证书完整性
-
-keyout /root/certs/harbor.org.key:指定私钥输出路径和文件名
-
-adext "subjectAltName = DNS:reg.harbor.org":为证书添加主题备用名称扩展,指定适用域名
-
-x509:直接生成自签名的 X.509 证书
-
-days 365:设置证书有效期为 365 天
-
-out /root/certs/harbor.org.crt:指定自签名证书输出路径和文件名
注意:
-
-addext "subjectAltName = DNS:reg.harbor.org" 参数:该参数为证书添加了主题备用名称,指定证书可用于访问 reg.harbor.org 这个域名。在现代的 TLS 配置中,浏览器和客户端通常会检查证书的主题备用名称。如果证书的主题备用名称与实际访问的域名不匹配,客户端会提示证书无效。如果需要支持多个域名,可以使用逗号分隔多个 DNS 条目,例如 -addext "subjectAltName = DNS:reg.harbor.org,DNS:another.harbor.org"。
1.3.2.Docker 加载证书
支持私有镜像仓库的 TLS 认证
在使用 Docker 与私有镜像仓库(如 Harbor)进行交互时,为确保通信安全,通常会使用 TLS(传输层安全协议)加密。私有镜像仓库一般会使用 SSL/TLS 证书来验证其身份,防止中间人攻击并保证数据在传输过程中的保密性和完整性。
Docker 客户端默认信任系统的 CA 证书,但私有镜像仓库的证书可能是自签名证书,或者由私有 CA 颁发,这些证书不会被 Docker 客户端默认信任。此时,就需要将私有镜像仓库的证书添加到 Docker 客户端的信任列表中。
/etc/docker/certs.d 是 Docker 客户端用于存储自定义证书的目录,其下的每个子目录对应一个特定的镜像仓库域名。/etc/docker/certs.d/reg.harbor.org 就是为 reg.harbor.org 这个私有镜像仓库准备的证书存储目录。通过在该目录下放置对应的证书文件,Docker 客户端在与 reg.harbor.org 进行通信时,会自动读取这些证书并验证仓库的身份。
# 创建 docker 存放证书的目录
mkdir -p /etc/docker/certs.d/reg.harbor.org
# 拷贝前面生成的证书到此目录下
cp /root/certs/harbor.org.crt /etc/docker/certs.d/reg.harbor.org/ca.crt
# 重启 docker
systemctl restart docker
1.4.安装 Harbor
1.4.1.下载解压 Harbor
# 在家目录下下载 harbor,并解压到当前目录
wget https://github.com/goharbor/harbor/releases/download/v2.5.4/harbor-offline-installer-v2.5.4.tgz
tar zxf harbor-offline-installer-v2.5.4.tgz
# hosts 解析
echo >> /etc/hosts << EOF
192.168.67.141 reg.docker.org
EOF
1.4.2.修改配置文件
cd /root/harbor
cp harbor.yml.tmpl harbor.yml
vim /root/harbor/harbor.yml
编辑以下内容。
1.4.3.证书认证
./install.sh --with-chartmuseum # 报错,找不到认证文件,需拷贝证书到 harbor 配置文件所指定目录下
cp -r /root/certs/ /data/
cd /root/harbor/
./install.sh --with-chartmuseum # 再次安装 harbor
# Harbor 出问题时可用下两条命令重启 Harbor
# docker compose down # 用于清理 Docker Compose 项目所创建的资源,让环境恢复到初始状态。
# docker compose up -d # 用于根据配置文件创建并在后台启动容器,开启项目的运行。这两条命令通常结合使用,在开发、测试和部署过程中发挥重要作用。
-
./install.sh:这表示执行当前目录下的 install.sh 脚本。在 Harbor 的安装包中,install.sh 是官方提供的用于自动化安装 Harbor 的脚本。
-
--with-chartmuseum:这是 install.sh 脚本的一个参数选项。ChartMuseum 是一个开源的 Helm Chart 仓库服务器,Harbor 从 1.6 版本开始支持集成 ChartMuseum。使用 --with-chartmuseum 参数意味着在安装 Harbor 的过程中会同时安装并集成 ChartMuseum 服务。
执行 ./install.sh --with-chartmuseum 操作的主要目的是让 Harbor 具备 Helm Chart 仓库的功能,具体体现在以下几个方面:
-
支持 Helm Chart 存储与管理
Helm 是 Kubernetes 的包管理工具,Helm Chart 是描述一组 Kubernetes 资源的文件集合。通过集成 ChartMuseum,Harbor 可以作为 Helm Chart 的存储仓库,用户能够方便地将自己创建的 Helm Chart 上传到 Harbor 中进行存储和管理。这有助于团队内部共享和复用 Helm Chart,提高开发和部署效率。
-
实现 Helm Chart 的版本控制
Harbor 集成 ChartMuseum 后,可以对 Helm Chart 进行版本管理。用户可以为不同版本的 Helm Chart 打标签,方便追踪和回滚到特定版本的部署。这对于生产环境中的应用更新和故障恢复非常重要。
-
增强安全性和访问控制
Harbor 本身提供了丰富的安全功能,如基于角色的访问控制(RBAC)、镜像扫描等。集成 ChartMuseum 后,这些安全功能同样适用于 Helm Chart。管理员可以根据用户角色和权限,精确控制哪些用户可以上传、下载和管理 Helm Chart,从而保障 Helm Chart 的安全性。
-
与现有 Harbor 功能集成
将 ChartMuseum 集成到 Harbor 中,可以与 Harbor 的其他功能无缝集成,如日志记录、审计等。这使得整个容器镜像和 Helm Chart 的管理过程更加统一和高效,方便运维人员进行监控和管理。
综上所述,使用 ./install.sh --with-chartmuseum 命令安装 Harbor 可以让 Harbor 具备 Helm Chart 仓库的功能,为 Kubernetes 应用的部署和管理提供更全面的支持。
1.5.测试
浏览器访问 IP,输入用户名(默认 admin)和密码(上述配置文件里所修改的harbor_admin_password),进入 harbor 界面。
创建一个新的项目,选择公开,所有人多可以下载。
二、推送镜像
2.1.打标签推送镜像
docker login reg.harbor.org
docker tag nginx:v3 reg.harbor.org/openlab/nginx:v3 # 打标签,解释如下
docker push reg.harbor.org/openlab/nginx:v3
docker tag 命令用于为本地的 Docker 镜像添加一个新的标签。在将本地镜像推送到远程仓库时,需要按照远程仓库的要求为镜像添加合适的标签,标签中包含了远程仓库的地址、项目名称和镜像版本等信息。
reg.harbor.org 是 Harbor 镜像仓库的地址;openlab 是 Harbor 中的项目名称,用于对镜像进行分类管理;nginx 是镜像名称;v3 是镜像版本标签。
2.2.测试
刷新 Harbor 浏览器界面,可以看到刚推送上来的镜像。
三、客户端拉取镜像
前提:客户端也需下载 Docker-ce,配置加速器,如上步骤 2.1 和 2.2
3.1.Hosts 解析
echo >> /etc/hosts << EOF
192.168.67.141 reg.harbor.org
EOF
3.1.Docker 加载 Harbor 证书
-
TLS 双向认证 Harbor 使用 HTTPS 通信时,客户端必须信任 Harbor 的证书(CA 签名或自签名),否则会因证书验证失败拒绝连接。
-
Docker 证书机制 Docker 客户端默认信任系统证书库(如 /etc/pki/ca-trust/),但私有证书需手动添加到 certs.d 目录。
mkdir -p /etc/docker/certs.d/reg.harbor.org
scp /etc/docker/certs.d/reg.harbor.org/ca.crt 192.168.67.142:/etc/docker/certs.d/reg.harbor.org/ca.crt # 从 Harbor 主机拷贝证书到客户端主机上
systemctl restart docker
3.2.拉取镜像
docker pull reg.harbor.org/openlab/nginx:v3