一、首先探究Docker仓库分类?

  • 1、公有仓库(docker hub、阿里云仓库、网易云仓库等)
  • 2、私有仓库(harbor、docker-registry)

Docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。Harbor是由VMware团队负责开发的开源企业级Docker Registry,

二、What is Harbor?

Harbor is an open source cloud native registry that stores, signs, and scans container images for vulnerabilities.

Harbor solves common challenges by delivering trust, compliance, performance, and interoperability. It fills a gap for organizations and applications that cannot use a public or cloud-based registry, or want a consistent experience across clouds.

三、首先介绍下Horbar组件

如上图所示,Harbor包含6个组件:

  • Proxy: Harbor的组件,例如注册表,UI和令牌服务,都在反向代理之后。代理将来自浏览器和Docker客户端的请求转发给各种后端服务。

  • Registry: 负责存储Docker镜像和处理Docker pull/push命令。由于Harbor需要对图像强制实施访问控制,因此Registry会将客户端定向到token,以获取每个pull/push有效的token。

  • Core services: horbar的核心功能,主要提供以下服务:

    • UI: 一个图形用户界面,用于帮助用户管理Registry;
    • Webhook: 是一种在Registry中配置的机制,因此可以将Registry中的图像状态更改填充到Harbor的Webhook端点。Harbor使用webhook更新日志,启动复制和其他一些功能;
    • Token:负责根据用户的项目角色为每个docker push / pull命令发出令牌。如果从Docker客户端发送的请求中没有令牌,则注册表会将请求重定向到令牌服务;
  • Database: 数据库存储项目,用户,角色,复制策略和图像的元数据。

  • Job services: 用于图像复制,本地图像可以复制(同步)到其他Harbor实例。

  • Log collector: 负责收集其他模块的日志。

四、Docker登陆过程

  • (a)通过端口80监听的代理容器接收该请求。容器中的Nginx将请求转发给后端的Registry容器。

  • (b)注册表容器已配置为基于token的身份验证,如果验证失败将会返回错误代码401,通知Docker客户端从指定的URL获取有效token。在Harbor中,此URL指向Core Services的token服务;

  • (c)当Docker客户端收到错误代码时,它会向token服务URL发送请求,根据HTTP规范的基本身份验证在请求头中带上用户名和密码;

  • (d)在通过端口80将该请求发送到代理容器之后,Nginx再次根据预先配置的规则将请求转发到UI容器。UI容器内的token服务接收请求,解码请求并获取用户名和密码;

  • (e)获取用户名和密码后,token服务检查数据库并通过MySql数据库中的数据对用户进行身份验证。为LDAP / AD身份验证配置token服务时,它将向外部LDAP / AD服务器发起请求进行身份验证。身份验证成功后,token服务将返回指示成功的HTTP代码。HTTP响应主体包含由私钥生成的token。

五、Harbor高可用方案有哪些?

在日常维护中,仓库对于我们来说,可谓十分重要。当生产仓库当宕机后,而不能快速恢复时候,对开发和业务影响甚大,建议在日常运维中采取相对高可用方案,最起码保证数不会丢失。

Harbor高可用可包括以下方案:

  • 多实例共享后端存储(采取挂载文件系统方式)
  • 多实例相互数据同步(基于镜像复制模式)

六、Horbar安装与配置

6.1、安装方式

  • 在线下载安装: 安装程序从Docker hub下载Harbor的镜像
  • 离线脱机安装: 当主机不能上网时候可使用此安装程序

建议使用最新稳定版离线脱机安装,相关程序包下载地址为:https://github.com/goharbor/harbor/releases

基础环境

  • 系统版本: CentOS Linux release 7.4.1708 (Core)
  • Harbor版本: harbor-offline-installer-v1.7.1.tgz

注意:安装前需要安装Compose

6.2、在Linux系统上安装Compose

6.2.1 运行此命令以下载最新版本的Docker Compose:
1
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
6.2.2 对二进制文件应用可执行权限:
1
sudo chmod +x /usr/local/bin/docker-compose

注意:如果docker-compose安装后命令失败,请检查路径。您还可以创建/usr/bin路径中的符号链接或任何其他目录。

1
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

6.2.3 验证:
1
2
3
4
5
[root@k8s-node1 harbor]# docker-compose version 
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.7
OpenSSL version: OpenSSL 1.1.0f 25 May 2017

6.3 配置参数

horbar配置参数位于文件harbor.cfg中,在harbor.cfg中有两类参数,

  • 必需参数: 需要在配置文件中设置这些参数。如果用户更新它们harbor.cfg并运行install.sh脚本以重新安装Harbor,它们将生效。
  • 可选参数: 这些参数对于更新是可选的,即用户可以将它们保留为默认值,并在启动Harbour后在Web Portal上更新它们。如果它们已经启用harbor.cfg,它们只会在首次启动Harbour时生效。harbor.cfg将忽略对这些参数的后续更新。

