在之前的文章中我们已经为大家介绍了docker registry v2私有镜像仓库,在实际的企业级生产环境中实际上很少会直接使用docker registry v2,而是使用Harbor。Harbor基于docker registry v2的基础上为用户提供了图形管理界面,同时支持多角色多用户的镜像访问权限管理,以及国际化的语言支撑(包括中文)。总之,Harbor面向用户更加友好,适用于多团队、多项目组情况下的镜像管理工作!

一、安装的准备工作

第一步:前置条件,已经正确安装docker、docker-compose。

第二步:下载harbor离线安装包,可选版本在github-https://github.com/goharbor/harbor/releases,我下载的是v2.5.0离线安装版本。

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

第三步: 在压缩包所在目录(最好单独建一个目录)解压压缩包

tar xzvf ./harbor-offline-installer-v2.5.0.tgz

解压之后的目录是harbor(后面所有的操作都在这个目录下进行),目录内的内容如下

# cd harbor   
# ls -ltr
总用量 647720
-rwxr-xr-x. 1 root root      1881 47 15:52 prepare
-rw-r--r--. 1 root root     11347 47 15:52 LICENSE
-rwxr-xr-x. 1 root root      2500 47 15:52 install.sh
-rw-r--r--. 1 root root      9917 47 15:52 harbor.yml.tmpl
-rw-r--r--. 1 root root      3361 47 15:52 common.sh
-rw-r--r--. 1 root root 663227387 47 15:52 harbor.v2.5.0.tar.gz

第四步: 新建一个目录,用于存放harbor持久化数据,包括Registry镜像、管理数据数据库文件等。这个目录在后文中会用到。

mkdir -p /root/data/harbor

第五步::防火墙开放端口5000,harbor默认端口是80(这个通常需要修改),我自定义为5000。

二、生成服务端及客户端证书

证书用于docker CLI客户端与Harbor服务端进行通信。Harbor服务端安装需要使用域名,如果没有域名,我们在/etc/hosts里面配置一个ip和域名的解析关系即可,如:harbor.zimug.cn。毕竟在局域网内我们自己使用。

你的服务器IP地址  harbor.zimug.cn

使用域名生成CA证书,会提示输入信息:Country Name填CN,Common Name填域名。

openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt

生成服务端证书签名请求,会提示输入信息:Country Name填CN,Common Name填域名。

openssl req -newkey rsa:4096 -nodes -sha256 -keyout harbor.zimug.cn.key -out harbor.zimug.cn.csr

生成服务端证书

openssl x509 -req -days 365 -in harbor.zimug.cn.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.zimug.cn.crt

我的工作目录是/root/images/harbor/harbor,最终生成的文件如下

/root/images/harbor/harbor/ca.key   #CA私有证书
/root/images/harbor/harbor/ca.crt   #CA证书
/root/images/harbor/harbor/harbor.zimug.cn.key   #服务器私有证书
/root/images/harbor/harbor/harbor.zimug.cn.csr   #服务器证书请求文件
/root/images/harbor/harbor/ca.srl   #无用
/root/images/harbor/harbor/harbor.zimug.cn.crt  #服务器证书

三、修改harbor配置文件

harbor的配置文件里面有很多的配置内容,

# cp ./harbor.yml.tmpl   ./harbor.yml;  #复制模板文件为正式的配置文件

harbor.yml配置文件,下文中被我添加中文注释的部分,是通常必须要修改的参数。其他的参数根据自己的需要修改:

# harbor安装的ip地址或域名,用于访问harbor 管理界面和registry仓库服务。
# 不能设置为 localhost or 127.0.0.1,因为Harbor需要被外部客户端访问
hostname: 你的服务器IP地址

# http 相关的配置
http:
  # http端口, 默认是80. 如果启用了https,访问这个端口将被转发请求到https 端口
  # 这里尽量不要改,找一台80端口没被占用的服务器安装harbor,后续镜像上传打标签更加方便不用加端口(http服务默认就是80)
  port: 80

# https 相关的配置
https:
  # https port for harbor, default is 443
  port: 443
  # 配置服务端证书
  certificate: /root/images/harbor/harbor/harbor.zimug.cn.crt
  private_key: /root/images/harbor/harbor/harbor.zimug.cn.key

# # Uncomment following will enable tls communication between all harbor components
# internal_tls:
#   # set enabled to true means internal tls is enabled
#   enabled: true
#   # put your cert and key files on dir
#   dir: /etc/harbor/tls/internal

# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
# external_url: https://reg.mydomain.com:8433

# Harbor admin 管理员初始化密码
# 它仅仅用于第一次安装harbor初始化登录使用
# Harbor启动之后进入管理节面之后记得通过UI修改密码
harbor_admin_password: Harbor12345

# 安装数据库的配置
database:
  # 数据库的root用户密码,用于生产环境必须修改为强度高的密码
  password: root123
  # The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
  max_idle_conns: 100
  # The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
  # Note: the default number of connections is 1024 for postgres of harbor.
  max_open_conns: 900

# harbor持久化数据保存目录,上文中新建的目录
data_volume: /root/data/harbor


# ……
# 后面省略了若干配置参数

