一、 Harbor简介

1.1 Harbor介绍

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

1.2 Harbor特性

●基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。

●镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。

●图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。

AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。

●审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。

●国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。

●RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。

●部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。

1.3 Harbor组件

●Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。

●Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。

●Core services: 这是Harbor的核心功能,主要提供以下服务:

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

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

token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。

●Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。

●Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。

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

各个组件之间的关系如下图所示:

1.4 Harbor的实现

nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和正在docker镜像存储的docker registry。
harbor-jobservice:harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了镜像仓库之前同步使用的。
harbor-ui:harbor-ui是web管理页面,主要是前端的页面和后端CURD的接口。
registry:registry就是docker原生的仓库,负责保存镜像。
harbor-adminserver:harbor-adminserver是harbor系统管理接口,可以修改系统配置以及获取系统信息。
harbor-db:harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节大多对接到企业的ldap中。
harbor-log:harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。

这几个容器通过Docker
link的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露proxy
(即Nginx)的服务端口。

二、安装和配置Harbor

2.1 环境说明

环境名称

版本

系统版本

CentOS Linux release 7.5.1804 (Core)

docker-ce

19.03.1

docker-compose

1.18.0

Harbor

v1.8.1

主机名:node01

IP:10.0.0.50

2.2 安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
rpm -qa|grep docker|awk '{print "yum remove -y " $1}'|bash
yum install -y docker-ce
systemctl start docker
systemctl enable docker

2.3 安装docker-compose

2.3.1 方法一:yum安装

yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install -y docker-compose

2.3.2 方法二:二进制安装(下载慢、不推荐)

●下载二进制文件

curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

如果需要安装其他版本的话,请修改上面命令中的版本号。

●赋予二进制文件可执行权限

chmod +x /usr/local/bin/docker-compose

●安装命令补全功能(重启后生效)

yum install -y bash-completion
curl -L https://raw.githubusercontent.com/docker/compose/1.18.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

2.3.3 方法三:pip安装

yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install -y python-pip
pip install docker-compose

2.4 下载Harbor

这里有两个包Harbor offline installer 和 Harbor online installer,两者的区别的是 Harbor offline installer 里就包含的 Harbor 需要使用的镜像文件。

wget -P /opt/ https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.1.tgz

2.5 安装配置Harbor

tar xf /opt/harbor-offline-installer-v1.8.1.tgz -C /usr/local/
cd /usr/local/harbor/
vim harbor.yml
******************************************
设置HOSTNAME名和登录密码,生产主机名为域名,这里使用主机名
hostname: node01
harbor_admin_password:
******************************************
./prepare
./install.sh

2.6 访问Harbor的WEB管理界面

在浏览器输入:http://10.0.0.50

帐号密码为:admin/123456

2.7 Harbor的简单管理

2.7.1 Harbor的服务进程查看

Harbor 的日常运维管理是通过docker-compose来完成的,Harbor本身有多个服务进程,都放在docker容器之中运行,我们可以通过docker ps 或docker-compose 命令查看,使用docker-compose查看需要在harbor目录下。

