Docker镜像仓库Harbor搭建及配置


Harbor简介

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker
Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中,
确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

mark

harbor被部署为多个docker容器,因此可以部署在任何支持docker的linux的发行版上
我们还需要docker-compose编排工具,编排工具执行了多个docker容器的操作

一:Harbor概述

Harbor是VMware公司开源的企业级Docker Registry项目

1.1:Harbor的优势

  • 基于角色的访问控制(Role Based Access Control)
  • 基于策略的镜像复制(Policy based image replication)
  • 镜像的漏洞扫描(Vulnerability Scanning)
  • AD/LDAP集成(LDAP/AD support)
  • 镜像的删除和空间清理(Image deletion & garbage collection)
  • 友好的管理UI(Graphical user portal)
  • 审计日志(Audit logging)
  • RESTful API
  • 部署简单(Easy deployment)

1.2:Harbro组件

(1)依赖的外部组件:

  • Nginx(Proxy): Harbor的Registry、UI、Token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
  • Registry v2: Docker官方镜像仓库, 负责储存Docker镜像,并处理Docker Push/Pull命令。由于我们要对用户进行访问控制,即不同用户对Docker镜像有不同的读写权限,Registry会指向一个Token服务,强制用户的每次Docker
    Push/Pull请求都要携带一个合法的Token, Registry会通过公钥对Token进行解密验证。
  • Database(MySQL/Postgresql):为Core Services提供数据库服务,负责储存用户权限、审计日志、Docker镜像分组信息等数据。

(2)Harbor自己的组件:

Core Services(Admin Server): 这是Harbor的核心功能,主要提供以下服务:

  • API:提供Harbor RESTful API

  • UI:提供图形化界面,帮助用户管理Registry上的镜像, 并对用户进行授权。

  • Webhook:为了及时获取Registry上镜像状态变化的情况,在Registry上配置Webhook,把状态变化传递给UI模块。

  • Auth服务:负责根据用户权限给每个Docker Push/Pull命令签发Token。Docker客户端向Registry服务发起的请求,如果不包含Token,会被重定向到这里,获得Token后再重新向Registry进行请求。

  • Replication Job Service:提供多个Harbor实例之间的镜像同步功能。

  • Log Collector:为了帮助监控Harbor运行,负责收集其他组件的日志,供日后进行分析。

二:Docker私有仓库架构拓扑

mark

2.1:Harbor安裝方式

不建议使用Kubernetes来安裝,原因是镜像仓库非常重要,尽量保证安裝和维护的简洁性,因此这里直接使用Docker Compose的方式进行安裝。事实上Harbor的每个组件都是以Docker容器的形式构建,官方也是使用Docker Compose来对它进行安裝。Harbor官方提供以下三种安裝方式:

  • 在线安装:从Docker Hub下载Harbor的镜像来安装,由于Docker Hub比较慢,建议Docker配置好加速器。
  • 离线安装:这种方式应对与安裝主机没联网的情况使用,需要提前下载离线安装包到本地。
  • OVA安装:这个主要用vCentor环境时使用。

三:部署Harbor服务

案例描述:

  • 两台CentOS7.6,一台服务器端,一台客户端(测试使用);
  • 两台服务器都要安装Docker服务,我这里Docker版本是19.03.13版本;
主机 操作系统 主机名/IP地址 主要软件及版本
服务器 Centos 7.6 Harbor/20.0.0.41 docker 19.03.13、docker-compose、harbor-offline-v1.2.2
客户端 Ctentos 7.6 Client/20.0.0.42 docker 19.03.13:

3.1:安装docker Compose

#清空防火墙规则跟安全防护功能
[root@harbor ~]# iptables -F
[root@harbor ~]# setenforce 0

