一 、Harbor 介绍
1. 介绍
Harbor 是一个开源注册表,它使用策略和基于角色的访问控制来保护工件,确保图像被扫描且没有漏洞,并将图像签名为受信任。Harbor 是 CNCF 毕业项目,可提供合规性、性能和互操作性,帮助您跨云原生计算平台(如 Kubernetes 和 Docker)一致、安全地管理工件。
2. 官方文档
harbor 文档:港 (goharbor.io)
3. 下载安装包地址
harbor 的 tags 包:https://github.com/goharbor/harbor/tags
二、Harbor 整体架构
如上图所示是 Harbor 的架构图,从上到下可分为代理层、功能层和数据层。
- 代理层:代理层实质上是一个 Nginx 反向代理,负责接收不同类型的客户端请求,包括浏览器、用户脚本、Docker 等,并根据请求类型和 URI 转发给不同的后端服务进行处理。
- 功能层:
- Portal:是一个基于 Argular 的前端应用,提供 Harbor 用户访问的界面。
- Core:是 Harbor 中的核心组件,封装了 Harbor 绝大部分的业务逻辑。
- JobService:异步任务组件,负责 Harbor 中很多比较耗时的功能,比如 Artifact 复制、扫描、垃圾回收等。
- Docker Distribution:Harbor 通过 Distribution 实现 Artifact 的读写和存取等功能。
- RegistryCtl:Docker Distribution 的控制组件。
- Notary(可选):基于 TUF 提供镜像签名管理的功能。
- 扫描工具(可选):镜像的漏洞检测工具。
- ChartMuseum(可选):提供 API 管理非 OCI 规范的 Helm Chart。
- 数据层:
- Redis: 缓存服务存储一些生命周期较短的数据,同时对于 JobService 还提供了类似队列的功能。
- PostgreSQL: 存储 Harbor 的应用数据,比如项目信息、用户与项目的关系、管理策略、配置信息、Artifact 的元数据等等。
- Artifact存储: 存储 Artifact 本身的内容,也就是每次推送镜像、Helm Chart 或其他 Artifact 时,数据最终存储的地方。
三、docker compose 部署 Harbor
3.1 前提要求
硬件要求:
资源 | 最低 | 推荐 |
---|---|---|
CPU | 2 CPU | 4 CPU |
Mem | 4 GB | 8 GB |
Disk | 40 GB | 160 GB |
软件要求:
软件 | 版本 | 描述 |
---|---|---|
Docker 引擎 | 版本 20.10.10-ce+ 或更高版本 | 有关安装说明,请参阅 Docker 引擎文档 |
Docker Compose | docker-compose (v1.18.0+) 或 docker compose v2 (docker-compose-plugin) | 有关安装说明,请参阅 Docker Compose 文档 |
OpenSSL | 以最新为优先 | 用于生成 Harbor 的证书和密钥 |
网络端口:
端口 | 协议 | 描述 |
---|---|---|
443 | HTTPS | Harbor 门户和核心 API 接受此端口上的 HTTPS 请求。您可以在配置文件中更改此端口。 |
4443 | HTTPS | 连接到 Harbor 的 Docker 内容信任服务。您可以在配置文件中更改此端口。连接到 Harbor 的 Docker 内容信任服务。您可以在配置文件中更改此端口。 |
80 | HTTP | Harbor 门户和核心 API 在此端口上接受 HTTP 请求。您可以在配置文件中更改此端口。 |
3.2 下载安装包
# 更新 wget 包
yum -y install wget
# 下载 harbor 包
wget https://github.com/goharbor/harbor/releases/download/v2.9.4/harbor-offline-installer-v2.9.4.tgz
tar -zxvf harbor-offline-installer-v2.9.4.tgz
cd harbor
查看解压的图片
3.3 修改配置文件
拷贝模板文件为 harbor.yml
cp harbor.yml.tmpl harbor.yml
编辑 harbor.yml 配置文件:
- hostname 是 harbor 对外暴露的访问地址,修改为 域名 或者 harbor的IP
- HTTP默认端口是 80;将其修改为对外暴露 8888 端口。
- 这里暂时先不配置 HTTPS,将 HTTPS 相关内容注释。
3.4 部署 Harbor
修改完配置文件后,只需要执行 install.sh 脚本即可安装 Harbor。
./install.sh
查看 Harbor 组件运行状况:
- 输入
docker ps
或者docker compose ps
指令,查看部署详情
3.5 登录页面
- 浏览器输入 http://192.168.159.171:8888 访问 Harbor 页面,用户名和密码为 harbor.yml 配置文件中默认设置的 admin,Harbor12345。
- 创建用户(带 "*" 必填)
- 创建项目(带 "*" 必填,项目配额限制( -1 :表示不做限制) )
3.6 打包文件并推送镜像
-
推送镜像
从公网拉取一个 redis:latest 版本的镜像
docker pull redis docker run -p 6379:6379 --name redis-6379 \ -v /mydata/redis/data:/data \ -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \ -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass "root"
-
编辑 /etc/docker/daemon.json,设置允许访问的 HTTP 仓库地址。
{ "insecure-registries":["192.168.159.171:8888"] }
-
修改镜像 tag:
docker tag redis:latest 192.168.159.171:8888/develoy/redis:240421
-
登录 Harbor:
docker login 192.168.159.171:8888 -u admin
-
推送镜像到 Harbor:
[root@12306 harbor]# docker push 192.168.159.171:8888/develoy/redis:240421 The push refers to repository [192.168.159.171:8888/develoy/redis] 8e5669d83291: Pushed 9975392591f2: Pushed 529cdb636f61: Pushed 4b8e2801e0f9: Pushed 9b24afeb7c2f: Pushed 2edcec3590a4: Pushed 240421: digest: sha256:563888f63149e3959860264a1202ef9a644f44ed6c24d5c7392f9e2262bd3553 size: 1573
-
查看推送的镜像:
四、HTTPS 配置(可选)
4.1 创建目录
# 首先创建目录存放生成的证书
mkdir /home/cert
cd /home/cert/
注:默认情况下,Harbor 不附带证书。可以在没有安全性的情况下部署 Harbor,以便您可以通过 HTTP 连接到它。但是,只有在没有连接到外部 Internet 的气隙测试或开发环境中,才可以使用 HTTP。在非气隙环境中使用 HTTP 会使您面临中间人攻击。在生产环境中,请始终使用 HTTPS。
4.2 生成证书颁发机构证书
生成 CA 证书私钥。
openssl genrsa -out ca.key 4096
生成 CA 证书。(-subj 表示证书的组织。CN 后面的值改成 harbor 的 IP 地址或者域名。)
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.159.171" \
-key ca.key \
-out ca.crt
4.3 生成服务器证书
生成私钥
openssl genrsa -out server.key 4096
生成证书签名请求
- (调整选项中的值以反映您的组织。如果使用 FQDN 连接 Harbor 主机,则必须将其指定为公用名 () 属性,并在密钥和 CSR 文件名中使用它。
-subj``CN
)
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.159.171" \
-key server.key \
-out server.csr
4.4 生成 x509 v3 扩展文件
- 无论您是使用 FQDN 还是 IP 地址连接到 Harbor 主机,都必须创建此文件,以便可以为 Harbor 主机生成符合使用者备用名称 (SAN) 和 x509 v3 扩展要求的证书。替换条目以反映您的域。
IP 使用以下命令生成 x509 v3 扩展文件
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:192.168.159.171
EOF
或者是 域名 访问通过下面方式生成 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=yourdomain.harbor.com
EO
使用 CA 证书签发 Server 证书
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in server.csr \
-out server.crt
查看当前目录生成的文件
[root@12306 cert]# ll -ls
总用量 28
4 -rw-r--r--. 1 root root 2057 4月 21 04:58 ca.crt
4 -rw-------. 1 root root 3247 4月 21 04:57 ca.key
4 -rw-r--r--. 1 root root 41 4月 21 04:58 ca.srl
4 -rw-r--r--. 1 root root 2074 4月 21 04:58 server.crt
4 -rw-r--r--. 1 root root 1708 4月 21 04:58 server.csr
4 -rw-------. 1 root root 3243 4月 21 04:58 server.key
4 -rw-r--r--. 1 root root 207 4月 21 04:58 v3.ext
赋于 ca.key 与 server.key "644" 权限
# 指令
chmod 644 ca.key
chmod 644 server.key
4.5 为 Harbor 和 Docker 配置证书
将 server 证书和密钥复制到 Harbor 主机上的 /data/cert 目录中
mkdir -p /data/cert
cp server.crt /data/cert/
cp server.key /data/cert/
转换 server.crt 为 server.cert
# Docker 守护程序会认为 .crt 文件是 CA 证书,因此需要将 server 证书转换为 server.cert 文件
openssl x509 -inform PEM -in server.crt -out server.cert
将 server 证书,密钥和 CA 证书复制到 Harbor 主机上的 Docker 证书目录中
# 需要提前创建好 Docker 证书目录,如果使用 443 端口监听 HTTPS 请求,则目录为 IP/域名 即可,如果使用非 443 端口,则目录为 IP/域名:端口。
mkdir -p /etc/docker/certs.d/192.168.159.171:8443
cp server.cert /etc/docker/certs.d/192.168.159.171:8443
cp server.key /etc/docker/certs.d/192.168.159.171:8443
cp ca.crt /etc/docker/certs.d/192.168.159.171:8443
查看 Docker 证书目录文件
[root@12306 cert]# ll -ls /etc/docker/certs.d/192.168.159.171\:8443/
总用量 12
4 -rw-r--r--. 1 root root 2057 4月 21 05:09 ca.crt
4 -rw-r--r--. 1 root root 2074 4月 21 05:09 server.cert
4 -rw-r--r--. 1 root root 3243 4月 21 05:09 server.key
重启 Docker Engine
systemctl restart docker
4.6 重新部署 Harbor
- 修改 harbor.yml 配置文件,添加 HTTPS 相关配置,指定 HTTPS 的端口号和证书路径
4.7 使用 perpare 脚本生成 HTTPS 配置, 并重启 Harbor
使用 prepare 脚本为反向代理 Nginx 容器生成 HTTPS 配置。
./prepare
删除原有 Harbor 容器
# Harbor 原有的数据文件默认是挂载在宿主机的 /data 目录下,因此删除 Harbor 容器并不会丢失数据。
docker compose down -v
重新启动 Harbor
docker compose up -d
4.8 登录 HTTPS 页面
4.9 Docker 拉取和推送镜像
Docker 想要拉取或者推送 HTTPS 镜像仓库的镜像
# 需要在 Docker 证书目录中配置证书,这里的 Docker 客户端是另一台机器,首先在这台机器上创建目录
mkdir /etc/docker/certs.d/192.168.159.171:8443
从 Harbor 主机拷贝证书文件到 Docker 客户端上,需要 server 的证书和密钥以及 CA 证书
scp /home/cert/server.key [email protected]:/etc/docker/certs.d/192.168.159.171:8443
scp /home/cert/server.cert [email protected]:/etc/docker/certs.d/192.168.159.171:8443
scp /home/cert/ca.crt [email protected]:/etc/docker/certs.d/192.168.159.171:8443
注:拉取镜像 与 推送镜像 在 http 中一致
五、服务器重启之后,harbor运行报错
解决方式:进入 harbor 文件夹,重新在 "./install.sh" ,此时,docker的服务就好了。
注:在 第一次安装 harbor 之后,不可以删除 harbor文件夹中的东西,同时,重新 "./install.sh" 并不会丢失数据,只是删除镜像之后重新建立
标签:入门,harbor,server,Harbor,docker,root,Docker From: https://www.cnblogs.com/yike-318601898-/p/18150070