[root@node01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f5936a159ea goharbor/nginx-photon:v1.8.1 "nginx -g 'daemon of…" minutes ago Up minutes (healthy) 0.0.0.0:->/tcp nginx
6890e23d4e04 goharbor/harbor-jobservice:v1.8.1 "/harbor/start.sh" minutes ago Up minutes harbor-jobservice
46c7aa564fdc goharbor/harbor-portal:v1.8.1 "nginx -g 'daemon of…" minutes ago Up minutes (healthy) /tcp harbor-portal
5cece92d1c77 goharbor/harbor-core:v1.8.1 "/harbor/start.sh" minutes ago Up minutes (healthy) harbor-core
ddc4b133da6a goharbor/harbor-registryctl:v1.8.1 "/harbor/start.sh" minutes ago Up minutes (healthy) registryctl
cc8a3188b58a goharbor/harbor-db:v1.8.1 "/entrypoint.sh post…" minutes ago Up minutes (healthy) /tcp harbor-db
92a5e4c314f1 goharbor/redis-photon:v1.8.1 "docker-entrypoint.s…" minutes ago Up minutes /tcp redis
2e4a6be26e7b goharbor/registry-photon:v2.7.1-patch--v1.8.1 "/entrypoint.sh /etc…" minutes ago Up minutes (healthy) /tcp registry
aff7569ea98b goharbor/harbor-log:v1.8.1 "/bin/sh -c /usr/loc…" minutes ago Up minutes (healthy) 127.0.0.1:->/tcp harbor-log
[root@node01 ~]# cd /usr/local/harbor/
[root@node01 harbor]# docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------
harbor-core /harbor/start.sh Up
harbor-db /entrypoint.sh postgres Up /tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up 127.0.0.1:->/tcp
harbor-portal nginx -g daemon off; Up /tcp
nginx nginx -g daemon off; Up 0.0.0.0:->/tcp
redis docker-entrypoint.sh redis ... Up /tcp
registry /entrypoint.sh /etc/regist ... Up /tcp
registryctl /harbor/start.sh Up

2.7.2 Harbor其他一些管理命令

启动Harbor
# docker-compose start
停止Harbor
# docker-comose stop
重启Harbor
# docker-compose restart

2.8 测试上传和下载镜像

由于docker push镜像到仓库默认需要HTTPS协议,这里修改docker服务配置,使用HTTP协议。

2.8.1 修改配置支持HTTP协议

方法一:

vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 10.0.0.50

--insecure-registry 后面加的是私库的地址(这里的私库地址为:10.0.0.50)。

方法二:

vim /etc/docker/daemon.json
*******************************
{
"insecure-registries":["10.0.0.50"]
}
*******************************
#重启docker服务
systemctl daemon-reload
systemctl restart docker

2.8.2 下载一个镜像用于测试

[root@node01 ~]# docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
: Pull complete
Digest: sha256:6a92cd1fcdc8d8cdec60f33dda4db2cb1fcdcacf3410a8e05b3741f44a9b5998
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
[root@node01 ~]# docker images alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest b7b28af77ffe weeks ago .58MB

2.8.3 登录仓库

[root@node01 ~]# docker login 10.0.0.50
Username: admin
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

2.8.4 上传镜像

[root@node01 ~]# docker tag b7b28af77ffe 10.0.0.50/library/alpine:latest
[root@node01 ~]# docker push 10.0.0.50/library/alpine:latest
The push refers to repository [10.0.0.50/library/alpine]
1bfeebd65323: Pushed
latest: digest: sha256:57334c50959f26ce1ee025d08f136c2292c128f84e7b229d1b0da5dac89e9866 size:

注意:这里打tag必须是加上仓库的项目名,例如上面10.0.0.50/library/alpine:latest,否则会上传失败,示例如下:

[root@node01 ~]# docker tag b7b28af77ffe 10.0.0.50/wutao/alpine:latest
[root@node01 ~]# docker push 10.0.0.50/wutao/alpine:latest
The push refers to repository [10.0.0.50/wutao/alpine]
1bfeebd65323: Preparing
denied: requested access to the resource is denied

2.8.5 下载镜像

[root@node01 ~]# docker rmi alpine
Untagged: alpine:latest
Untagged: alpine@sha256:6a92cd1fcdc8d8cdec60f33dda4db2cb1fcdcacf3410a8e05b3741f44a9b5998
[root@node01 ~]# docker pull 10.0.0.50/library/alpine:latest
latest: Pulling from library/alpine
: Pull complete
Digest: sha256:57334c50959f26ce1ee025d08f136c2292c128f84e7b229d1b0da5dac89e9866
Status: Downloaded newer image for 10.0.0.50/library/alpine:latest
10.0.0.50/library/alpine:latest
[root@node01 ~]# docker images 10.0.0.50/library/alpine:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.0.50/library/alpine latest b7b28af77ffe weeks ago .58MB

2.9 登录Harbor的WEB管理界面查看镜像

三、Harbor配置TLS证书

3.1 修改Harbor配置文件

vim /usr/local/harbor/harbor.ym
******************************************************************************************
#禁用HTTP协议,启用HTTPS协议
hostname: node01
# http related config
#http:
# port for http, default is . If https enabled, this port will redirect to https port
# port: # https related config
https:
# # https port for harbor, default is
port:
# # The path of cert and key files for nginx
certificate: /root/certs/ca.crt
private_key: /root/certs/ca.key
harbor_admin_password:

3.2 创建自签名证书key文件

[root@node01 ]# mkdir /root/certs -p
[root@node01 ]# openssl genrsa -out /root/certs/ca.key
Generating RSA private key, bit long modulus
..+++
..............+++
e is (0x10001)

3.3 创建自签名证书crt文件

[root@node01 ]# openssl req -x509 -new -nodes -key /root/certs/ca.key -subj "/CN=node01" -days  -out /root/certs/ca.crt

3.4 安装Harbor

[root@node01 ~]# cd /usr/local/harbor/
[root@node01 harbor]# ./prepare
[root@node01 harbor]# ./install.sh
✔ ----Harbor has been installed and started successfully.---- Now you should be able to visit the admin portal at https://node01 .
For more details, please visit https://github.com/goharbor/harbor .

可以看到已经是启用HTTPS协议了。

3.5 客户端配置

客户端需要创建证书文件存放的位置,并且把服务端创建的证书拷贝到该目录下,然后重启客户端docker。我们这里创建目录为:/etc/docker/certs.d/node01

[root@node01 ~]# mkdir /etc/docker/certs.d/node01 -p
[root@node01 ~]# cp /root/certs/ca.crt /etc/docker/certs.d/node01/
[root@node01 ~]# systemctl restart docker
[root@node01 ~]# cd /usr/local/harbor/ && docker-compose start
Starting log ... done
Starting registry ... done
Starting registryctl ... done
Starting postgresql ... done
Starting core ... done
Starting portal ... done
Starting redis ... done
Starting jobservice ... done
Starting proxy ... done

3.6 测试是否支持HTTPS访问

[root@node01 harbor]# docker login node01
Username: admin
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@node01 harbor]# ./install.sh
➜ Please set hostname and other necessary attributes in harbor.yml first. DO NOT use localhost or 127.0.0.1 for hostname, because Harbor needs to be accessed by external clients.
Please set --with-notary if needs enable Notary in Harbor, and set ui_url_protocol/ssl_cert/ssl_cert_key in harbor.yml bacause notary must run under https.
Please set --with-clair if needs enable Clair in Harbor
Please set --with-chartmuseum if needs enable Chartmuseum in Harbor

