Harbor 是VMware公司开源的企业级Docker Registry项目,其目标是帮助用户迅速搭建一个企业级的Docker Registry服务。
作为一个企业级私有的Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。
Harbor特性
- 基于角色的访问控制—用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
- 镜像复制—镜像可以在多个Registry实例中复制(同步)。尤其适合与负载均衡,高可用,混合云和多云的场景。
- AD/LDAP支持—Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
- 审计管理—所有针对镜像仓库的操作都可以被追溯,用于审计管理。
- 国际化—已拥有中文、英文、德文、日文和俄文的本地化版本。更多的语言会添加进来。
- RESTful API—RESTful API提供给管理员对于Harbor更多的操控,使得与其他管理软件集成变得更容易
- 部署简单—Docker-compose和离线安装
概念
Harbor是企业级docker镜像仓库,而registry是私有仓库
Registry的缺点
1、安全性能不足
2、纯命令行操作,没有图形化界面
harbor组件
Proxy代理:主要实现对请求的识别和转发,是一个内置的nginx
Registry:实现对docker pull / docker push命令的响应,也负责对token的验证
log collector:收集日志
Core service:核心服务器
? UI:提供图形化界面,帮助用户管理镜像,并授权
? token:验证权限
? webhook:把镜像状态及时传递给UI
Database:负责存储用户权限,审计日志、Docker image等数据
Job service:负责镜像在harbor仓库之间的同步和传输(多实例同步)
Log collector:为了帮助监控 Harbor 运行,负责收集其他组件的 log,供日后进行分析。
运行容器 log:运行着 rsyslogd 的容器,通过 log-driver 的形式收集其他容器的日志。
harbor原理
从客户端到代理的请求,Proxy来查看请求的目的是查看数据,然后将请求转发到Core services,而ui界面的数据来自Database;如果请求的目的是上传镜像,将转发到Registry,而上传镜像同样需要权限,进行token验证,经过Core services,然后将要上传的镜像传输到Database,Job services会拿取Database的数据用来与其他Harbor仓库进行同步传输
搭建域名服务
因为要使用域名来访问harbor,所以要做自建的域名服务
安装bind软件包以及工具包
yum -y install bind bind-utils bind-libs bind-chroot epel-release vim
修改主配置文件
$ vim /etc/named.conf
options {
listen-on port 53 { any; }; # 改为any,监听地址
...
allow-query { any; }; # 改为any,谁可以对当前DNS服务器提出解析请求,any是任何人
修改区域配置文件
$ vim /etc/named.rfc1912.zones
# 末尾添加
zone "yanjiang.chai" IN { # 引号内修改为自己申请或者定义的二级域,内网自己定义即可
type master;
file "yanjiang.chai.zone"; # 指向/var/named目录的正向解析文件
allow-update { none; };
};
zone "1.168.192.in-addr.arpa" IN { # 引号内修改为网络位地址的倒序
type master;
file "192.168.1.arpa"; # 指向/var/named目录的反向解析文件
allow-update { none; };
};
创建正向和反向解析配置文件
cd /var/named
# 文件名与区域配置文件中的文件名一致
cp -p named.localhost yanjiang.chai.zone # 正向解析
cp -p named.localhost 192.168.1.arpa # 反向解析
修改正向解析
$TTL 1D
$ORIGIN yanjiang.chai. # 表示以下记录的域来自yanjiang.chai.,如master1来自master1.yanjiang.chai.
@ IN SOA harbor1.yanjiang.chai. root ( # harbor1.yanjiang.chai.为当前主机域名,root可以改为管理员邮箱,不写管理员邮箱会报错
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS harbor1.yanjiang.chai. # @表示当前主机,当前主机的域名为harbor1.yanjiang.chai.
# 以下为正向解析记录
harbor1 IN A 192.168.1.12
修改反向解析
$TTL 1D
@ IN SOA harbor1.yanjiang.chai. root (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
# 以下为解析记录
IN NS harbor1.yanjiang.chai.
12 IN PTR harbor1.yanjiang.chai.
启动域名服务
systemctl --now enable named
修改三台服务器的nameserver为192.168.1.12
$ vim /etc/resolv.conf
# 第一行添加
echo "nameserver 192.168.1.12" >> /etc/resolv.conf
验证解析
$ nslookup harbor1.yanjiang.chai
Server: 192.168.1.12
Address: 192.168.1.12#53
Name: harbor1.yanjiang.chai
Address: 192.168.1.12
$ nslookup 192.168.1.12
12.1.168.192.in-addr.arpa name = harbor1.yanjiang.chai.
准备Harbor环境
环境如下:
HOSTNAME | IP | OS | Hard |
---|---|---|---|
harbor1 | 192.168.1.2 | Centos 7.6 | 4c4g |
修改主机名
hostnamectl set-hostname harbor1
安装docker
yum -y install yum-utils device-mapper-persistent-data lvm2 vim epel-release
yum-config-manager --add-repo=http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce-20.10.6
systemctl --now enable docker
修改国内镜像站请参考 部署Docker
下载docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
下载harbor安装包
wget -P /usr/local https://github.com/goharbor/harbor/releases/download/v2.1.5/harbor-offline-installer-v2.1.5.tgz
tar zxf /usr/local/harbor-offline-installer-v2.1.5.tgz -C /usr/local
HTTPS自签证书
生成CA证书
用来颁发证书
mkdir /usr/local/harbor/pki && cd $_
# 生成CA证书私钥
openssl genrsa -out ca.key 4096
# 生成CA证书
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=harbor/OU=Docker/CN=harbor1.yanjiang.chai" -key ca.key -out ca.crt
生成服务器证书
# 生成私钥
openssl genrsa -out harbor1.yanjiang.chai.key 4096
# 生成证书签名请求
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=harbor/OU=Docker/CN=harbor1.yanjiang.chai" -key harbor1.yanjiang.chai.key -out harbor1.yanjiang.chai.csr
生成一个x509 v3扩展文件
无论使用域名还是IP地址连接到Harbor主机,都必须创建此文件,以便可以为Harbor主机生成符合主题备用名称(SAN)和x509 v3的证书扩展要求。
# 使用时为了避免不必要的错误,请将文件中注释删除
cat > v3.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor1.yanjiang.chai # FQDN完整域名
DNS.2=yanjiang # 二级域
DNS.3=harbor1 # hostname
EOF
生成harbor证书
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in harbor1.yanjiang.chai.csr -out harbor1.yanjiang.chai.crt
将服务器证书(harborx.yanjiang.chai.crt)和密钥(harborx.yanjiang.chai.key)复制到 harbor 要指定的路径中,当然也可以不复制,我这里就不复制了,因为我都是在 harbor 所在主机的 harbor 路径做的。
转换harbor证书->docker
部署 harbor 本身就是给 docker 准备的,所以 docker 在使用 harbor 时,也会用到证书。docker 的守护进程将 .crt
文件解释为 CA 证书,.cert
文件为客户端证书
openssl x509 -inform PEM -in harbor1.yanjiang.chai.crt -out harbor1.yanjiang.chai.cert
复制到docker的证书目录
mkdir /etc/docker/certs.d/harbor1.yanjiang.chai -p
cp harbor1.yanjiang.chai.cert /etc/docker/certs.d/harbor1.yanjiang.chai
cp harbor1.yanjiang.chai.key /etc/docker/certs.d/harbor1.yanjiang.chai
cp ca.crt /etc/docker/certs.d/harbor1.yanjiang.chai
重启docker即可
systemctl restart docker
系统级别信任证书
cp harbor1.yanjiang.chai.crt /etc/pki/ca-trust/source/anchors
update-ca-trust
如果想要环境中所有的docker主机都可以识别的话,在每个docker主机都创建对应域名的证书目录。
修改 harbor.yml
配置文件
$ cd /usr/local/harbor/
$ cp harbor.yml.tmpl harbor.yml
$ vim harbor.yml
hostname: harbor1.yanjiang.chai # 修改为自己ip或者域名
https:
port: 443
# 证书文件路径
certificate: /usr/local/harbor/pki/harbor1.yanjiang.chai.crt
private_key: /usr/local/harbor/pki/harbor1.yanjiang.chai.key
harbor_admin_password: Harbor12345 # harbor登录密码
部署harbor
$ ./prepare
...
Successfully called func: create_root_cert
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir
$ ./install.sh
...
[Step 5]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registryctl ... done
Creating registry ... done
Creating harbor-db ... done
Creating harbor-portal ... done
Creating redis ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating nginx ... done
? ----Harbor has been installed and started successfully.----
访问 https://harbor1.yanjiang.chai
,若无法访问,则关闭防火墙或者放行443和80端口
默认用户名:admin
默认密码:Harbor12345
登录后
可以通过创建项目来,添加一个新项目
docker login
在本地使用 docker pull
和 docker push
操作仓库时,需要登录
# 交互式登录
$ docker login https://harbor1.yanjiang.chai
Username: admin
Password:
...
Login Succeeded
# 非交互式登录
$ docker login -u admin -p Harbor12345 https://harbor1.yanjiang.chai
测试
部署完harbor后,docker本地会有关于harbor的一些镜像,现在将这些镜像传到harbor仓库当做验证。镜像略多,写脚本上传
先用命令行创建一个项目,该文件用来创建项目
cat << EOF >> createproject.json
{
"project_name": "goharbor",
"metadata": {
"public": "true"
}
}
EOF
命令行创建harbor仓库项目
curl -u "admin:Harbor12345" -X POST -H "Content-Type: application/json" "https://harbor1.yanjiang.chai/api/v2.0/projects" -d @createproject.json --cacert /usr/local/harbor/pki/ca.crt
查看页面
上传测试请参考 harbor双主复制
OK!!!