一、什么是 Harbor

Harbor 是一个开源的云本地 registry 仓库,可以用于管理和储存 Docker 镜像。Harbor 支持在多个仓库直接进行复制镜像,提供用户管理和访问控制和活动审计。

Harbor 由以下服务组成(每个服务都由一个容器运行):

  • nginx
  • harbor-jobservice
  • harbor-portal
  • harbor-core
  • registryctl
  • harbor-db
  • redis
  • registry
  • harbor-log

本文搭建的 Harbor 是基于 1.8.0,因为我最近准备写这个文档的时候,就发现 Harbor 最新版本为 1.8.0 了,本着追寻潮流,引领时尚的做人原则,就选择基于 1.8.0 来书写这篇文档,1.8.0 相对于之前的版本还是有比较多的更新的。

  • 支持 OpenID Connect
  • 支持机器人账户,可以将机器人账户设置只具有推送和拉取镜像的权限。
  • 复制改进,扩展 Harbor-to-Harbor 的复制功能,增加了 Harbor --> Docker Hub 、Harbor---> Docker Registry 、Harbor---> Huawei Registry 的功能。
  • 支持定时清理任务,支持状态检查 API,增加了新的项目角色,不仅仅是开发人员和管理员,还有维护人员、访客。
  • 引入 harbor.yml 替代 harbor.cfg,Docker Registry 升级到 2.7.1。

二、Harbor 安装

官方安装文档(2019.0514): https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md

官方文档的安装方法主要还是针对于 1.8.0 之前的版本,后续官方应该会对 1.8.0 版本进行更新文档。暂时没有针对新的版本的文档。

Harbor 的安装是基于 docker-compose ,通过构建多个容器来组成一个服务。

2.1、Harbor 安装环境

Harbor 的硬件需求

Resource Capacity Description
CPU minimal 2 CPU 4 CPU is preferred
Mem minimal 4GB 8GB is preferred
Disk minimal 40GB 160GB is preferred

软件需求

Software Version Description
Python version 2.7 or higher Note that you may have to install Python on Linux distributions (Gentoo, Arch) that do not come with a Python interpreter installed by default
Docker engine version 17.03.0-ce+ or higher For installation instructions, please refer to: https://docs.docker.com/engine/installation/
Docker Compose version 1.18.0 or higher For installation instructions, please refer to: https://docs.docker.com/compose/install/
Openssl latest is preferred Generate certificate and keys for Harbor

端口需求

Port Protocol Description
443 HTTPS Harbor portal and core API will accept requests on this port for https protocol
4443 HTTPS Connections to the Docker Content Trust service for Harbor, only needed when Notary is enabled
80 HTTP Harbor portal and core API will accept requests on this port for http protocol

目前,Harbor 使用的数据库仅支持 PostgreSQL 数据库。

2.2、Harbor安装

Harbor 有两种安装方法:

  • 在线安装,在线安装需要网络,安装包非常小。
  • 离线安装,离线安装,本地主机可以没有网络,安装包会比较大。

我们这里选择的是离线安装,避免因国内网络问题导致安装耗时比较久。

安装 docker-compose ,版本需要1.18.0+

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

安装 Harbor

# 获取需要安装的版本
https://github.com/goharbor/harbor/releases
# 下载
cd /opt/ && wget 下载版本链接
tar -xzf harbor-offline-installer*
cd harbor
# 编辑配置文件 harbor.yml
vim harbor.yml
# 需要更改的参数
hostname: 192.168.15.170 # 绑定ip,不能使用127.0.0.1和localhost
http: # 监听端口,默认80,也就是我们 管理ui访问的端口
port: 80
harbor_admin_password: Harbor12345 # 设置管理员密码
## 还可以设置启动 https,并指定证书,和指定数据目录 # 安装
./install.sh

默认安装是不包含 Notary 和 Clair (用于漏洞扫描)。但是已经与他们集成了。我们可以使用

默认是使用 HTTP 协议,我们可以配置证书并使用 HTTPS 来访问 Harbor。

2.3 配置HTTPS

说实话我开始是抵触的,我不想去使用它,但是当我考虑到,我不可能暂停我所有已经运行的容器来修改配置,来解决 docker login的问题,所有我只能老老实实的来配置 HTTPS ,这个烦人的 HTTPS。

官方配置文档: https://github.com/goharbor/harbor/blob/master/docs/configure_https.md

我们这里演示的是创建自己的 证书,实际生产环境中我们可以去阿里云或者其他云服务器厂商申请免费的 证书。

创建证书

# 创建存放证书的目录
mkdir -p /data/cert/
cd /data/cert/
# 创建自签名证书key文件
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=192.168.15.170" \
-key ca.key \
-out ca.crt #CN 替换为你的仓库域名

