一、Harbor介绍
Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。
二、Harbor的结构
- Proxy:对应启动组件nginx。它是一个nginx反向代理,代理Notary client(镜像认证)、Docker client(镜像上传下载等)和浏览器的访问请求(Core Service)给后端的各服务
- UI(Core Service):对应启动组件harbor-ui。底层数据存储使用mysql数据库,主要提供了四个子功能:
- UI:一个web管理页面ui
- API:Harbor暴露的API服务
- Auth:用户认证服务,decode后的token中的用户信息在这里进行认证;auth后端可以接 db、ldap、uaa三种认证实现
- Token服务(上图中未体现): 负责根据用户在每个project中的role来为每一个docker push/pull命令发布一个token,如果从docker client发送给registry的请求没有带token,registry会重定向请求到token服务创建token
- Registry:对应启动组件registry。负责存储镜像文件,和处理镜像的pull/push命令。Harbor对镜像进行强制的访问控制,Registry会将客户端的每个pull、push请求转发到token服务来获取有效的token
- Admin Server:对应启动组件harbor-core。是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候需要加载adminserver的配置
- Job Sevice:对应启动组件harbor-jobservice。负责镜像复制工作的,它和registry通信,从一个 registry pull镜像然后push到另一个registry,并记录job_log
- Log Collector:对应启动组件harbor-log。日志汇总组件,通过docker的log-driver把日志汇总到一起
- DB:对应启动组件harbor-db,负责存储project、 user、 role、replication、image_scan、 access等的metadata数据
三、安装Harbor
注意:安装Harbor之前先安装Docker和Docker Compose
这里用192.168.131.11和192.168.131.12两台机器安装Harbor,192.168.131.13机器作为Harbor客户端,上传&下载镜像。
3.1 下载Harbor安装包并解压缩
下载地址:https://github.com/vmware/harbor/releases
#下载离线安装包,推荐使用
wget https://github.com/goharbor/harbor/releases/download/v2.7.1/harbor-offline-installer-v2.7.1.tgz
#解压
tar -xf harbor-offline-installer-v2.7.1.tgz -C /usr/local
3.2 编辑Harbor配置文件
cd /usr/local/harbor
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
##修改如下内容
#当前主机ip或域名,建议写ip地址
hostname: 192.168.131.11
#指定harbor登录用户admin的密码,默认用户/密码:admin/Harbor12345
harbor_admin_password: 123456
#数据卷路径
data_volume: /data/harbor
#运行Harbor安装脚本
./install.sh
3.3 设置开机自启动Harbor
vim /lib/systemd/system/harbor.service
[Unit]
Descriptinotallow=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentatinotallow=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/local/bin/docker-compose -f /usr/local/harbor/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /usr/local/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
systemctl daemon-reload && systemctl enable harbor
3.4 登录Harbor界面
浏览器访问http://192.168.131.11。用户名是admin,密码是harbor.yml中指定的密码
四、使用单主机的Harbor
4.1 建立项目
Harbor需要先建立项目,才能上传镜像。
项目->新建项目,填写项目名称。访问级别为公开表示下载镜像无需输入密码,但是上传镜像(不论是否选择公开)都要输入密码。存储容量为-1表示容量不限。
4.2 命令行登录Harbor
需要先加入Harbor仓库的地址,否则无法登录。加入的方法如下:
方法1:修改docker服务的配置文件
vim /lib/systemd/system/docker.service
…
ExecStart=/usr/bin/dockerd -H fd:// --cnotallow=/run/containerd/containerd.sock --insecure-registry 192.168.131.11
…
systemctl daemon-reload && systemctl restart docker
方法2:修改/etc/docker/daemon.json
vim /etc/docker/daemon/json
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
"insecure-registries": ["192.168.131.11"]
}
systemctl daemon-reload && systemctl restart docker
之后用docker login xxx(Harbor地址)命令登录,输入用户名/密码
4.3 给本地镜像打标签并上传到Harbor
docker tag centos.7.9.2009-nginx:1.22.1 192.168.131.11/wxd/centos.7.9.2009-nginx:1.22.1
docker push 192.168.131.11/wxd/centos.7.9.2009-nginx:1.22.1
访问Harbor网站,看到上传镜像成功
4.4 在其他机器下载harbor仓库的镜像
下载前必须修改docker的service文件或/etc/docker/daemon.json文件(方法同上),加入harbor服务器的地址才可以下载。
五、Harbor的高可用
类似于MySQL的主从同步,可以实现不同的数据中心、不同的运行环境之间同步镜像。
Harbor目前有两种主流的高可用方案:
- 多Harbor实例共享后端存储。将Harbor的数据存放到共享存储上(eg:NFS),每个Harbor只对外提供服务。但这样对共享存储的访问压力较大,仅仅是Harbor服务提供了高可用,对于镜像未提供高可用,因为镜像放到了共享存储中。如果共享存储是单机部署,也存在单点故障问题
- 双主复制,harbor自带的镜像复制功能,推荐使用。每个Harbor节点都提供了自己的业务应用和数据存储,两个Harbor之间可进行实时的数据同步
5.1 安装第二个Harbor
部署方式同上。hostname需要改成自己的Ip(eg:192.168.131.12)
5.2 第二个Harbor新建项目
参考第一台Harbor服务器的项目名称,新建与之同名的项目
5.3 第二台Harbor服务器上仓库管理中新建目标
参考第一台主机信息,新建复制(同步)目标信息,将第一台主机设为复制的目标
5.4 第二台Harbor上新建复制规则实现到第一台Harbor的单向复制
系统管理->复制管理->新建规则。在第二台Harbor上建立复制的目标主机,将第二台Harbor上面的镜像复制到第一台Harbor。
以上操作,只是实现了从第二台Harbor主机192.168.131.12到第一台Harbor主机192.168.131.11的单向同步。在第一台Harbor上再执行如上操作(新建目标->新建复制规则),才能实现双向同步。
5.5 测试高可用效果
5.5.1 上传镜像观察是否可以双高同步
#在Harbor客户端执行
docker tag centos7-tomcat:10.1.7 192.168.131.12/wxd/centos7-tomcat:10.1.7
docker push 192.168.131.12/wxd/centos7-tomcat:10.1.7
5.5.2 删除镜像观察是否可自动同步
在192.168.131.11将刚上传的镜像删掉,发现在192.168.131.12机器上的镜像仓库中只有名称,但点开后里面的内容(Artifacts部分)为空。说明删除镜像也能自动同步
5.6 拓展:配置Nginx作为反向代理
apt-get -y install nginx
#Nginx配置反向代理
vim /etc/nginx/conf.d/harbor.conf
upstream harbor {
#将某个ip的请求定向到同一台后端web机器中,这样一来这个ip下的客户端和某个后端web机器就能建立起稳固的session
ip_hash;
server 192.168.131.11;
server 192.168.131.12;
}
server {
listen 80;
server_name harbor.wxd.org;
#限制请求体大小
client_max_body_size 10g;
location / {
proxy_pass http://harbor;
}
}
systemctl restart nginx
#客户端Docker配置
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
"insecure-registries": ["harbor.wxd.org"]
}
systemctl restart docker
##客户端Docker配置hosts解析(物理机也要添加)
192.168.131.13 harbor.wxd.org
###如果harbor配置中的hostname有指定名称,则需要加如下hosts解析:
192.168.131.11 xxx
192.168.131.12 xxx
最后同样的操作,客户端执行docker改tag号->上传镜像即可
六、Harbor 之Https 安全配置
基于安全考虑,生产环境建议采用 https 代替 http。
官方文档:https://goharbor.io/docs/2.7.0/install-config/configure-https/
6.1 Harbor服务器生成证书
mkdir /data/harbor/certs && cd /data/harbor/certs
#生成ca的私钥
openssl genrsa -out ca.key 4096
#生成ca的自签名证书。这里以wxd.org域名为例进行演示
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=wxd.org" -key ca.key -out ca.crt
#生成harbor主机的私钥
openssl genrsa -out wxd.org.key 4096
#生成harbor主机的证书申请
openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=wxd.org" -key wxd.org.key -out wxd.org.csr
#创建x509 v3扩展文件
cat v3.ext
authorityKeyIdentifier=keyid,issuer
basicCnotallow=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=wxd.org
#给Harbor主机颁发证书
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in wxd.org.csr -out wxd.org.crt
6.2 配置Harbor服务器使用证书
cd /usr/local/harbor
vim harbor.yml
…
# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /data/harbor/certs/wxd.org.crt
private_key: /data/harbor/certs/wxd.org.key
…
#使上面的配置生效
./prepare;docker-compose down;docker-compose up –d
#在linux机器和物理机做域名解析
192.168.131.11 wxd.org
访问https://wxd.org
6.3 配置Docker客户端使用证书文件
#转换harbor的crt证书文件为cert后缀,docker识别crt文件为CA证书,cert为客户端证书服务器
cd /data/harbor/certs
openssl x509 -inform PEM -in wxd.org.crt -out wxd.org.cert
#在docker客户端使用上面的证书文件
mkdir -p /etc/docker/certs.d/wxd.org
scp 192.168.131.11:/data/harbor/certs/{wxd.org.cert,wxd.org.key,ca.crt} /etc/docker/certs.d/wxd.org
上面证书配置后无需重启服务即可生效。
在docker客户端登录harbor服务器,注意:此时无需再配置insecure-registries项即可登录
6.4 Docker客户端测试上传和下载镜像
docker tag alpine wxd.org/wxd/alpine
docker push wxd.org/wxd/alpine