解决方法:把Harbor配置文件hostname改为主机名或规则域名。

Harbor搭建企业级docker仓库的更多相关文章

  1. Harbor快速搭建企业级Docker仓库

    Github: https://github.com/goharbor/harbor 改端口安装: https://www.cnblogs.com/huangjc/p/6420355.html 相关博 ...

  2. 搭建Harbor企业级docker仓库

    搭建Harbor企业级docker仓库 一.Harbor简介 1.Harbor介绍 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如 ...

  3. Kubernetes-5:搭建企业级私有仓库Harbor

    搭建企业级私有仓库Harbor 安装需求 python版本 >= 2.7 Docker引擎版本 >= 1.10 docker-compose版本 >= 1.6.0 安装环境 一.Py ...

  4. 搭建docker镜像仓库(二):使用harbor搭建本地镜像仓库

    目录 一.系统环境 二.前言 三.Harbor 四.使用harbor搭建私有镜像仓库 4.1 环境介绍 4.2 k8smaster节点安装配置harbor 4.2.1 安装harbor离线包 4.2. ...

  5. Harbor安装 -- 企业级Registry仓库

    (一)Harbor安装 -- 企业级Registry仓库 以下文章转自http://www.jianshu.com/p/2ebadd9a323d 根据Harbor官方描述: Harbor是一个用于存储 ...

  6. Harbor - 私有企业级 Docker 镜像仓库

    GitHub 地址 容器镜像服务 Docker镜像的基本使用 Docker:企业级私有镜像仓库Harbor使用 Harbor 是基于 Docker Registry 的企业级镜像仓库,安装后的使用方法 ...

  7. debian上搭建私有docker仓库

    docker官方仓库是docker hub.虽然很好用,但是无法满足私密性的要求. 如果只需要在局域网内或者朋友圈内分享各自制作的image,那么,搭建属于自己的docker仓库变得很有必要. 一.环 ...

  8. 使用 Nexus Repository Manager 搭建私有docker仓库

    使用容器安装Nexus3 1.下载nexus3的镜像: docker pull sonatype/nexus3 2.使用镜像启动一个容器: docker run -d --name nexus  -- ...

  9. docker+Nexus Repository Manager 搭建私有docker仓库

    使用容器安装Nexus3 1.下载nexus3的镜像: docker pull sonatype/nexus3 2.使用镜像启动一个容器: docker run -d -p 8081:8081 -p ...

