基于Harbor的Docker私有镜像仓库搭建说明文档
Time:2023-8-24 Author:ProjectMax
Harbor提供了怎样的服务
我在先前自己的项目中就使用了docker作为部署的工具。Docker本身在地位区分上有两个镜像仓库,一个是处于云端,为用户提供上传、拉取和分享 Docker 镜像的公共镜像仓库Docker Hub。一般我安装类似jdk镜像、redis、mysql、rabbitmq等基础服务的镜像就是使用这个镜像仓库。这个镜像仓库也有多个组织在运营,docker官方、阿里巴巴等都能提供镜像源。另一个是当容器存储于本地是使用的Registry镜像仓库。它处于docker服务本机内,负责管理我们自己制作、下拉的镜像,支持镜像的上传、拉取和分享。我在自己的项目中就使用了整合mavan自动打包工具,一键将jar包自动上传至本地的docker镜像仓库中,再使用idea的docker-compose工具集成,完成项目的一键部署。
当然,光有这样的服务对于企业应用来说是不够的。在生产环境中,有较高的安全性、复杂的工程合作、复杂的角色组成、全程项目跟踪等等的要求,这些不是一般的Registry就能够满足的。于是Harbor提供了它的解决方案。
Harbor 实际上就是一个基于 Docker Registry 的增强版本它在 Docker Registry 的基本功能上添加了许多企业级的功能和特性,使其成为一个适用于企业的成熟私有镜像仓库解决方案。下面是你提到的一些功能:
- 用户身份验证和权限管理:Harbor 提供了用户认证和授权机制,可以集成企业的 LDAP 或其他身份验证系统,以确保只有授权的用户可以访问镜像仓库,并且根据角色进行权限管理。
- 镜像复制和同步:Harbor 允许在多个地理位置部署,可以通过镜像复制和同步功能在不同的 Harbor 实例之间同步镜像,以提高镜像的可用性和复用性。
- 项目和命名空间:Harbor 支持将镜像组织成项目和命名空间,从而更好地组织和管理镜像,使其更符合企业的需求。
- 审计日志和记录:Harbor 提供了审计日志功能,可以跟踪用户的操作并记录相关信息,以满足合规性和监管要求。
- 镜像签名和验证:Harbor 支持对镜像进行数字签名和验证,以确保镜像的完整性和来源可信。
- 集成 CI/CD 流水线:Harbor 可以与 CI/CD 工具集成,使得镜像的构建、测试和部署过程更加流畅。
Harbor 将 Docker Registry 基本的本地、私有镜像仓库功能与企业级需求相结合,为企业提供了一个可靠、安全、可扩展的私有镜像仓库解决方案,满足了在容器化环境中进行镜像管理和交付的各种需求。
Harbor的组件及其基本功能
Harbor分为多个组件,这些组件是使用docker compose部署的一系列docker容器。
这些容器组件包括harbor-core,harbor-jobservice、nginx、harbor-ui(harbor-portal)、harbor-db、harbor-adminserver和harbor-log,它们分别有如下的功能
-
Harbor Core(Core):
- 作用:核心组件,负责处理用户界面、认证授权、仓库管理和事件通知等核心功能。
- 功能:
- 提供Web界面,供用户管理私有仓库、项目、镜像和用户帐户。
- 管理身份验证和授权,支持LDAP、AD等多种身份验证方式。
- 处理用户操作事件,如镜像推送、拉取、删除等,以及与其他组件的交互。
-
Harbor UI(UI):
-
作用:为用户提供图形化界面,使其能够更方便地管理和操作私有仓库。容器为harbor-portal。
-
功能:
-
提供直观的Web界面,允许用户浏览、搜索和管理项目和镜像。
-
显示镜像元数据、标签、大小等信息,帮助用户选择合适的镜像版本。
ui组件的底层为mysql实现的web服务器,下方为图形化界面登录界面:
-
-
-
Harbor Registry(Registry):
-
作用:这是Registry官方的镜像,是实际存储Docker镜像的组件,类似于Docker Hub。它管理上传的镜像、存储和分发镜像。
主要挂载两个目录,一个镜像的存储路径,另一个是配置文件目录。以下是挂载路径配置
{ "Source": "/root/harbor/common/config/registry", "Destination": "/etc/registry", "Mode": "z", "RW": true, "Propagation": "rprivate" }, { "Source": "/data/registry", "Destination": "/storage", "Mode": "z", "RW": true, "Propagation": "rprivate" }
- 第一个挂载配置:
"Source": "/root/harbor/common/config/registry"
:这是宿主机上的目录路径,用于存储Harbor Registry的配置文件。"Destination": "/etc/registry"
:这是容器内的目录路径,用于存储Registry的配置文件。它将与宿主机上的目录相映射,以便容器可以访问这些配置。"Mode": "z"
:指定挂载的模式,z
表示为宿主机和容器提供分离的文件系统视图。"RW": true
:表示该挂载是可读写的,容器可以读取和写入这些目录。"Propagation": "rprivate"
:指定挂载的传播属性。
- 第二个挂载配置:
"Source": "/data/registry"
:这是宿主机上的目录路径,用于存储Harbor Registry的镜像层和数据。"Destination": "/storage"
:这是容器内的目录路径,用于存储Registry的镜像层和数据。它将与宿主机上的目录相映射,以便容器可以访问这些数据。"Mode": "z"
、"RW": true
、"Propagation": "rprivate"
:同样用于指定挂载的模式、读写属性和传播属性。
以下是配置文件示例:
version: 0.1 # 配置日志 log: level: debug fields: service: registry # 配置存储 storage: cache: layerinfo: inmemory filesystem: rootdirectory: /storage maintenance: uploadpurging: enabled: false delete: enabled: true # 配置HTTP监听 http: addr: :5000 secret: placeholder # 这里需要配置实际的密钥 debug: addr: localhost:5001 # 配置认证 auth: token: issuer: harbor-token-issuer realm: https://reg.ennew.com/service/token rootcertbundle: /etc/registry/root.crt service: harbor-registry # 配置通知 notifications: endpoints: - name: harbor disabled: false url: http://ui/service/notifications timeout: 3000ms threshold: 5 backoff: 1s
- 第一个挂载配置:
-
功能:
- 接受镜像上传,并将镜像存储在指定的存储后端,如本地文件系统、S3、阿里云OSS等。
- 管理镜像的标签、元数据和存储位置,支持高效的镜像层共享。
- 包括一个
registryctl
容器。 是 Harbor 镜像仓库的一个命令行工具,可以在命令行界面下执行各种与 Harbor 仓库相关的命令操作,包括管理镜像、项目、仓库、用户、权限等
-
-
Harbor Log(Log):
-
作用:收集和存储与Docker镜像相关的日志数据,用于监控和故障排除。
-
功能:
-
收集镜像操作、推送、拉取等事件的日志数据。
-
存储日志数据,使管理员能够进行审计、监控和故障排除。
以下为日志路径和汇总的日志文件
[root@ harbor]# ls /var/log/harbor adminserver.log jobservice.log mysql.log proxy.log redis.log registry.log ui.log
-
-
-
Harbor JobService(Job):
- 作用:处理后台任务,如垃圾回收、复制镜像、扫描镜像漏洞等。
- 功能:
- 定期执行垃圾回收任务,清理不再使用的镜像层。
- 支持复制镜像到其他Harbor实例,实现多实例之间的镜像同步。
- 集成漏洞扫描工具,检测镜像中的漏洞并提供报告。
-
Nginx(proxy):
- 作用:负责流量转发和安全验证等。
- 功能:
- 将流量分发到后端的ui和正在docker镜像存储的docker registry。
- 提供对外的https访问和80端口访问重定向到https,保证流量的安全性。
-
Harbor Database(DB):
-
作用:存储Harbor的配置数据、用户信息、项目信息等持久化数据。
-
功能:
-
存储用户帐户、项目、镜像的元数据。
-
提供数据持久化和恢复能力,确保数据的安全性和可靠性。
DB默认使用的是PostgreSQL数据库,以下是这个数据库中的表
show tables; +--------------------+ | Tables_in_registry | +--------------------+ | access | | access_log | | alembic_version | | project | | project_member | | properties | | replication_job | | replication_policy | | replication_target | | repository | | role | | user | +--------------------+
-
以上这些组件的组织方式如下图:
-
摘自csdn@柳清风09的描述
proxy,他是一个nginx前端代理,主要是分发前端页面ui访问和镜像上传和下载流量,上图中通过深蓝色先标识;
ui,提供了一个web管理页面,当然还包括了一个前端页面和后端API,底层使用mysql数据库;
registry,镜像仓库,负责存储镜像文件,当镜像上传完毕后通过hook通知ui创建repository,上图通过红色线标识,当然registry的token认证也是通过ui组件完成;
adminserver,是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置,通过灰色线标识;
jobsevice,是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log,上图通过紫色线标识;
log,是日志汇总组件,通过docker的log-driver把日志汇总到一起,通过浅蓝色线条标识
————————————————
版权声明:本文为CSDN博主「柳清风09」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010278923/article/details/77941995
如何搭建一个Harbor镜像仓库
-
前期准备
根据Harbor官方网站的文档,在为服务器安装Harbor时,需要检查服务器和环境是否满足以下配置:
同时,由于需要支持ui的可视化访问需要开启服务器的443和80端口。由于需要从github上拉取官方镜像和安装docker和docker compose,可以使用处于海外的服务器以稳定地连接到外网。但也可以通过下载离线安装包后上传到服务器的方式安装这些组件。由于在编写文档时我对linux的文件系统不是特别熟悉,所以这里我选用了处于海外的服务器,并尝试直接通过url拉取镜像。在使用新的服务器时,需要使用ping命令确保服务器能够顺利连接到互联网。
-
安装Docker
我使用的系统为阿里云的配置的Linux,先前使用CentOS 7.6 时一直无法连接上网络。以下为在此系统中,使用官方url进行安装的步骤
更新yum到最新版本
sudo yum update
安装需要的安装包yum-utils
yum install -y yum-utils
设置docker镜像仓库地址
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo ##此地址为官方的仓库地址,在国内建议不要用
安装docker
yum install docker-ce docker-ce-cli containerd.io
检查docker是否安装完成
[root@iZj6c3he0a3rk9ffh3gsdfZ ~]#systemctl start docker ##启动docker [root@iZj6c3he0a3rk9ffh3gsdfZ ~]# docker version Client: Docker Engine - Community ##此时docker已经安装成功了 Version: 24.0.5 API version: 1.43 Go version: go1.20.6 Git commit: ced0996 Built: Fri Jul 21 20:36:32 2023 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 24.0.5 API version: 1.43 (minimum version 1.12) Go version: go1.20.6 Git commit: a61e2b4 Built: Fri Jul 21 20:35:32 2023 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.22 GitCommit: 8165feabfdfe38c65b599c4993d227328c231fca runc: Version: 1.1.8 GitCommit: v1.1.8-0-g82f18fe docker-init: Version: 0.19.0 GitCommit: de40ad0
-
安装Docker-Compose
由于Harbor是基于docker compose部署的一系列容器,所以在安装之前,首先要在环境中配置docker compose。
使用github中的二进制文件安装
$ sudo curl -L https://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
以下为Harbor的dockercompose配置文件
-
安装Harbor发行版
在https://github.com/goharbor/harbor/releases中下载Harbor发行版压缩文件
上传至服务器
此处由于阿里云服务器的上传大小限制为500Mb,我无法上传,于是我直接使用下载命令
curl -LO https://github.com/goharbor/harbor/releases/download/v2.8.4/harbor-offline-installer-v2.8.4.tgz
解压离线安装包
tar -zxvf harbor-offline-installer-v2.8.4.tgz
-
配置https访问或者忽略
如果不需要https访问,那么使用以下命令,配置后将https部分注释掉
cd harbor cp harbor.yml.tmpl harbor.yml vi harbor.yml
摘自csdn博客@Xd聊架构 的文章图片
如果要配置https访问,那么首先要生成证书和密钥
有多种获得ssl证书的途径,这里我选择使用openssl生成自签名证书,它的命令为:需要手动先创建路径和文件
openssl req -x509 -newkey rsa:4096 -keyout /harbor/ssl/mykey.key -out /harbor/ssl/mycrt.crt -days 365
编辑配置文件,指定证书和密钥文件后,开始安装(这里要先进入harbor路径下)
./install.sh
以下为安装成功的部分输出
当我使用80端口尝试连接的时候,发现无法连接,报错502。于是我首先使用idea的docker插件连接了虚拟机,然后在内部发现容器中的代理部分没有启动,导致请求无法被代理转发
最后我没有时间解决了,于是删除了关于ssl的配置,重新安装了harbor服务,所有容器成功启动。
我尝试在我的浏览器访问主机的harbor管理界面,结果一直没有响应、超时。但是我在本机访问时,已经成功返回了html,这说明整个服务已经成功运行,以下是控制台的输出:
curl http://localhost:5000 <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>Harbor</title> <base href="/"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <link rel="icon" type="image/x-icon" href="favicon.ico?v=2"/> <link rel="stylesheet" href="styles.878b6852c9b5f5ec.css"></head> <body> <harbor-app> <div class="spinner spinner-lg app-loading app-loading-fixed"> Loading... </div> </harbor-app> <script src="runtime.af360c985dadaace.js" type="module"></script><script src="polyfills.b51e06395e4620c9.js" type="module"></script><script src="scripts.67f785a8ff0b6aed.js" defer></script><script src="main.b498c1bb7f43481c.js" type="module"></script></body>
如何使用Harbor镜像仓库
-
项目、角色管理LDAP
使用harbor提供的图形化界面完成项目创建,角色创建和项目角色管理。
由于我不熟悉服务器,所以没有调出来远程访问。以下演示图片来自CSDN中资料
注册新用户并调整权限
为项目添加成员并更改用户角色
由于harbor的角色管理是基于自带的数据库容器实现的,所以,如果将企业自身的LDAP数据导入或者接入Harbor,便能够实现快速的角色管理。但是具体如何实现,我能力有限,这里没有做深入研究。
-
镜像管理、复制和传输
以下内容引用自CSDN
首先在仓库管理中创建目标,如下:
点击新建目标,如下:
目标名: 指的是目标harbor的项目名称
如上1.68.5.80是我搭建的另外一套harbor环境,使用的是http,所以未勾选“验证远程证书”
点击测试连接检测有误问题,如下:
点击确定,如下:
在复制管理中创建复制规则,如下:
此次测试选择触发模式为手动,如下:
点击复制,开始镜像的复制,如下:
到目标节点查看复制的镜像,如下:
-
springboot集成
使用idea连接
使用idea的docker插件,使用SSH连接远程服务器,ip为服务器的公网ip
连接成功后,我们可以看到正在运行中的harbor容器,以及docker内部的容器
在springboot的依赖中添加docker插件
以下为我的项目中使用单纯的docker的插件
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <imageName>covidtest_cloud_gateway</imageName> <imageTags> <imageTag>latest</imageTag> </imageTags> <dockerDirectory>${project.basedir}</dockerDirectory> <dockerHost>http://localhost:2375</dockerHost> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
以下为使用Harbor时配置的内容(参考的资料)
<properties> <java.version>1.8</java.version> <docker.image.prefix>test</docker.image.prefix> <spring-boot.version>2.7.9</spring-boot.version> <docker.registry>172.20.98.39</docker.registry> <docker.plugin.version>0.32.0</docker.plugin.version> <docker.username>admin</docker.username> <docker.password>123456</docker.password> <docker.namespace>library</docker.namespace> <docker.host>http://172.20.98.39:2375</docker.host> </properties> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>${docker.plugin.version}</version> <configuration> <dockerHost>${docker.host}</dockerHost> <registry>${docker.registry}</registry> <authConfig> <push> <username>${docker.username}</username> <password>${docker.password}</password> </push> </authConfig> <images> <image> <name>${docker.registry}/${docker.namespace}/${project.name}:${project.version}</name> <build> <dockerFile>${project.basedir}/Dockerfile</dockerFile> </build> </image> </images> </configuration> </plugin>
可见,两者的配置基本要素都是相似的,都有docker的地址,打包动作的配置、dockerfile的指定等。
只不过使用harbor时需要额外指定redistry的地址,也就是harbor仓库的地址以及使用的角色、密码。这样才能够在推送时将镜像交给harbor管理。
编写dockerfile
以下为我项目中的dockerfile作为示例
FROM openjdk:8-jdk-slim
VOLUME /tmp
EXPOSE 8080
ADD ./target/Covidtest-0.0.1-SNAPSHOT.jar covidtest.jar
ENTRYPOINT ["sh","-c","java -jar covidtest.jar"]
当完成了以上配置后,就可以利用maven实现一键打包、镜像制作、镜像上传到Harbor中了
但是由于我的harbor远程无法连接,这里的项目具体测试无法进行,后续会遇到什么问题我也无从得知。
age>
可见,两者的配置基本要素都是相似的,都有docker的地址,打包动作的配置、dockerfile的指定等。
只不过使用harbor时需要额外指定redistry的地址,也就是harbor仓库的地址以及使用的角色、密码。这样才能够在推送时将镜像交给harbor管理。
**编写dockerfile**
以下为我项目中的dockerfile作为示例
```dockerfile
FROM openjdk:8-jdk-slim
VOLUME /tmp
EXPOSE 8080
ADD ./target/Covidtest-0.0.1-SNAPSHOT.jar covidtest.jar
ENTRYPOINT ["sh","-c","java -jar covidtest.jar"]
当完成了以上配置后,就可以利用maven实现一键打包、镜像制作、镜像上传到Harbor中了
[外链图片转存中…(img-E588MH1P-1703423013560)]
但是由于我的harbor远程无法连接,这里的项目具体测试无法进行,后续会遇到什么问题我也无从得知。