Harbor 私有镜像仓库搭建全过程指导,含自签证书及配置认证过程

docker   harbor   registry   tool  
发布于 Sep 5, 2024

Docker 大家应该比较熟悉了,Docker 之所以能够火遍全球,成为容器化的代名词,Docker Hub 绝对功不可没。

Docker Hub 中央仓库是基于 Docker Registry 构建的,但是默认的 Docker Registry 比较基础和底层,很多基于 Registry 进行了二次开发,而其中最著名的可能就要数 harbor 了。

今天我们就来实践安装当前最新版 Harbor 仓库吧!

官网地址:https://goharbor.io/

当前最新版本为:2.11.1, 以后再更新估计安装也大差不差,因为目前的安装方式已经几年没变过了。

Harbor 安装相对比较简单,一般推荐直接下载 离线安装包(包含有离线镜像)。

下载地址:

https://github.com/goharbor/harbor/releases

安装 Harbor 需要机器上提前安装好 docker & docker-compose, 如果没有安装可以参照我之前的文章。

Harbor 安装推荐的机器配置如下

我这里使用的 virtual box 虚拟机配置不算太高,不过应该能跑起来,试试吧!

如需了解 Virtual Box 安装虚拟机,可以参考我之前写过的一篇文章。

安装 Harbor 的步骤一般如下:

0, 机器安装 docker & docker-compose
1, 下载离线安装包
2, 自签证书或者使用已有的 SSL 证书(可选)
3, 修改配置文件
4, 安装并启动服务

下面我会带你全面从 0-1 完成一个单机版的 Harbor 仓库的搭建。

下载离线包

上面已经贴过下载地址了,这里直接演示命令,安装目录位于 /opt/

cd /opt/
wget https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz

自签证书

由于 docker 默认拉取镜像是 https 方式,而配置 https 需要 ssl 证书,所以我们来自签一个证书吧。当然 docker 也支持非安全拉取,这不是主要想新学一门技能吗,哈哈,开整。

主要分以下 6 步,我这里以 hub.laijuba.com 域名为例供参考

#1 创建 ca.key
openssl genrsa -out ca.key 4096
#2 创建 ca.crt
openssl req -x509 -new -nodes -sha512 -days 365 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=Harbor Root CA" \
 -key ca.key \
 -out ca.crt

#3 创建 hub.laijuba.com.key
openssl genrsa -out hub.laijuba.com.key 4096
#4 创建 hub.laijuba.com.csr
openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=hub.laijuba.com" \
    -key hub.laijuba.com.key \
    -out hub.laijuba.com.csr

#4 构建用于域名配置的 v3.ext 文件
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.laijuba.com
EOF

#5 构建 hub.laijuba.com.crt
openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in hub.laijuba.com.csr \
    -out hub.laijuba.com.crt

#6 构建 hub.laijuba.com.cert
openssl x509 -inform PEM -in hub.laijuba.com.crt -out hub.laijuba.com.cert

经过上述操作,总计得到了如下文件:

• ca.key
• ca.crt
• hub.laijuba.com.key
• hub.laijuba.com.csr
• v3.ext
• hub.laijuba.com.crt
• hub.laijuba.com.cert

Harbor 搭建需要用到:

• ca.crt
• hub.laijuba.com.key
• hub.laijuba.com.crt

Docker 配置证书需要用到:

• ca.crt
• hub.laijuba.com.key
• hub.laijuba.com.cert

以上证书先备用,后续会用到。

安装 Harbor

解压离线包,并配置,直接看下方操作吧

tar -zxf harbor-offline-installer-v2.11.1.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml

# 编辑 harbor.yml 相关配置, 只保留更改的部分,其他未改动的省略
vim harbor.yml
...
hostname: hub.laijuba.com
...
  certificate: /opt/harbor/ssl/hub.laijuba.com.crt
  private_key: /opt/harbor/ssl/hub.laijuba.com.key
...
data_volume: /data/harbor


# 创建 /opt/harbor/ssl 目录
mkdir ssl
# 拷贝证书
cp ../hub.laijuba.com.crt ../hub.laijuba.com.key ssl/

# 执行安装
./install.sh

等待执行完毕

安装成功

会自动生成一个 docker-compose.yml, 执行 docker-compose ps 可以查看状态, status 都是 healthy 则表示启动成功。

docker-compose ps

验证 Harbor

配置 /etc/hosts, 因为是自签的证书,所以配置一下 hosts 模拟 dns 解析

# 要用虚拟机的 IP,不要用 127.0.0.1
10.0.2.15 hub.laijuba.com

注:如果是本机搭建,不要配置 127.0.0.1,否则下面的 Docker 验证始终是成功的,因为默认 docker 拉取镜像配置的有 Insecure Registries: 127.0.0.0/8