修改配置

#配置 HTTPS 配置
https:
# # https port for harbor, default is 443
port: 443
# # The path of cert and key files for nginx
certificate: /data/cert/ca.crt
private_key: /data/cert/ca.key

重新初始化 Harbor

# 暂停
docker-compose down -v
prepare # 生成配置文件,根据 harbor.yml 配置生成docker-compose文件。
docker-compose up -d # 后台启动

客户端配置

将 Harbor 生成的证书 /data/cert/ca.crt 复制到 客户端的 /etc/docker/certs.d/仓库域名/

然后重启docker 。

docker  login  仓库域名

三、Harbor 的使用

3.1、登录Harbor并使用

登录网址 : ip,http://192.168.15.170

默认的用户名和密码是:

用户名:admin

密码: Harbor12345

登录 Harbor 并创建一个私有项目 test 。

1.8.0版本使用界面图

1.7.5版本使用界面图

(不知道为啥上面有一坨绿色,难道是……,不可能的)。

本地登录 并且上传镜像

docker  login 192.168.15.170

docker  tag  centos:latest   192.168.15.170/test/centos:latest  # tag 名称= 仓库地址/项目名称/镜像名称:标记(版本号)
docker push 192.168.15.170/test/centos:latest

下载镜像

docker pull 192.168.15.170/test/centos:latest

3.2、注意事项

在进行登录的过程中我们会遇到以下的问题,我们也给出了解决办法。

# 登录
docker login 192.168.15.170
# 登录报错
[root@localhost harbor]# docker login 192.168.15.170
Username: admin
Password:
Error response from daemon: Get https://192.168.15.170/v2/: dial tcp 192.168.15.170:443: connect: connection refused # 解决办法 ,官方的安装文档也是有写到这个问题
在 dockerd 启动参数中加上 --insecure-registry=192.168.15.170
编辑配置文件 /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=192.168.15.170

四、Harbor 管理

4.1 启动暂停

我们可以使用 docker-compose 来管理 Harbor 的生命周期,以下命令的运行环境目录需要与 docker-compose.yml 是同一个目录。

# 暂停 Harbor
docker-compose stop
# 启动 Harbor
docker-compose start # 更改 harbor.yml,1.8.0之前的版本配置文件是 harbor.cfg
docker-compose down -v
vim harbor.yml # 更改配置
prepare # 生成配置文件,根据 harbor.yml 配置生成docker-compose文件。
docker-compose up -d # 删除 Harbor 的容器,将镜像数据和 Harbor的数据库文件保存在文件系统上。
docker-compose down -v # 彻底地删除 Harbor 的数据和镜像
rm -r /data/database
rm -r /data/registry

默认情况下,Harbor 的数据保存在 /data/ 下,即使我们删除或者重建 Harbor 数据不会发生改变。并且 Harbor 使用了 rsyslog 来进行收集每个容器的日志,默认情况下,这些日志文件储存在主机的 /var/loh/harbor/

更改配置文件

Harbor 默认的监听端口是 80(HTTP)和 443(HTTPS).

对于1.8.0版本

方法一 : 更改 harbor.yml 配置文件

在配置文件中有配置 监听端口 和使用具体协议的位置,我们根据各自需求进行设置。

注意,我们这边进行更改 docker-compose.yml 配置文件 来更改配置是无效的,因为当我们运行了 prepare docker-compose文件就会被重写,所以更改 docker-compose.yml 是无效的。

对于1.8.0之前的版本

对于 HTTP 协议。

方法一 :更改 docker-compose.yml 配置文件

  proxy:
image: goharbor/nginx-photon:v1.7.5
container_name: nginx
restart: always
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- NET_BIND_SERVICE
volumes:
- ./common/config/nginx:/etc/nginx:z
networks:
- harbor
dns_search: .
ports:
- 80:80
- 443:443
- 4443:4443
depends_on:
- postgresql
- registry
- core
- portal
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"
# 将原有的内部监听80端口替换为 8888
proxy:
image: goharbor/nginx-photon:v1.7.5
container_name: nginx
restart: always
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- NET_BIND_SERVICE
volumes:
- ./common/config/nginx:/etc/nginx:z
networks:
- harbor
dns_search: .
ports:
- 8888:80
- 443:443
- 4443:4443
depends_on:
- postgresql
- registry
- core
- portal
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"

方法二 更改 harbor.cfg ,将端口添加到参数 hostname上。

hostname = 192.168.15.170:8888

对于HTTPS 协议

跟配置 HTTP 协议一致。

更改了配置之后,我们需要重新部署 Harbor.

#  以下命令在 docker-compose.yml 文件所在目录中运行
./prepare
docker-compose up -d

2020年3月14号

