Harbor 是一个基于 Apache 协议的开源软件,主要开发语言为 Go。Harbor 是由 VMware 公司开源的企业级的Docker Registry 管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能,具有 web 管理功能。

Docker 容器应用的开发和运行离不开可靠的镜像管理,虽然 Docker 官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的 Registry 也是非常必要的。

Harbor 的所有服务组件都是在 Docker 中部署的,所以官方安装使用 Docker-compose 快速部署,所以需要安装Docker、Docker-compose。由于 Harbor 是基于 Docker Registry V2 版本,所以就要求 Docker 版本不小于 1.10.0,Docker-compose 版本不小于 1.6.0。

Harbor GitHub: https://github.com/goharbor/harbor

本文以 Harbor v2.5.2 为例,演示 CentOS 7.9 下安装和运行 Harbor,步骤如下。

1. 安装 Docker

  

2. 安装 Docker-compose


3. 安装 Harbor

    1) 下载安装包

        $ cd ~/apps
        $ wget https://github.com/goharbor/harbor/releases/download/v2.5.2/harbor-online-installer-v2.5.2.tgz
        $ tar -zxf harbor-online-installer-v2.5.2.tgz

        解压后生成 ~/apps/harbor 目录,目录结构如下:

            harbor
              |- common.sh
              |- harbor.yml.tmpl
              |- docker-compose.yml
              |- install.sh
              |- LICENSE
              |- prepare

    2) 修改 harbor.yml

        修改 hostname 为主机 IP,本文安装的测试 Harbor 使用 http,注释掉 https 部分。

        $ cd ~/apps/harbor
        $ cp harbor.yml.tmpl harbor.yml
        $ vim harbor.yml    # 或 vi harbor.yml

hostname: 192.168.0.10

            ...

            # https related config
            #https:
            # https port for harbor, default is 443
            #  port: 443
            # The path of cert and key files for nginx
            #  certificate: /your/certificate/path
            #  private_key: /your/private/key/path

            ...

    3) 安装运行

        $ ./install.sh

[Step 0]: checking if docker is installed ...

            Note: docker version: 20.10.7

            [Step 1]: checking docker-compose is installed ...

            Note: docker-compose version: 2.6.1

            [Step 2]: preparing environment ...

            [Step 3]: preparing harbor configs ...
            prepare base dir is set to /home/xxx/apps/harbor
            WARNING:root:WARNING: HTTP protocol is insecure. Harbor will deprecate http protocol in the future. Please make sure to upgrade to https
            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
            loaded secret from file: /data/secret/keys/secretkey
            Generated configuration file: /compose_location/docker-compose.yml
            [+] Running 7/7put dir
            ⠿ jobservice Pulled                                         310.7s
            ⠿ 799908ee0f14 Already exists                               0.0s
            ⠿ 0659cdd20fa6 Pull complete                                5.3s
            ⠿ c6244b59a52b Pull complete                                5.4s
            ⠿ dba965b8fb89 Pull complete                                5.5s
            ⠿ 48d3b32aaf78 Pull complete                                22.1s
            ⠿ d28670add125 Pull complete                                306.1s
            [+] Running 10/10 Pull complete                             5.3s
            ⠿ Network harbor_harbor        Created                      0.0s
            ⠿ Container harbor-log         Started                      0.6s
            ⠿ Container redis              Started                      1.1s
            ⠿ Container registryctl        Started                      1.2s
            ⠿ Container harbor-db          Started                      1.5s
            ⠿ Container harbor-portal      Started                      1.5s
            ⠿ Container registry           Started                      1.4s
            ⠿ Container harbor-core        Started                      1.8s
            ⠿ Container nginx              Started                      2.5s
            ⠿ Container harbor-jobservice  Started                      2.5s
            ✔ ----Harbor has been installed and started successfully.----

        $ docker-compose -f docker-compose.yml ps   # 查看镜像运行情况

NAME                COMMAND                  SERVICE             STATUS              PORTS
            harbor-core         "/harbor/entrypoint.…"   core                running (healthy)
            harbor-db           "/docker-entrypoint.…"   postgresql          running (healthy)
            harbor-jobservice   "/harbor/entrypoint.…"   jobservice          running (healthy)
            harbor-log          "/bin/sh -c /usr/loc…"   log                 running (healthy)   127.0.0.1:1514->10514/tcp
            harbor-portal       "nginx -g 'daemon of…"   portal              running (healthy)
            nginx               "nginx -g 'daemon of…"   proxy               running (healthy)   0.0.0.0:80->8080/tcp, :::80->8080/tcp
            redis               "redis-server /etc/r…"   redis               running (healthy)
            registry            "/home/harbor/entryp…"   registry            running (healthy)
            registryctl         "/home/harbor/start.…"   registryctl         running (healthy)

        启动完成后,访问 harbor.yml 里设置的 hostname 即可,默认是 80 端口,如果端口占用,可以去修改 docker-compose.yml 文件,对应服务的端口映射。   

        这里访问 https://192.168.0.10,显示 Harbor 的 Web 管理页面,默认管理账户为 admin,密码为 Harbor12345,该密码的初始配置在 harbor.yml 文件里。

    4) 配置 LDAP 认证模式 (可选项)
    
        LDAP(Lightweight Directory Access Protocol)即轻量级目录访问协议,它是一种应用协议,用于在 IP 网络上访问和维护分布式目录的信息服务。

        LDAP 目录服务器是基于客户端/服务器模式的,LDAP 服务器包含目录数据,客户端连接到服务器后发送请求,在服务器上获取目录数据,从而实现全局目录数据管理。

        要使用 LDAP 认证模式,需要先安装 LDAP 目录服务器,一般使用 OpenLDAP (https://openldap.org/)。

    5) 创建 https 证书 (可选项)

        如果需要使用 https,使用如下方式创建 https 证书,再恢复并修改 harbor.yml 里的 https 部分。

        $ cd ~/apps/harbor
        $ mkdir certs

        $ openssl genrsa -out ca.key 2048
        $ openssl req -x509 -new -nodes -key ca.key -subj "/CN=yourdns.com" -days 365 -out ca.crt
        $ openssl genrsa -out server.key 2048
        $ openssl req -new -nodes -key server.key -subj "/CN=yourdns.com" -out server.csr
        $ echo subjectAltName = IP:192.168.0.10 > extfile.cnf
        $ openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out server.crt -days 365

