Docker 企业级镜像仓库 Harbor 的搭建与维护

一、什么是 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 的值进行验证。这个后续再去探究。

相关文章

最近一直在开发Apworks框架的案例代码,同时也在一起修复Apw...
最近每天都在空闲时间努力编写Apworks框架的案例代码WeText。...
在《Kubernetes中分布式存储Rook-Ceph部署快速演练》文章中,...
最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...
CentOS下Docker与.netcore(一) 之 安装 CentOS下Docker与.ne...