部署说明
1) 本文以 Harbor v2.10.2 为例。
2) 安装包已下载并解压至待安装机器。(安装包下载地址: https://github.com/goharbor/harbor/releases )
3) 待部署服务器已安装好 docker 以及 docker-compose。
本文将介绍以下几种部署方式:
1) HTTP 模式部署
2) HTTPS 模式部署
3) 反向代理模式部署(nginx)
HTTP 模式部署
# 解压 harbor 安装包后,进入 harbor 目录
# 基于 harbor.yml.tmpl 创建 harbor.yml
cp harbor.yml.tmpl harbor.yml
# 注释掉 harbor.yml 中 https 相关配置。
./install.sh
验证
由于是 http 仓库,docker 使用时需要将仓库地址配置为 insecure-registries
HTTPS 模式部署
开启 TLS 认证需要在安装前准备好域名以及配套证书,本文以自签名证书为例。
自签名证书生成
假设 Harbor 部署完之后的访问域名是: hub.demo.local
创建证书文件目录
mkdir -p /etc/ssl/harbor/hub.demo.local
cd /etc/ssl/harbor/hub.demo.local
生成 CA 私钥
openssl genrsa -out ca.key 4096
生成 CA 证书
# 以下命令中的 -days 3650 表示证书有效期为 10 年
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=MyPersonal Root CA" \
-key ca.key \
-out ca.crt
生成服务端证书私钥
openssl genrsa -out hub.demo.local.key 4096
生成服务端证书签名请求
# 注意 -subj 中 CN 设置为目标域名
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=hub.demo.local" \
-key hub.demo.local.key \
-out hub.demo.local.csr
生成证书配置文件(x509 v3 extension file)
# 注意 alt_names 中域名和 ip 地址会被写入证书,请按规划及访问需求进行填写
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=hub.demo.local
DNS.2=hub.demo
IP.1=192.168.6.5
IP.2=192.168.6.6
EOF
生成 Harbor 服务端证书
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in hub.demo.local.csr \
-out hub.demo.local.crt
基于 crt 证书文件创建 cert 证书文件 (For Docker)
openssl x509 -inform PEM -in ca.crt -out ca.cert
openssl x509 -inform PEM -in hub.demo.local.crt -out hub.demo.local.cert
部署 Harbor
填写配置文件
# 解压 harbor 安装包后,进入 harbor 目录
# 基于 harbor.yml.tmpl 创建 harbor.yml
cp harbor.yml.tmpl harbor.yml
# 注意 hostname 配置为目标域名,证书地址配置为实际生成的证书路径
执行安装
# 注意 安装前请确保机器已经安装了 docker 和 docker-compose
./install.sh
验证
# 添加 /etc/hosts (如果域名没有加入环境中的 dns)
# hub.demo.local 192.168.6.5
# 注意 使用自签名证书仓库有两种方式:
# 1. 将证书拷贝至 /etc/docker/certs.d 目录下 (需要使用该仓库的所有节点,都需要证书)
# cp -r /etc/ssl/harbor/hub.demo.local /etc/docker/certs.d
# 2. 将仓库地址在 /etc/docker/daemon.json 中设置为 insecure-registries
反向代理模式部署
如果 nginx 后端为开启 https 的 Harbor,则无法通过代理地址使用 Harbor 页面,但命令行可以正常使用。如果需要通过 nginx 代理地址访问 Harbor 页面,需要在安装 Harbor 时在 harbor.yml 中设置 external_url 为代理地址,但内外网所有请求都会被转发到代理地址。
nginx 示例配置:
server {
listen 8080;
# 开启 nginx ssl 认证
# listen 9443 ssl;
# server_name hub.demo.nginx
# SSL 证书配置
# 此处证书需适配 server_name ,不是安装 harbor 时生成的证书。可参考上文中生成自签证书步骤或通过其他渠道获取证书。
# ssl_certificate /etc/nginx/ssl/harbor.crt;
# ssl_certificate_key /etc/nginx/ssl/harbor.key;
# SSL 协议和加密套件配置
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
# ssl_prefer_server_ciphers off;
# SSL 会话配置
# ssl_session_timeout 1d;
# ssl_session_cache shared:SSL:50m;
# ssl_session_tickets off;
location / {
# 代理 http 模式部署的 Harbor
proxy_pass http://192.168.6.5:80;
# 代理 https 模式部署的 Harbor
# proxy_pass https://hub.demo.local;
# proxy_ssl_verify off;
proxy_set_header Host $http_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_buffering off;
proxy_request_buffering off;
client_max_body_size 0;
chunked_transfer_encoding on;
}
}
验证测试:
nginx 未开启 ssl
nginx 开启 ssl