4. Harbor 仓库使用

    1) 创建项目

        访问 https://192.168.0.10,显示 Harbor 的 Web 管理页面,默认管理账户为 admin,密码为 Harbor12345,该密码的初始配置在 harbor.yml 文件里。

        项目 -> 新建项目 -> 在 “新建项目” 对话框输入如下内容:

            项目名称:testprj
            访问级别:公开 (测试项目选择公开)
            存储容量:-1 GB (不限容量)
            镜像代理:无
        
        -> 点击 “确定”

    2) 定制镜像

        下面以定制一个 nginx 镜像为例
       
            $ sudo docker pull nginx

        给 nginx 镜像打标签

            $ sudo docker tag nginx 192.168.0.10/testprj/nginx:local_v1

        查看镜像列表

            $ sudo docker images

REPOSITORY                  TAG        IMAGE ID       CREATED          SIZE
            192.168.0.10/testprj/nginx  local_v1   2b7d6430f78d   50 seconds ago   142MB
            nginx                       latest     2b7d6430f78d   5 days ago       142MB
            ...

    3) 登录 Harbor

        使用 docker login 命令登录

            $ sudo docker login 192.168.0.10

Username: admin
                Password: Harbor12345

                Error response from daemon: Get https://192.168.0.10/v2/: dial tcp 192.168.0.10:443: connect: connection refused

        注:docker 找不到新建的本地 Harbor 仓库,可以修改 /etc/docker/daemon.json 文件,把 “192.168.0.10” 添加到 "insecure-registries"。

            $ sudo vi /etc/docker/daemon.json

{
                    "registry-mirrors":[
                        "https://docker.mirrors.ustc.edu.cn/",
                        "https://hub-mirror.c.163.com/",
                        "https://reg-mirror.qiniu.com"
                    ],
                    "insecure-registries":[
                        "192.168.0.10"
                    ]
                }

        重启 Docker 服务

            # sudo systemctl daemon-reload
            # sudo systemctl restart docker        

        再次进行登录

            $ sudo docker login 192.168.0.10

Username: admin
                Password: Harbor12345
                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

        注:如果还是无法登录,重启 CentOS 系统,或重新执行 Harbor 的安装命令 ./install.sh
           
    4) 提交定制镜像到本地 Harbor 仓库

        $ sudo docker push 192.168.0.10/testprj/nginx:local_v1

The push refers to repository [192.168.0.10/testprj/nginx]
            73993eeb8aa2: Pushed
            2c31eef17db8: Pushed
            7b9055fc8058: Pushed
            04ab349b7b3b: Pushed
            226117031573: Pushed
            6485bed63627: Pushed
            local_v1: digest: sha256:89020cd33be2767f3f894484b8dd77bc2e5a1ccc864350b92c53262213257dfc size: 1570

        访问 https://192.168.0.10,在项目 testprj 下,就可以查看刚上传的 nginx 镜像。

    5) 拉取定制镜像到本地

        删除本地定制镜像

            $ sudo docker rmi 192.168.0.10/testprj/nginx:local_v1

Untagged: 192.168.0.10/testprj/nginx:local_v1
                Untagged: 192.168.0.10/testprj/nginx@sha256:89020cd33be2767f3f894484b8dd77bc2e5a1ccc864350b92c53262213257dfc

 

    $ sudo docker images

REPOSITORY                  TAG        IMAGE ID       CREATED          SIZE
                nginx                       latest     2b7d6430f78d   5 days ago       142MB
                ...

        退出 docker 登录状态  
        
            $ sudo docker logout 192.168.0.10

                Removing login credentials for 192.168.0.10

        拉取镜像

            $ sudo docker pull 192.168.0.10/testprj/nginx:local_v1

local_v1: Pulling from testprj/nginx
                Digest: sha256:89020cd33be2767f3f894484b8dd77bc2e5a1ccc864350b92c53262213257dfc
                Status: Downloaded newer image for 192.168.0.10/testprj/nginx:local_v1
                192.168.0.10/testprj/nginx:local_v1

            $ sudo docker images

REPOSITORY                  TAG        IMAGE ID       CREATED          SIZE
                192.168.0.10/testprj/nginx  local_v1   2b7d6430f78d   5 days ago       142MB
                nginx                       latest     2b7d6430f78d   5 days ago       142MB
                ...