搭建企业级镜像库Harbor(1.10)
现在已经是容器化时代,加上 Kubernetes 的助力,基本上应用都是跑在容器里。
企业使用容器,大部分是需要自己的镜像仓库服务器的,Docker官方发布了镜像仓库容器 registry,普通使用问题不大,不过在权限、管理上不是特别方便。
基于此,VMware
开源了企业级registry:Harbor
,提供权限控制,更安全、性能更高,可以方便的管理镜像仓库,同时还有WEB管理界面,可谓是应有尽有。
本文将介绍如何搭建Harbor
(版本1.10),Harbor
的搭建并不复杂,但对于新手上路来说,还是挺多步骤的,想一次点亮也不是件容易事。
环境准备
- 系统:CentOS 7.7
- docker 19.03.7
- docker-compose 1.18.0
- Nginx 1.14.2,需要开启ssl模块,通过
nginx -V
查看有没有--with-http_ssl_module
- 搭建域名:harbor.yourhost.com
硬件需求:
Resource | Minimum | Recommended |
---|---|---|
CPU | 2 CPU | 4 CPU |
Mem | 4 GB | 8 GB |
Disk | 40 GB | 160 GB |
搭建方式
Harbor 自带 https 功能,我们想使用 https 默认端口 443 ,但又不希望机器端口被 Harbor 独占,所以我们不开启 Harbor 的 https 功能,使用 Nginx 进行代理。
所以整个搭建过程主要步骤为:
- 搭建 Harbor 服务
- 生成自签名 ssl 证书
- Nginx HTTPS 代理
- 客户端信任自签名证书,才能正常访问服务
搭建 Harbor 服务
下载安装包
首先我们需要下载 Harbor 的安装包,官方提供了两个选择:在线安装包、离线安装包。
它们的区别是离线包将需要的镜像都打包好了,安装的时候会自动加载镜像,基于某些不可描述的原因,我们选择离线包。
离线包可以在 这里 下载
现在,我们拥有了安装包harbor-offline-installer-v1.10.1.tgz
,并打算将 Harbor 放置在/data/harbor
:
1 | mkdir /data |
现在我们的/data/harbor
将会是:
1 | 用 data 来放置 harbor 产生的内容 |
配置启动 Harbor
现在进入/data/harbor
,编辑文件harbor.yml
:
hostname
改为:harbor.yourhost.comhttp.port
改为:8000,这是 Harbor 监听的 http 端口- 解开
external_url
注释,值改为:https://harbor.yourhost.com harbor_admin_password
是默认管理员admin
的密码,修改成你要的密码database
是Harbor的数据库,看自己情况要不要修改data_volume
改为:/data/harbor/datalog.level
修改为:errorlog.local.location
改为:/data/harbor/log- 将
https
的内容注释掉 - 其他的默认即可。像 redis 之类的要不要用外部服务,根据自己需要决定。
配置完成后,我们执行./install.sh
进行安装。
假设一切顺利,我们便可以成功开启Harbor
服务。我们可以通过docker-compose ps
查看是否成功启动:
1 | Name Command State Ports |
curl localhost:8000
你应该能看到 Harbor 返回的页面信息,这个时候,Harbor 的 http 服务已经开启起来。
启动失败
基于不同的环境,install.sh 是有可能执行失败的,比如:
- 机器没有安装
docker-compose
,centos 的话就通过yum install docker-compose
安装一下。 - Harbor 启动了许多它依赖的容器,比如:nginx、redis,并且默认 container 名称就是 nginx、redis,假如我们机器上原本已经启动了相关容器,那容器名是可能冲突的。这时候需要修改 install 脚本生成的
docker-compose.yml
文件,找到相关容器的container_name
,修改成不会冲突的容器名。
配置HTTPS
接下来我们需要配置 Nginx 来代理 https。因为现在的 Docker 版本默认要求走 https。对于熟悉 Nginx 的童鞋来说配置不麻烦,出问题的大多可能还是自签名证书的环节。
生成自签名 ssl 证书
首先需要确保我们机器已经安装了openssl
,然后执行下面的命令(将里面的域名更换成自己的域名,days相关的代表的是证书的有效期,我们可以改长一些):
1 | openssl genrsa -out harbor.yourhost.com.ca.key 4096 |
执行完上面的命令后,会生成5
个证书:
- harbor.yourhost.com.ca.key
- harbor.yourhost.com.ca.crt
- harbor.yourhost.com.key
- harbor.yourhost.com.csr
- harbor.yourhost.com.crt
证书到此生成完毕,后面需要给到 Nginx 和 Docker 客户端使用。
Nginx配置访问
现在我们配置 Nginx 代理 Harbor。创建配置文件harbor.yourhost.com.conf
,内容为:
1 | server { |
创建完成,nginx -t
校验下,没问题后nginx -s reload
重新读取配置。
现在,我们访问一下试试:
1 | curl -k -H "Host:harbor.yourhost.com" https://localhost |
假设你 Nginx 不是放在 Harbor 的机器上,配置时记得将ip改一下。
上面 curl 我们用了 -k 参数,因为我们的证书是自签名证书,目前我们还没配置机器和Docker对证书的信任。这一步在后面进行。
下面这一步至关重要,如果没有配置好,会导致push镜像一直不成功,多次重试后报出EOF错误
进入Harbor目录,修改文件common/config/nginx/nginx.conf
,会看到文件中关于header(X-Forwarded-Proto)
有注明:1
# When setting up Harbor behind other proxy, such as an Nginx instance, remove the below line if the proxy already has similar settings
我们需要将有这句提示的proxy_set_header X-Forwarded-Proto $scheme;
都删除或者注释掉。
然后重启 Harbor 服务。
1 | docker-compose down |
客户端信任自签名证书
接下来我们需要配置对证书的信任。
为 Docker 配置自签名证书信任
通过上一步我们已经生成好了自签名证书,现在需要将它配置给docker客户端,需要连接仓库的机器客户端都要。
Docker 使用的是.cert
证书文件,我们需要进行转换:
1 | openssl x509 -inform PEM -in harbor.yourhost.com.crt -out harbor.yourhost.com.cert |
假设我们使用的不是默认的https端口(443),那放入的Docker文件夹名应该为
/etc/docker/certs.d/harbor.yourhost.com:端口/
然后重启 Docker 引擎:systemctl restart docker
现在,我们可以使用Docker正常地使用Harbor仓库(当然还要把域名解析配置好):
1 | 默认管理员账号是admin,密码要对应回前面启动Harbor时配置里设置的。 |
有时候我们可能需要多配置一个环节,机器对证书的信任。
将证书 harbor.yourhost.com.ca.crt 复制到 /etc/pki/ca-trust/source/anchors/,然后执行 update-ca-trust。
可能出现的问题
- 发现Harbor访问有异常情况时,可以在Harbor目录执行
docker-compose ps
,查看相关进程是否处于UP
状态。 - 不要随便执行
install
和prepare
脚本,会重置配置,如果执行了,记得修改common中Nginx的配置。(参考上文提到的)
总结
第一次搭建 Harbor 的过程是繁琐的,很可能遇到许多奇奇怪怪的问题(大多数是流程做错了),但只要搭过一次,就很顺利了。
这里的 Harbor 是单点,后面假设有时间的话,介绍下如何搭建 HA 版本的 Harbor。
参考
- 本文链接:https://keepmoving.ren/devops/docker-registry-harbor/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!