首页 > 其他分享 >docker harbor-入门指南

docker harbor-入门指南

时间:2024-04-22 10:12:48浏览次数:29  
标签:入门 harbor server Harbor docker root Docker

一 、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  [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运行报错

img

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

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

标签:入门,harbor,server,Harbor,docker,root,Docker
From: https://www.cnblogs.com/yike-318601898-/p/18150070

相关文章

  • docker内安装软件
     安装nginx拉取镜像拉取镜像dockerpullnginx创建挂载目录mkdir-p/home/nginx/confmkdir-p/home/nginx/logmkdir-p/home/nginx/html生成容器dockerrun--namenginx-p9001:80-dnginx将容器nginx.conf文件复制到宿主机dockercpnginx:/etc/nginx/nginx.co......
  • Java入门
    Java入门helloworld新建一个文件夹,将要把写的代码放在里面打开文件夹,右键新建一个.txt,将后缀改为.java,为之命名。例如:Hello.java右键文件,选择用notepad++打开文件在notepad++编写代码publicclassHello{ publicstaticvoidmain(String[]args) { System.out......
  • MySql入门操作 3.0
    子查询:在查询列中设定特定信息,筛选要的特殊信息: 标量子查询:在内部的select中设定具体常量,通过常量进行筛选对应的列;具体格式不太好描述,如果对于上一章所使用的指令可以熟练应用那么这里应该也没啥问题,就是一个嵌套类比罢了下面直接给示例:相当于在要设定的条件中再使用一......
  • 储能行业入门
    过年回家,亲朋好友问起现在在做什么。答:储能。又问:储能是什么?沉思半晌,表达能力本就欠佳的我难以用几句话来概括。偶然进入储能行业工作半年,对其仍是不甚了解,遂决定继续在秋招时就停下的写博客的习惯,记录自己的工作总结和对行业、岗位的理解。一、储能释义打开chatgpt,问什么是......
  • (复习)树上启发式合并(dsu on tree)入门U41492树上数颜色
    主要思想是树的重轻儿子之分使得时间复杂度为o(nlogn),神奇欲深入了解的这里:https://oi-wiki.org/graph/dsu-on-tree/点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedefstructedge//边结构体{intto,next;}EDGE;//边相关数组EDGEe[100001<<1];......
  • 树状数组入门
    树状数组下标记得是从1开始,本节点id通过加lowbit可以访问到父节点的id,用于点修。本节点id减去lowbit则是查看左边第一个比自己高一级的节点id,比如7会查到6,6会查到4,这样子累加此三个的值就可以得到前七个的前缀和。inttreeArr[M]={0};//startfrom1intlowbit(intx){......
  • jfinal enjoy模板入门
    用途用于渲染需要多次重复的sql以及程序代码入门示例取自文件importcom.jfinal.template.Engine;importcom.jfinal.template.Template;importjava.util.HashMap;importjava.util.Map;publicclassEnjoyTemplateDemo{publicstaticvoidmain(String[]args)......
  • Kubernetes 入门、简介、架构、应用场景
    概述Kubernetes是一个开源的容器编排平台,它提供了一种方便管理和部署容器化应用程序的方式。下面是Kubernetes的入门、简介和架构。Kubernetes是一种用于自动部署、扩展和管理容器化应用程序的开源平台。它最初由Google开发,并在2014年开源发布,现已成为CNCF(CloudNativeCom......
  • kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ consumer实战
    1、上一节课我们学习了MQTTproducer生产者步骤,MQTTconsumer消费者步骤。该步骤可以从支持MRQTT协议的中间件获取数据,该步骤和kafkaconsumer一样可以处理实时数据交互,如下图所示: 2、双击步骤打开MQTTconsumer配置窗口,如下图所示:Stepname:自定义步骤名称。Transformat......
  • kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ producer 实战
    1、MQTT介绍MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,设计用于连接低带宽、高延迟或不可靠网络的设备。MQTT是基于发布/订阅模式(Publish/Subscribe)的协议,其中设备可以发布消息到一个主题(Topic),其他设备可以订阅这个主题以接收相关消息。这种模式......