使用Harbor搭建私有仓库

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认证过程:

  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认证流程:

  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搭建私有仓库

 

 

部署:

检查环境:
[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搭建私有仓库

 

 

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

使用Harbor搭建私有仓库

 

 

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

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搭建私有仓库

 

 

客户端下载:

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

上一篇:Docker---部署企业级镜像仓库Docker Harbor


下一篇:Docker入门与进阶(下)