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