最近一个群友反馈的一问题,就是 docker 在push 镜像到 harbor 的时候, 有报错:

blob upload unknown

了解到这个哥们在 harbor 前面加了 Nginx.

他在 Nginx 配置里有 proxy_set_header Host $http_host 这个,我们把这个注释后,reload 了一下 Nginx,就可以了。

这个问题初步判断,是不是 harbor 会对 Host 的值进行验证。这个后续再去探究。

Docker 企业级镜像仓库 Harbor 的搭建与维护的更多相关文章

  1. Docker: 企业级镜像仓库Harbor的使用

    上一节,演示了Harbor的安装部署 这次我们来讲解 Harbor的使用. 我们需要了解到: 1. 如何推镜像到镜像仓库 2. 如何从镜像仓库拉取镜像 3. 如何运行从私有仓库拉取的镜像 # 查看 h ...

  2. 【Docker】企业级镜像仓库harbor的搭建(http/https)及使用

    一:用途 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器. 二:安装docker-ce 环境:阿里云轻量应用服务器CentOS 7.3 这里通过yum Docker源仓 ...

  3. 企业级Docker容器镜像仓库Harbor的搭建

    Harbor简述 Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理 ...

  4. docker企业级镜像仓库Harbor管理

    Harbor概述 Harbor是由VMWare公司开源的容器镜像仓库.事实上,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括: ...

  5. Docker: 企业级镜像仓库Harbor部署(http)

    Harbor离线安装包下载地址:https://github.com/goharbor/harbor Docker compose(安装harbor需要用到docker compose)下载地址:ht ...

  6. Docker企业级镜像仓库harbor(vmware 中国团队)

    第一步:安装docker和docker-compose 第二步:下载harbor-offline-installer-v1.3.0.tgz 第三步:上传到/opt,并解压 第四步:修改harbor.c ...

  7. docker企业级镜像仓库harbor

    第一步:安装docker和docker-compose 第二步:下载harbor-offine-installer-v1.5.1.tgz 第三步:上传到/opt,并解压 第四步:修改harbor.cf ...

  8. 企业级镜像仓库harbor搭建

    企业级镜像仓库harbor搭建 一.    Harbor概述 VMware公司最近开源了企业级Registry项目Harbor,其的目标是帮助用户迅速搭建一个企业级的Docker registry 服 ...

  9. 企业级镜像仓库 harbor

    企业级镜像仓库 harbor 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:跨 Docker 宿主机网络 overlay 类型 h ...

随机推荐

  1. JS中不同类型的值比较问题

    我们比较数据的时候大多是以下两种情况: 3 > 4 ; "m" > "n" ; 但有时候可能会出现比较符号两侧的数据类型不相同的场景,例如 5 &g ...

  2. 红米note.线刷

    1.第一代 红米note 时间:20180121 这次 线刷之后,摄像头还是模糊,扫描小一点的二维码的时候 还是一片模模糊糊... 2.ZC:我下载的“通用刷机工具”名为:MiFlash2017-12 ...

  3. Vue2.0项目

    什么是 Vue Vue 是一个前端框架,特点是 数据绑定 比如你改变一个输入框 Input 标签的值,会 自动同步 更新到页面上其他绑定该输入框的组件的值  组件化 页面上小到一个按钮都可以是一个单 ...

  4. Git教程(二)-如何上传和同步自己的git项目

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Git接触并使用多年, 工作中使用较多,它的分布式存储,使每个人的电脑均为服务器的策略非常棒:再加上 ...

  5. PHP基于单例模式编写PDO类的方法

    一.单例模式简介 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 二.为什么要使用PHP单例模式? 1.php的应用主要在于数据库应用, 所以一个应用中会存在 ...

  6. Python中进度条如何实现

    print源码,参数end默认值为换行符,需要置成空,就会实现打印一行的效果 import time for i in range(100): time.sleep(1)#sleep一秒再输出 # 需 ...

  7. web.config中httpRedirect - 重定向单个页面

    例:在下面的例子中,“目录包含page1.htm,page2.htm,page3.htm和page4.htm.如下所示的web.config文件将执行以下操作/pages/page1.htm会重定向到 ...

  8. 自定义ajax小工具以及使用

    function createXMLHttpRequest(){ try{ return new XMLHttpRequest(); }catch(e){ try{ return new Active ...

  9. 06 - Django应用第三步

    知识点 1) 编写urls 配合include()的URL查找过程 获取正则抓取的值并命名, 给url取名 2) 模板的编写 for循环的遍历 用点的方式执行函数, 不带括号 3) 视图函数的编写 H ...

  10. freeMarker(十二)——模板语言补充知识

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.特殊变量参考 特殊变量是由FreeMarker引擎自己定义的变量. ...