重要的几个参数(如需要用到其它参数可以参考官方文档)

  • hostname: 目标主机的主机名,不建议使用localhost或127.0.0.1作为主机名
  • ui_url_protocol: 访问使用协议为http或https,默认为http
  • db_password: 用于db_auth的PostgreSQL数据库的root密码
  • max_job_workers: (默认值为10)作业服务中的最大复制工作数
  • ssl_cert: SSL证书的路径,仅在协议设置为https时应用
  • ssl_cert_key: SSL密钥的路径,仅在协议设置为https时应用
  • harbor_admin_password: 管理员的初始密码。此密码仅在Harbor首次启动时生效。之后,将忽略此设置,并且应在Portal中设置管理员密码。请注意,默认用户名/密码为admin / Harbor12345
  • auth_mode: 使用的身份验证类型。默认情况下,它是db_auth

6.4 安装harbor

6.4.1 推荐离线安装
下载程序包:https://github.com/goharbor/harbor/releases
1
wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.1.tgz
建议使用https增加安全性

由于Harbor未附带任何证书,因此默认情况下使用HTTP来提供注册表请求。但是,强烈建议为任何生产环境启用安全性。Harbor有一个Nginx实例作为所有服务的反向代理,您可以使用prepare脚本配置Nginx以启用https。

在测试或开发环境中,您可以选择使用自签名证书,而不是来自受信任的第三方CA的证书。以下内容将向您展示如何创建自己的CA,并使用您的CA签署服务器证书和客户端证书。

获得证书授权
1
2
3
4
5
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=yourdomain.com" \
-key ca.key \
-out ca.crt
获得服务器证书

假设您的注册表的主机名是yourdomain.com,并且其DNS记录指向您正在运行Harbor的主机。在生产环境中,您首先应该从CA获得证书。在测试或开发环境中,您可以使用自己的CA. 证书通常包含.crt文件和.key文件,例如yourdomain.com.crt和yourdomain.com.key。

  • 1)创建自己的私钥:

    1
    openssl genrsa -out yourdomain.com.key 4096
  • 2)生成证书签名请求:

如果您使用像yourdomain.com这样的FQDN 连接注册表主机,那么您必须使用yourdomain.com作为CN(通用名称)。

1
2
3
4
openssl req -sha512 -new \
-subj "/C=TW/ST=Taipei/L=Taipei/O=example/OU=Personal/CN=yourdomain.com" \
-key yourdomain.com.key \
-out yourdomain.com.csr

  • 3)生成注册表主机的证书:

无论您是使用类似yourdomain.com的 FQDN 还是IP来连接注册表主机,请运行此命令以生成符合主题备用名称(SAN)和x509 v3扩展要求的注册表主机证书:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=yourdomain.com
DNS.2=yourdomain
DNS.3=hostname
EOF

openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in yourdomain.com.csr \
-out yourdomain.com.crt
6.4.2 配置harbor

复制证书和密钥(建议使用外网域名购买的证书,docker pull/push 默认走https)

1
2
cp yourdomain.com.crt /data/cert/
cp yourdomain.com.key /data/cert/

修改配置文件

1
2
3
4
hostname = 192.168.0.6
ui_url_protocol = https
ssl_cert = /data/cert/yourdomain.com.crt
ssl_cert_key = /data/cert/yourdomain.com.key

为Harbor生成配置文件

1
./prepare

安装harbor

1
./install.sh

如果安装过程出现以下错误,请确认Docker Compose是否安装成功!

1
✖ Need to install docker-compose(1.7.1+) by yourself first and run this script again.

6.4.3 如外接pg配置,新版暂时不支持mysql(https://github.com/goharbor/harbor/issues/6534
harbor.cfg配置如下:
1
2
3
4
db_host = 192.168.32.18
db_password = password
db_port = 5432
db_user = harbor
安装和配置
1
2
3
4
5
6
7
8
9
10
yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-1.noarch.rpm
#安装客户端
yum install postgresql10
#安装服务端
yum install postgresql10-server

#初始化和启动
postgresql-setup initdb
systemctl enable postgresql.service
systemctl start postgresql.service

具体可参考:https://www.postgresql.org/download/linux/redhat/

创建用户和数据库
1
2
3
4
5
6
7
8
9
10
CREATE DATABASE registry;
CREATE USER harbor WITH PASSWORD 'password';
CREATE DATABASE registry OWNER harbor;
GRANT ALL PRIVILEGES ON DATABASE registry to harbor;

# 修改 postgresql.conf
listen_addresses = '*'

# 修改pg_hba.conf
host all all 0.0.0.0/0 md5
踩坑记录
踩坑之一:用户界面无法登陆

解决:
1、docker ps 发现harbor-adminserver 不断重启

1
bf880eb451cd        goharbor/harbor-adminserver:v1.7.1       "/harbor/start.sh"       48 seconds ago      Restarting (1) 17 secons ago                                                                         harbor-adminserver

2、查看日志发现以下

1
2
Jan 30 08:48:29 172.22.0.1 adminserver[64872]: 2019-01-30T00:48:29Z [INFO] the path of key used by key provider: /etc/adminserverkey
Jan 30 08:48:29 172.22.0.1 adminserver[64872]: 2019-01-30T00:48:29Z [FATAL] [main.go:45]: failed to initialize the system: read /tc/adminserver/key: is a directory

3、由于修改了secretkey_path in harbor.cfg,并没有更改docker-compose.yml配置导致,修改后docker-compose.yml执行以下命令即可:

1
2
3
docker-compose down
./prepare
docker-compose up -d

参考:

Comments

2019-02-18