基于Harbor的Docker私有镜像仓库搭建说明文档

基于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 的基本功能上添加了许多企业级的功能和特性,使其成为一个适用于企业的成熟私有镜像仓库解决方案。下面是你提到的一些功能:

  1. 用户身份验证和权限管理:Harbor 提供了用户认证和授权机制,可以集成企业的 LDAP 或其他身份验证系统,以确保只有授权的用户可以访问镜像仓库,并且根据角色进行权限管理。
  2. 镜像复制和同步:Harbor 允许在多个地理位置部署,可以通过镜像复制和同步功能在不同的 Harbor 实例之间同步镜像,以提高镜像的可用性和复用性。
  3. 项目和命名空间:Harbor 支持将镜像组织成项目和命名空间,从而更好地组织和管理镜像,使其更符合企业的需求。
  4. 审计日志和记录:Harbor 提供了审计日志功能,可以跟踪用户的操作并记录相关信息,以满足合规性和监管要求。
  5. 镜像签名和验证:Harbor 支持对镜像进行数字签名和验证,以确保镜像的完整性和来源可信。
  6. 集成 CI/CD 流水线:Harbor 可以与 CI/CD 工具集成,使得镜像的构建、测试和部署过程更加流畅。

Harbor 将 Docker Registry 基本的本地、私有镜像仓库功能与企业级需求相结合,为企业提供了一个可靠、安全、可扩展的私有镜像仓库解决方案,满足了在容器化环境中进行镜像管理和交付的各种需求。

Harbor的组件及其基本功能

Harbor分为多个组件,这些组件是使用docker compose部署的一系列docker容器。

image-20230824172718735

这些容器组件包括harbor-core,harbor-jobservice、nginx、harbor-ui(harbor-portal)、harbor-db、harbor-adminserver和harbor-log,它们分别有如下的功能

  1. Harbor Core(Core)

    • 作用:核心组件,负责处理用户界面、认证授权、仓库管理和事件通知等核心功能。
    • 功能:
      • 提供Web界面,供用户管理私有仓库、项目、镜像和用户帐户。
      • 管理身份验证和授权,支持LDAP、AD等多种身份验证方式。
      • 处理用户操作事件,如镜像推送、拉取、删除等,以及与其他组件的交互。
  2. Harbor UI(UI)

    • 作用:为用户提供图形化界面,使其能够更方便地管理和操作私有仓库。容器为harbor-portal。

    • 功能:

      • 提供直观的Web界面,允许用户浏览、搜索和管理项目和镜像。

      • 显示镜像元数据、标签、大小等信息,帮助用户选择合适的镜像版本。

        ui组件的底层为mysql实现的web服务器,下方为图形化界面登录界面:

        Harbor图形化界面
  3. 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"
        }
      
      1. 第一个挂载配置
        • "Source": "/root/harbor/common/config/registry":这是宿主机上的目录路径,用于存储Harbor Registry的配置文件。
        • "Destination": "/etc/registry":这是容器内的目录路径,用于存储Registry的配置文件。它将与宿主机上的目录相映射,以便容器可以访问这些配置。
        • "Mode": "z":指定挂载的模式,z 表示为宿主机和容器提供分离的文件系统视图。
        • "RW": true:表示该挂载是可读写的,容器可以读取和写入这些目录。
        • "Propagation": "rprivate":指定挂载的传播属性。
      2. 第二个挂载配置
        • "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 仓库相关的命令操作,包括管理镜像、项目、仓库、用户、权限等
  4. Harbor Log(Log)

    • 作用:收集和存储与Docker镜像相关的日志数据,用于监控和故障排除。

    • 功能:

      • 收集镜像操作、推送、拉取等事件的日志数据。

      • 存储日志数据,使管理员能够进行审计、监控和故障排除。

        以下为日志路径和汇总的日志文件

        [root@ harbor]# ls /var/log/harbor
        adminserver.log  jobservice.log  mysql.log  proxy.log  redis.log  registry.log  ui.log
        
  5. Harbor JobService(Job)

    • 作用:处理后台任务,如垃圾回收、复制镜像、扫描镜像漏洞等。
    • 功能:
      • 定期执行垃圾回收任务,清理不再使用的镜像层。
      • 支持复制镜像到其他Harbor实例,实现多实例之间的镜像同步。
      • 集成漏洞扫描工具,检测镜像中的漏洞并提供报告。
  6. Nginx(proxy)

    • 作用:负责流量转发和安全验证等。
    • 功能:
      • 将流量分发到后端的ui和正在docker镜像存储的docker registry。
      • 提供对外的https访问和80端口访问重定向到https,保证流量的安全性。
  7. 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的博客

摘自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镜像仓库

  1. 前期准备

    根据Harbor官方网站的文档,在为服务器安装Harbor时,需要检查服务器和环境是否满足以下配置:

    image-20230825100042463

    同时,由于需要支持ui的可视化访问需要开启服务器的443和80端口。由于需要从github上拉取官方镜像和安装docker和docker compose,可以使用处于海外的服务器以稳定地连接到外网。但也可以通过下载离线安装包后上传到服务器的方式安装这些组件。由于在编写文档时我对linux的文件系统不是特别熟悉,所以这里我选用了处于海外的服务器,并尝试直接通过url拉取镜像。在使用新的服务器时,需要使用ping命令确保服务器能够顺利连接到互联网。

  2. 安装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
    
  3. 安装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配置文件

  4. 安装Harbor发行版

    在https://github.com/goharbor/harbor/releases中下载Harbor发行版压缩文件

    image-20230825155604637

    上传至服务器

    image-20230825160603229

    此处由于阿里云服务器的上传大小限制为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
    
  5. 配置https访问或者忽略

    如果不需要https访问,那么使用以下命令,配置后将https部分注释掉

    cd harbor
    cp harbor.yml.tmpl harbor.yml
    vi harbor.yml
    

    img

    摘自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中资料

    img

    img

    注册新用户并调整权限

    img img

    为项目添加成员并更改用户角色

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    由于harbor的角色管理是基于自带的数据库容器实现的,所以,如果将企业自身的LDAP数据导入或者接入Harbor,便能够实现快速的角色管理。但是具体如何实现,我能力有限,这里没有做深入研究。

  • 镜像管理、复制和传输

    以下内容引用自CSDN

    首先在仓库管理中创建目标,如下:
    在这里插入图片描述
    点击新建目标,如下:
    在这里插入图片描述
    目标名: 指的是目标harbor的项目名称
    如上1.68.5.80是我搭建的另外一套harbor环境,使用的是http,所以未勾选“验证远程证书”
    点击测试连接检测有误问题,如下:
    在这里插入图片描述
    点击确定,如下:
    在这里插入图片描述
    在复制管理中创建复制规则,如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    此次测试选择触发模式为手动,如下:
    在这里插入图片描述
    点击复制,开始镜像的复制,如下:
    在这里插入图片描述
    在这里插入图片描述

    到目标节点查看复制的镜像,如下:
    在这里插入图片描述

  • springboot集成

    使用idea连接

    使用idea的docker插件,使用SSH连接远程服务器,ip为服务器的公网ip

    image-20230825171026105

    连接成功后,我们可以看到正在运行中的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远程无法连接,这里的项目具体测试无法进行,后续会遇到什么问题我也无从得知。

  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProjectMax

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值