Harbor是一个企业级的docker私有仓库;

安装需求(以harbor版本为准):

  • python版本大于2.7
  • docker引擎版本大于1.10
  • docker compose版本大于1.6.0

harbor安装:

官方地址:https://github.com/vmware/harbor/releases

https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.3.tgz

Harbor介绍:

Harbor是VMware公司开源的企业级的DockerRegistry项目,其目标是帮助用户迅速搭建一个企业级的docker仓库服务;它以Docker公司开源的Registry为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成,以及审计日志(Auditlogging)等企业用户需求的功能,同时还支持中文;

Harbor的每个组件都是以Docker容器的形式构建的,使用docker compose来对它进行部署;用于部署harbor的docker compose模板位于/Deployer/docker-compose.yml,由5个容器组成(新版本好像不止5个),这几个容器通过docker link 的形式连接在一起,在容器之间通过容器名字相互访问,对终端用户而言,只要暴露proxy(即nginx)的服务端口;

  • Proxy:由nginx服务器构成的反向代理;
  • Registry:由Docker官方的开源的registry镜像构成的容器实例;
  • UI:即架构中的core services,构成此容器的代码是Harbor项目的主体;(也就是说,harbor最大的作用是提供了web界面)
  • MySQL:由官方MySQL镜像构成的数据库容器;存放用户访问控制数据;
  • Log:运行着rsyslogd的容器,通过log-driver的形式收集其他容器的日志;

Harbor特点:

  • 基于角色控制:用户和仓库都是基于项目进行组织的,而用户基于项目可以拥有不同的权限;
  • 基于镜像的复制策略:镜像可以在多个harbor实例之间进行复制;
  • 支持LDAP:harbor的用户授权可以使用已经存在的LDAP用户;
  • 镜像删除&垃圾回收:image可以被删除并且回收image占用的空间,绝大部分的用户操作API,方便用户对系统进行扩展;
  • 用户UI:用户可以轻松的浏览,搜索镜像仓库以及对项目进行管理;
  • 轻松的部署功能:harbor提供了online,offline安装,除此之外还提供了virtualappliance安装;
  • harbor和docker registry的关系:harbor实质上是对docker registry做了封装,扩展了自己的业务模块;

harbor 复制 匹配不到资源 harbor复制仓库_docker

 

 

Harbor认证过程:

  1. docker daemon从docker registry拉取镜像;
  2. 如果docker registry需要进行授权时(私有仓库),registry将会返回401 Unauthorized响应,同时在响应中包含了docker client如何进行认证的信息;
  3. docker client根据registry返回的信息,向auth server发送请求获取认证token;
  4. auth server根据自己的业务实现去验证提交的用户信息是否符合业务要求;
  5. 用户数据仓库返回用户的相关信息;
  6. auth server将会根据查询的用户信息,生成token令牌,以及当前用户所具有的相关权限信息;

上述就是完整的授权过程,当用户完成上述过程后便可执行相关的pull/push操作,认证信息会每次都带在请求头中;

Harbor整体架构:

harbor 复制 匹配不到资源 harbor复制仓库_harbor 复制 匹配不到资源_02

 

 

Harbor认证流程:

  1. 首先,请求被代理容器监听拦截,并跳转到指定的认证服务器;
  2. 如果认证服务器配置了权限认证,则会返回401,通知docker client 在特定的请求中需要带上一个合法的token,而认证的逻辑地址则指向架构图中的core services;
  3. 当docker client 接收到错误code 后,client就会发送认证请求(带有用户名和密码)到core services 进行basic auth认证;
  4. 当client的请求发给nginx后,nginx会根据配置的认证地址将带有用户名和密码的请求发送到core services;
  5. core services获取用户名和密码后,对用户信息进行验证(自己的数据库或者介入LDAP都可以),成功后,返回认证成功信息;

harbor 复制 匹配不到资源 harbor复制仓库_docker_03

 

 

部署:

检查环境:
[root@localhost ~]# python
Python 2.7.5 (default, Nov 16 2020, 22:23:17) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

[root@localhost ~]# docker --version
Docker version 19.03.0, build aeac9490dc

[root@localhost ~]# docker-compose --version
docker-compose version 1.20.0, build ca8d3c6

