docker harbor-入门指南

一 、Harbor 介绍

1. 介绍

Harbor 是一个开源注册表,它使用策略和基于角色的访问控制来保护工件,确保图像被扫描且没有漏洞,并将图像签名为受信任。Harbor 是 CNCF 毕业项目,可提供合规性、性能和互操作性,帮助您跨云原生计算平台(如 Kubernetes 和 Docker)一致、安全地管理工件。

2. 官方文档

harbor 文档:港 (goharbor.io)

3. 下载安装包地址

harbor 的 tags 包:https://github.com/goharbor/harbor/tags

二、Harbor 整体架构

img

如上图所示是 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

查看解压的图片
img

3.3 修改配置文件

拷贝模板文件为 harbor.yml

cp harbor.yml.tmpl harbor.yml

编辑 harbor.yml 配置文件:

  • hostname 是 harbor 对外暴露的访问地址,修改为 域名 或者 harbor的IP
  • HTTP默认端口是 80;将其修改为对外暴露 8888 端口。
  • 这里暂时先不配置 HTTPS,将 HTTPS 相关内容注释。
    img

3.4 部署 Harbor

修改完配置文件后,只需要执行 install.sh 脚本即可安装 Harbor。

./install.sh

查看 Harbor 组件运行状况:

  • 输入 docker ps 或者 docker compose ps 指令,查看部署详情

img

3.5 登录页面

  • 浏览器输入 http://192.168.159.171:8888 访问 Harbor 页面,用户名和密码为 harbor.yml 配置文件中默认设置的 admin,Harbor12345。

img

  • 创建用户(带 "*" 必填)

img

  • 创建项目(带 "*" 必填,项目配额限制( -1 :表示不做限制) )
    img

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
    

img

  • 推送镜像到 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
    
    
  • 查看推送的镜像:

img

四、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 的端口号和证书路径

img

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 页面

img

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  root@192.168.159.172:/etc/docker/certs.d/192.168.159.171:8443
scp /home/cert/server.cert  root@192.168.159.172:/etc/docker/certs.d/192.168.159.171:8443
scp /home/cert/ca.crt  root@192.168.159.172:/etc/docker/certs.d/192.168.159.171:8443

注:拉取镜像 与 推送镜像 在 http 中一致

五、服务器重启之后,harbor运行报错

img

解决方式:进入 harbor 文件夹,重新在 "./install.sh" ,此时,docker的服务就好了。

注:在 第一次安装 harbor 之后,不可以删除 harbor文件夹中的东西,同时,重新 "./install.sh" 并不会丢失数据,只是删除镜像之后重新建立

posted @ 2024-04-22 10:01  yikes_ygr  阅读(10)  评论(0编辑  收藏  举报