[root@harbor ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  公共  视频  文档  音乐
docker-compose   shuai    模板  图片  下载  桌面

#增加可执行权限
[root@harbor ~]# chmod +x docker-compose 

#移动到usr/local/bin目录,系统识别后,可直接使用docker-compose命令
[root@harbor ~]# mv docker-compose /usr/local/bin

#docke版本-compose
[root@harbor ~]# docker-compose -v
docker-compose version 1.21.1, build 5a3f1a3

安装Harobor

[root@harbor ~]# http:// harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
[root@harbor ~]# tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/loc:al/

3.2:配置Harbor

  • 解压缩之后,目录下回生成harbor.conf文件,该文件就是Harbor的配置文件
[root@harbor ~]# vim /usr/local/harbor/harbor.cfg 

## Configuration file of Harbor

#hostname设置访问地址,可以使用IP、域名,不可以设置为127.0.0.1或者localhost 这边改为本地地址
hostname = 20.0.0.41

'//只需要修改下IP即可 下面是说明'

#访问协议,默认是http。也可以设置为https,如果设置https,则nginx ssl需要设置on
ui_url_protocol = http

#mysql数据库root用户默认密码root123,实际使用时修改下
db_password = root123

max_job_workers =
 customize_crt = on
 ssl_cert = /data/cert/server.crt
 ssl_cert_key = /data/cert/server.key
 secretkey_path = /data
 admiral_url = NA
 
 # 邮件设置,发送重置密码邮件时使用
 email_identity =
 email_server = smtp.mydomain.com
 email_server_port = 25
 email_username = sample_admin@mydomain.com
 email_password = abc
 email_from = admin <sample_admin@mydomain.com>
 email_ssl = false
 
 # 启动Harbor后,管理员UI登录的密码,默认是Harbor12345
 harbor_admin_password = Harbor12345
 
 # 认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是db_auth,mysql数据库认证
 auth_mode = db_auth
 
 # LDAP认证时配置项
 #ldap_url = ldaps://ldap.mydomain.com
 #ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com
 #ldap_search_pwd = password
 #ldap_basedn = ou=people,dc=mydomain,dc=com
 #ldap_filter = (objectClass=person)
 #ldap_uid = uid
 #ldap_scope = 3
 #ldap_timeout = 5
 
 # 是否开启自注册
 self_registration = on
 
 # Token有效时间,默认30分钟
 token_expiration = 30

 # 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)
 project_creation_restriction = everyone
 
 verify_remote_cert = on
  • 启动
[root@harbor ~]# cd /usr/local/harbor/
[root@harbor harbor]# sh install.sh 
  • 查看镜像和容器是都已经启动
docker images      //查看镜像
docker ps -a       //查看容器
docker-compose ps  //查看容器

如图所示

mark

  • 如果一切都正常,应该可以打开浏览器访问http://20.0.0.41的管理页面,默认的管理员用户名和密码是admin/Harbor12345。

mark

  • 添加项目并填写项目名称

mark

镜像创建好以后,回到控制台,可以通过docker命苦在本地通过127.0.0.1来登录和推送镜像

  • 登录
[root@harbor harbor]# docker login -u admin -p Harbor12345 http://127.0.0.1
  • 下载镜像进行测试
[root@harbor harbor]# docker pull nginx
  • 镜像打标签
[root@harbor harbor]# docker tag nginx 127.0.0.1/shuai/nginx:v1

#查看镜像
[root@harbor harbor]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
127.0.0.1/shuai/nginx       v1                  7e4d58f0e5f3        13 days ago         133MB
  • 上传镜像到Harbor私库中
[root@harbor harbor]# docker push 127.0.0.1/shuai/nginx:v1
The push refers to repository [127.0.0.1/shuai/nginx]
908cf8238301: Pushed 
eabfa4cd2d12: Pushed 
60c688e8765e: Pushed 
f431d0917d41: Pushed 
07cab4339852: Pushed 
v1: digest: sha256:794275d96b4ab96eeb954728a7bf11156570e8372ecd5ed0cbc7280313a27d19 size: 1362
  • 上传好后,我们就可以在Harbor中看到这个镜像了

mark

  • 以上操作都是在 Harbor 服务器本地操作。

再打开一台虚拟机,作为客户端,连接 Harbor ,来上传和下载镜像:

1、首先要修改 /usr/lib/systemd/system/docker.service 配置文件,关联上私库,添加以下代码(一定要添加,否则会出现报错):

如果其他客户端上传镜像到 Harbor,就会报 
如下错误。出现这问题的原因 Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜 
像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误
[root@client ~]# docker login  -u admin -p Harbor12345 http://20.0.0.41
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://20.0.0.41/v2/: EOF


#解决
[root@client ~]# vim /usr/lib/systemd/system/docker.service

/14行修改
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 20.0.0.41 --containerd=/run/containerd/containerd.sock

mark

  • 重启服务
[root@client ~]# systemctl daemon-reload     #重载服务
[root@client ~]# systemctl restart docker    #重启docker
  • 客户端登录
[root@client ~]# docker login -u admin -p Harbor12345 http://20.0.0.41
  • 可以在这台客户机上下载私库已经有的镜像
[root@client ~]# docker pull centos:7
  • 或者从公库下载一个镜像,在打标签,上传到私库中
[root@client ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   7e6257c9f8d8        6 weeks ago         203MB

#镜像打标签
[root@client ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
centos                   7                   7e6257c9f8d8        6 weeks ago         203MB
20.0.0.41/shuai/centos   v1                  7e6257c9f8d8        6 weeks ago         203MB

#上传到私库中
[root@client ~]# docker push 20.0.0.41/shuai/centos

mark

  • 客户端进行下载镜像
[root@harbor harbor]# docker pull 127.0.0.1/shuai/centos:v1

#查看镜像已经下到服务端了
[root@harbor harbor]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
127.0.0.1/shuai/nginx       v1                  7e4d58f0e5f3        13 days ago         133MB
nginx                       latest              7e4d58f0e5f3        13 days ago         133MB
127.0.0.1/shuai/centos      v1                  7e6257c9f8d8        6 weeks ago         203MB

mark

3.3:创建Harbor用户

mark

mark

mark

3.4:创建项目开发人员

mark

mark

mark

3.5:在客户机上操作

'//注销登录'
[root@client ~]# docker logout 20.0.0.41
Removing login credentials for 20.0.0.41

'//登录'
[root@client ~]# docker login 20.0.0.41
Username: shuai-lisi     #输入用户
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

3.6:在Harbor服务端操作

3.61:关闭所有容器

[root@harbor harbor]# docker-compose down -v
Stopping nginx              ... done
Stopping harbor-jobservice  ... done
Stopping harbor-ui          ... done
Stopping registry           ... done
Stopping harbor-db          ... done
Stopping harbor-adminserver ... done
Stopping harbor-log         ... done
Removing nginx              ... done
Removing harbor-jobservice  ... done
Removing harbor-ui          ... done
Removing registry           ... done
Removing harbor-db          ... done
Removing harbor-adminserver ... done
Removing harbor-log         ... done
Removing network harbor_harbor

3.62:开启全部容器

[root@harbor harbor]#  docker-compose up -d
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registry           ... done
Creating harbor-adminserver ... done
Creating harbor-db          ... done
Creating harbor-ui          ... done
Creating nginx              ... done
Creating harbor-jobservice  ... done

如需重新部署,需要移除 Harbor 服务容器全部数据

持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的

/var/log/Harbor/目录下。

rm -rf /data/database/

rm -rf /data/registry/

猜你喜欢

转载自blog.csdn.net/weixin_47151643/article/details/108765266