1. 背景需求
公司内部项目计划在明年进行容器化改造,需要先搭建内部镜像仓库,经过调研后,可供选择的解决方案有:
- Docker Registry + Docker Registry Web
- Gitlab Registry
- Harbor
经过对比分析,最终选择了 Harbor 作为生产实践,主要关注点有下:
- 支持关联 LDAP 账户
- 支持基于组的权限管理
- 支持复制同步,未来可用于同步生产镜像
但目前中文互联网上的配置教程普遍比较旧,本文基于写作日 (2021-12-08) 最新的 Harbor 版本,旨在记录下如何基于 CentOS 7 系统安装搭建 Harbor 平台。
2. 开始之前
原则上本文不详细赘述 CentOS 7 系统的安装部署过程,但这里还是假定基于全新安装的 CentOS 7 系统,后续需要准备的依赖以及安装配置步骤。
2.1. 系统最低/推荐配置
根据官方文档要求,Harbor 最低/推荐安装配置如下,本地或者虚拟机用户可后续调整,云主机用户可能需要注意,Harbor 平台不仅包含 Harbor 系统自身,同时也包含了 Redis/PostgreSQL 等配套服务,本文使用了 All-in-One 的安装模式,需要注意云主机是否满足最低配置要求:
本文使用的虚拟机配置为4C
/8G
/100GB
。
2.2. 配置中科大镜像
进入 CentOS 系统后,可通过以下命令修改
yum
安装源为中科大镜像:sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
-i.bak \
/etc/yum.repos.d/CentOS-Base.repo
完成后,使用
yum makecache
更新 yum
数据库。2.3. 安装 Docker
本文使用 get.docker.com 的安装脚本安装 Docker 运行时。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo bash ./get-docker --mirror Aliyun # 国内使用阿里云镜像加速
完成后,可使用以下命令检查 docker 是否安装成功:
sudo docker info
有正常输出即可。如需 docker 随系统自动启动,还需要启用
docker.service
sudo systemctl enable docker
sudo systemctl start docker
2.4. 安装 docker-compose
这一步没有什么投机的方法,按官网脚本安装即可,可能需要科学上网:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
下载完成后,通过以下命令修改权限:
sudo chmod +x /usr/local/bin/docker-compose
如果其他用户需要使用,可以软链接到
/usr/bin
目录下:sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
3. 安装 Harbor 平台
3.1. 下载 Harbor 离线安装包
有条件的用户推荐使用离线安装包,如果访问 Github/docker.io 困难,可以配置合适的 docker 镜像仓库,使用在线安装包(仅镜像拉取过程)
wget https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz
下载后,解压至当前目录:
tar -zxvf harbor-offline-installer-v2.3.4.tgz
3.2. 修改 Harbor 安装配置
解压完成后,进入当前目录下的
harbor
目录(即解压后的路径):cd harbor && cp harbor.yml.tmpl harbor.yml
这一步也是很多教程缺失的地方,实际上,从最早能查阅的
1.10
版本文档起,Harbor 就开始使用 harbor.yml
文件作为安装配置了;拷贝完成后,修改 harbor.yml
配置内容,这里只附上需要主要关注的内容:# 用于访问 harbor 的域名或 ip 地址,注意不要使用 localhost 或 127.0.0.1
hostname: harbor.your-domain.com
# http 相关配置
http:
# 如果你不启用 https,仅通过 http 来访问 harbor,习惯上设置端口为 5000
# 并需要为 docker 配置 insecure_registry
port: 5000
# https 相关配置
# 推荐启用 https
https:
# https 监听端口,必须保持 443 不变,如果与本机其他应用冲突,可通过 ./prepare 脚本
# 生成的 docker-compose 修改,但这里应保持 443 端口不变
port: 443
# 启用 https,必须提供 ssl 证书,可以使用自签名证书,但推荐使用 let's encrypt 或者
# 阿里云/腾讯云签发的公有证书,可以使用泛域名证书
# 放置在 /data 目录下,是因为 /data 会作为容器卷挂载,可被容器内的 nginx 读取
certificate: /data/cert/harbor.your-domain.com.crt
private_key: /data/cert/harbor.your-domain.com.key
修改保存后,可以使用
./install.sh
脚本安装 Harbor,如果不需要 Harbor 立即启动,可以注释文件中的第 99 行:3.3. 安装 Harbor 平台
./harbor
目录下提供了 ./install.sh
脚本供安装使用,同时,Harbor 还继承了一些可选组件:- Notary:提供安全信任机制,可以给镜像加数字签名,使用
--with-notary
参数启用;
- Trivy:针对容器的漏洞扫描器,使用
--with-trivy
参数启用;
- Chart 仓库:顾名思义 Helm Chart 仓库,使用
--with-chartmuseum
参数启用;
我们需要使用 Chart 仓库,根据实际情况添加参数即可。
sudo ./install.sh --with-chartmuseum [--with-trivy]
这一步命令会导入 Harbor 需要的镜像并生成
docker-compose.yml
,如果上一步禁止安装脚本自动启动 Harbor 服务,那么在启动前我们还有机会修改 docker-compose.yml
里的内容(比如修改 https 实际监听的端口地址):3.4. 启动 Harbor 平台
全部修改保存完成后,可以使用以下命令启动 Harbor 平台:
sudo docker-compose up -d
等待结束后,即可通过上面配置的
hostname
访问完成,使用默认管理员账号密码
admin
/ Harbor12345
登录即可。🎉4. 其他事项
4.1. 关于 LDAP
这一步各自单位情况不一,不作统一论述,使用管理员账号登录系统后,在左侧菜单中找到 系统管理 - 配置管理,然后选择 认证模式 标签页,将 认证模式 改为 LDAP 即可:
4.2. 关于反向代理
如果 Harbor 所在机器已经安装了 nginx 或其他占用
443
端口的服务,可以参考上面的步骤,配置 Harbor https 监听的端口实际代理到 host 的 8443
端口上,然后通过 nginx 反向代理来访问 Harbor 平台,这里给出一份示例配置,可根据实际情况修改server {
server_name harbor.your-domain.com;
listen 80;
location / {
rewrite ^/(.*)$ https://$host/$1 permanent;
}
}
upstream harbor {
server 127.0.0.1:8443; # 127.0.0.1 替换成实际的 Harbor 地址
}
server {
server_name harbor.your-domain.com;
listen 443 ssl;
client_max_body_size 1G; # docker 镜像一般比较大
ssl_certificate ssl/harbor.your-domain.com.crt;
ssl_certificate_key ssl/harbor.your-domain.com;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
ssl_prefer_server_ciphers on;
location ~ / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
# make options request fast return
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass https://harbor;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
}
}