准备安装包:
harbor-offline-installer-v1.8.3.tgz
解压:
tar -zxvf harbor-offline-installer-v1.8.3.tgz
mv harbor /usr/local/
因为harbor默认使用443端口,所以需要使用证书(新版本貌似默认是80);
创建一个2048位的加密私钥:
[root@localhost ~]# openssl genrsa -des3 -out server.key 2048
创建证书请求:
[root@localhost ~]# openssl req -new -key server.key -out server.csr
    Common Name (eg, your name or your server's hostname) []:hub.giao.com

因为此证书,在启动nginx时,它会让我们去输入这个私钥的密码,但此时nginx是放在容器中运行的,启动时无法及时的输入证书中的密码,所以就会报错退出,因此,证书在启动的时候就不能包含密钥,因此需要退密钥操作;
备份密钥:
[root@localhost ~]# cp server.key server.key.backup
退密钥:
[root@localhost ~]# openssl rsa -in server.key.backup -out server.key

生成证书:
[root@localhost ~]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
将证书,密钥等放在指定目录:
[root@localhost ~]# mkdir -p /data/cert
[root@localhost ~]# mv server.* /data/cert
[root@localhost ~]# cd /usr/local/harbor
[root@localhost harbor]# ll
total 569632
-rw-r--r--. 1 root root 583269670 Sep 15  2019 harbor.v1.8.3.tar.gz
-rw-r--r--. 1 root root      4519 Sep 15  2019 harbor.yml   # 配置文件
-rwxr-xr-x. 1 root root      5088 Sep 15  2019 install.sh   # 安装脚本,会从配置文件中读取配置
-rw-r--r--. 1 root root     11347 Sep 15  2019 LICENSE
-rwxr-xr-x. 1 root root      1654 Sep 15  2019 prepare

[root@localhost harbor]# vim harbor.yml
    hostname: hub.giao.com

    # http related config
    #http:
      # port for http, default is 80. If https enabled, this port will redirect to https port
    #  port: 80

    # https related config
    https:
    #   # https port for harbor, default is 443  port: 443
      port: 443
    #   # The path of cert and key files for nginx
      certificate: /data/cert/server.crt
      private_key: /data/cert/server.key
    配置文件中还包含harbor的管理员密码,数据库密码等;
    
安装:
[root@localhost harbor]# ./install.sh
...
[Step 3]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-db   ... done
Creating registry    ... done
Creating registryctl ... done
Creating redis       ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating harbor-portal     ... done
Creating nginx             ... done

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at https://hub.giao.com. 
For more details, please visit https://github.com/goharbor/harbor .

[root@localhost harbor]# docker ps -a
CONTAINER ID        IMAGE                                               COMMAND                  CREATED             STATUS                   PORTS                                      NAMES
74cb5e51898a        goharbor/nginx-photon:v1.8.3                        "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes (healthy)   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nginx
44e940f1650b        goharbor/harbor-portal:v1.8.3                       "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes (healthy)   80/tcp                                     harbor-portal
6128ccb0e429        goharbor/harbor-jobservice:v1.8.3                   "/harbor/start.sh"       2 minutes ago       Up 2 minutes                                                        harbor-jobservice
67ba5b5131a6        goharbor/harbor-core:v1.8.3                         "/harbor/start.sh"       2 minutes ago       Up 2 minutes (healthy)                                              harbor-core
40e9f2a0c2d9        goharbor/redis-photon:v1.8.3                        "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes             6379/tcp                                   redis
66f258a03c85        goharbor/harbor-db:v1.8.3                           "/entrypoint.sh post…"   2 minutes ago       Up 2 minutes (healthy)   5432/tcp                                   harbor-db
d4877bbc7ca6        goharbor/harbor-registryctl:v1.8.3                  "/harbor/start.sh"       2 minutes ago       Up 2 minutes (healthy)                                              registryctl
4a601c1db422        goharbor/registry-photon:v2.7.1-patch-2819-v1.8.3   "/entrypoint.sh /etc…"   2 minutes ago       Up 2 minutes (healthy)   5000/tcp                                   registry
a5ceccf4c9bd        goharbor/harbor-log:v1.8.3                          "/bin/sh -c /usr/loc…"   2 minutes ago       Up 2 minutes (healthy)   127.0.0.1:1514->10514/tcp                  harbor-log

注意修改hosts文件解析!

harbor 复制 匹配不到资源 harbor复制仓库_docker_04

 

 

创建普通用户:

harbor 复制 匹配不到资源 harbor复制仓库_私有仓库_05

 

 

普通用户新建私有仓库(此处不要勾选公开):

harbor 复制 匹配不到资源 harbor复制仓库_私有仓库_06

 

 

服务器指定镜像仓库地址:

vim /etc/docker/daemon.json
    {
        "insecure-registries": ["hub.giao.com"]
    }
systemctl restart docker
vim /etc/hosts
    192.168.10.123 hub.giao.com
[root@localhost ~]# docker tag tomcat:v1.0 hub.giao.com/hamburger/tomcat:v1.0
因为是私有仓库,需要使用用户名和密码进行登录(不写地址是登录的官方仓库):
[root@localhost ~]# docker login hub.giao.com
Username: laoba
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
推送镜像到私有仓库:
[root@localhost ~]# docker push hub.giao.com/hamburger/tomcat:v1.0

harbor 复制 匹配不到资源 harbor复制仓库_harbor 复制 匹配不到资源_07

 

 

客户端下载:

修改仓库地址,修改hosts解析,先进行登录认证,再正常拉取镜像使用;