随机推荐

  1. SpringBoot 配置文件与依赖库分离打包配置

    一.应用场景 一般情况下我们对springboot应用打包时使用springboot的maven插件spring-boot-maven-plugin的maven进行打包,打包完成得到一个fatjar, ...

  2. 使用three.js创建大小不随着场景变化的文字

    使用three.js创建大小不随着场景变化的文字,需要以下两步: 1.将文字绘制到画布上. 2.创建着色器材质,把文字放到三维场景中. 优点: 1.跟用html实现文字相比,这些文字可以被模型遮挡,更 ...

  3. CSS浮动和各种定位

    CSS定位 css定位机制 文档流:元素按照在HTML中的位置决定排布的过程 块级元素是从上到下的,内联元素是从左到右的 浮动 position布局 position css position属性用于 ...

  4. Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览

    ​ ​本文是Spring Cloud专栏的第一篇文章,了解本篇文章内容有助于更好的理解后面文章 ​ 一.网站架构演变过程 1-1.传统架构 传统的SSH架构,分为三层架构 web控制层.业务逻辑层.数 ...

  5. Spring Boot SpringApplication启动类(二)

    目录 前言 1.起源 2.SpringApplication 运行阶段 2.1 SpringApplicationRunListeners 结构 2.1.1 SpringApplicationRunL ...

  6. NAT的三种类型

    一.静态NAT 内部本地地址一对一转换成内部全局地址,相当内部本地的每一台PC都绑定了一个全局地址,即使这个地址没有被使用,其他的电脑也不能拿来转换使用,这样容易造成IP地址的资源浪费,一般是用于在内 ...

  7. 一条数据的HBase之旅,简明HBase入门教程1:开篇

    [摘要] 这是HBase入门系列的第1篇文章,主要介绍HBase当前的项目活跃度以及搜索引擎热度信息,以及一些概况信息,内容基于HBase 2.0 beta2版本.本系列文章既适用于HBase新手,也 ...

  8. 从“职场小白”进阶为“行业大牛”,四个"锦囊"教你破局

    在早期软件行业,会存在一个普遍的现象,有些大学的本科,或者研究生毕业,他们去面试工作的时候会发现,面试下来代码能力可能不是太好,这种情况下公司会问你愿不愿意去做测试? 如果说早期软件测试行业还是一个风 ...

  9. 利用python进行微信好友分析

    欢迎python爱好者加入:学习交流群 667279387 本文主要利用python对个人微信好友进行分析并把结果输出到一个html文档当中,主要用到的python包为itchat,pandas,py ...

  10. [TimLinux] CPU 常见架构介绍

    1. 简介 系统性能依赖硬件架构,CPU架构决定了硬件的布局.常见的CPU架构:SMP, NUMA, MPP. 2. SMP(对称多处理器) SMP:Symmetric Multiprocessing ...