四、执行安装脚本

执行install.shshell脚本,完成docker Harbor的安装。下面是整个脚本的执行过程的日志输出,我们来分析下harbor的安装过程都做了什么?

# ./install.sh 

[Step 0]: checking if docker is installed ...
Note: docker version: 20.10.14
[Step 1]: checking docker-compose is installed ...
Note: docker-compose version: 1.29.2

Step 0:检查docker是否安装,Step 1检查docker-compose是否安装。(我的主机既安装docker compose的1.x版本,也安装了docker compose的v2版本,但是我们看到1.x版本的被识别出来了)

[Step 2]: loading Harbor images ...
Loaded image: goharbor/harbor-core:v2.5.0
Loaded image: goharbor/harbor-jobservice:v2.5.0
Loaded image: goharbor/notary-signer-photon:v2.5.0
Loaded image: goharbor/harbor-db:v2.5.0
Loaded image: goharbor/harbor-registryctl:v2.5.0
Loaded image: goharbor/redis-photon:v2.5.0
Loaded image: goharbor/harbor-portal:v2.5.0
Loaded image: goharbor/trivy-adapter-photon:v2.5.0
Loaded image: goharbor/nginx-photon:v2.5.0
Loaded image: goharbor/registry-photon:v2.5.0
Loaded image: goharbor/notary-server-photon:v2.5.0
Loaded image: goharbor/chartmuseum-photon:v2.5.0
Loaded image: goharbor/prepare:v2.5.0
Loaded image: goharbor/harbor-log:v2.5.0
Loaded image: goharbor/harbor-exporter:v2.5.0

[Step 3]: preparing environment ...

第2、3步骤下载了n多的镜像(上文中我删除了大量的镜像分层下载的日志),这些镜像都是harbor的组件,整体组成了harbar,如果手工搭建工作量还是很大的,还好我们有docker compose。

[Step 4]: preparing harbor configs ...
prepare base dir is set to /root/images/harbor/harbor
Generated configuration file: /config/portal/nginx.conf
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/log/rsyslog_docker.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/registryctl/config.yml
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
Generated and saved secret to file: /data/secret/keys/secretkey
Successfully called func: create_root_cert
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir

第四步,重要了!/root/images/harbor是我安装包解压的目录,即安装目录。所有的配置文件都生成到了安装目录下/root/images/harbor/barbor,如上文所示。

[Step 5]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating redis         ... done
Creating registryctl   ... done
Creating harbor-db     ... done
Creating registry      ... done
Creating harbor-portal ... done
Creating harbor-core   ... done
Creating nginx             ... done
Creating harbor-jobservice ... done
✔ ----Harbor has been installed and started successfully.----

第5步,启动了9个容器。

  • harbor-portal:在比较旧的版本叫做admin server,harbor应用的门户即:前端web服务应用界面。本质也是nginx,用于部署前端应用。
  • harbor-core:这是Harbor的核心后端服务,主要token的发放与验证、webhook等服务及部分tpl UI界面。
  • harbor-db:harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。
  • harbor-jobservice:harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了实现镜像在仓库之间同步;
  • harbor-log:harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。
  • nginx:充当逆向代理服务网关的功能,负责流量转发和安全验证。
  • redis:缓存、session等
  • registry:registry就是docker原生的仓库,负责保存docker镜像。
  • registryctl:harbor与registry交互控制服务

五、浏览器访问测试

浏览器访问测试,80端口是http默认端口,所以不需要加。

http://你的服务器ip地址

尝试用一下吧。我们可以创建一个用户叫做zimug,按照提示信息填写即可。主要是用户名密码
在这里插入图片描述

六、docker客户端测试

测试完浏览器,我们再用docker客户端登陆一下试试。

# docker login harbor.zimug.cn
Username: admin
Password: 
Error response from daemon: Get "https://harbor.zimug.cn/v2/": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0

报错了因为我们没有配置客户端证书,直接使用CA证书即可。

mkdir -p /etc/docker/certs.d/harbor.zimug.cn;
cp ./ca.crt /etc/docker/certs.d/harbor.zimug.cn/ca.crt;

vim /etc/docker/daemon.json,修改或加上下面的一行

{
"insecure-registries":["harbor.zimug.cn"]
}

加载配置重新启动docker守护进程

systemctl daemon-reload && systemctl restart docker

重启docker守护进程,会导致docker compose启动的容器全部重启,因为启动顺序的原因可能会导致失败。可以用docker compose先都停掉,再启动harbor

docker-compose stop
docker-compose start

再次登录测试

# docker login harbor.zimug.cn
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/#credentials-store

Login Succeeded

七、向Harbor推送镜像

首先在harbor新建一个项目
在这里插入图片描述

# 从docker hub下载一个镜像
docker pull busybox;
# 为镜像打一个私有仓库的标签,格式为:仓库服务地址/项目名称/镜像名称:[TAG],TAG可以不写默认就是latest。
docker tag busybox harbor.zimug.cn/test/busybox ;
# 推送镜像到harbor仓库
docker push harbor.zimug.cn/test/busybox;

通过harbor管理界面查看一下,如下图所示推送成功。
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