使用 curl 模拟请求, 使用 -k 可以忽略证书校验

# 提示证书错误(预料之中)
curl -i https://hub.laijuba.com
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.


# -k 忽略校验响应正常
curl -i -k https://hub.laijuba.com
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 03 Sep 2024 15:09:33 GMT
Content-Type: text/html
Content-Length: 785
Connection: keep-alive
Last-Modified: Thu, 15 Aug 2024 10:00:30 GMT
ETag: "66bdd1be-311"
Cache-Control: no-store, no-cache, must-revalidate
Accept-Ranges: bytes
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>Harbor</title>
...

配置 linux 信任 ca 证书,我这里是 AlmaLinux(Red Hat系列)其他 linux 请自行搜索

cp ../ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust

# 再次执行curl,不需要带 -k 也可以正常了
curl -i https://hub.laijuba.com
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 03 Sep 2024 15:17:00 GMT
Content-Type: text/html

Docker 验证

验证一下 docker login,默认是会证书校验不通过的

docker login hub.laijuba.com
# 报错
Username: admin
Password: 
Error response from daemon: Get "https://hub.laijuba.com/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority

由于在上一步中已经系统信任了证书,但是需要重启一下 docker 才能加载到 受信任的证书。

尝试重启 docker 试试,成功了!

# 先把 harbor 停掉,等 docker 起来再拉起来
docker-compose down
# 重启 docker
systemctl restart docker
# 重新启动 harbor(等待启动完毕)
docker-compose up -d
# 需 STATUS = healthy 才行
docker-compose ps

docker login hub.laijuba.com
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

上面自签证书经过 linux 信任 ca 证书导致 docker 能生效的,如果不希望系统信任 ca 证书应该怎么办呢?

下面再实践一下通过 docker 配置证书

首先取消 linux ca 信任

rm -rf /etc/pki/ca-trust/source/anchors/ca.crt
update-ca-trust

curl -i https://hub.laijuba.com
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

curl 已经不能用了,证明系统级的证书信任已失效,重启 docker 验证是否还可以(步骤同上)

# 同样先停止 harbor
docker-compose down
# 重启 docker
systemctl restart docker
# 启动 harbor(徐等待启动完毕)
docker-compose up -d
# 需 STATUS = healthy 才行
docker-compose ps
# 登出 harbor
docker logout hub.laijuba.com
# 重新登录
docker login hub.laijuba.com
# 报错
Username: admin
Password: 
Error response from daemon: Get "https://hub.laijuba.com/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority

接下来按照 docker 官网的配置来实践只给 docker 配置认证

https://goharbor.io/docs/2.11.0/install-config/configure-https/

mkdir -p /etc/docker/certs.d/hub.laijuba.com
# 拷贝 cert, key, ca.crt 至上述目录下
cp ../hub.laijuba.com.cert ../hub.laijuba.com.key ../ca.crt /etc/docker/certs.d/hub.laijuba.com/

ls -al /etc/docker/certs.d/hub.laijuba.com
total 12
drwxr-xr-x. 2 root root   75 Sep  4 18:05 .
drwxr-xr-x. 3 root root   29 Sep  4 18:05 ..
-rw-r--r--. 1 root root 2053 Sep  4 18:05 ca.crt
-rw-r--r--. 1 root root 2134 Sep  4 18:05 hub.laijuba.com.cert
-rw-------. 1 root root 3272 Sep  4 18:05 hub.laijuba.com.key

继续重启 docker, 操作同上面

# 同样先停止 harbor
docker-compose down
# 重启 docker
systemctl restart docker
# 启动 harbor(徐等待启动完毕)
docker-compose up -d
# 需 STATUS = healthy 才行
docker-compose ps

# 重新登录
docker login hub.laijuba.com
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

OK, 单独配置 docker 使用证书也验证通过。

总结

今天主要分享了 Harbor 私有仓库的搭建,正常搭建比较简单,最主要是尝试通过自签证书实现 HTTPS 访问,包括验证了 linux 系统级信任自签证书和 docker daemon 配置信任自签证书,希望对你有所帮助。

关于证书,多啰嗦几句,现在全球都在推进 SSL 安全加密,越来越多的网站采用了 HTTPS 访问,没有启用 HTTPS 的网站可能即将在 浏览器 里禁止访问了,下一篇文章计划分享如何获取免费的 SSL 证书并给自己的网站配置 HTTPS 访问,敬请期待。

本次的分享到此结束,希望对你有所帮助。

如果你对我分享的内容感兴趣,欢迎扫码关注公众号:新质程序猿,并设置星标,推送更实时哟!

本文由 黄彦祥 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。
可自由转载、引用,但需署名作者且注明文章出处。