搭建Harbor私有镜像仓库

Docker容器应用的开发和运行离不开可靠的镜像管理,部署一个私有的镜像仓库是十分有必要的。虽然Docker官方提供了docker-registry用于构建私有的镜像仓库。但它的功能没有Harbor丰富,而Harbor提供了包括权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面等功能,基本满足企业级需求,应用也很广泛。

本文主要对搭建Harbor私有镜像仓库进行简单总结。

一、Harbor简介

Harbor是为企业用户设计的容器镜像仓库开源项目,提供了包括权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册、HA和中文支持等企业必需的功能。Harbor还是CNCF(云原生计算基金会)的一个项目,提供合规性,高性能和互操作性,以帮助跨例如Kubernetes和Docker等云原生计算平台的项目进行持续和安全地管理。

二、前置条件

Harbor将被部署为多个Docker容器。因此,可以将其部署在任何支持Docker的Linux发行版上。搭建Harbor镜像仓库所需的具体前置条件如下。

1.硬件

部署Harbor最低和推荐的硬件配置:

  • CPU:最低2CPU,推荐4CPU。
  • 内存:最低4GB,推荐8GB。
  • 磁盘:最低40GB,推荐160GB。

2.软件

Harbor在目标主机上要求安装的软件:

3.网络端口

Harbor在目标主机上要求开放以下端口:

  • 443:HTTPS协议,Harbor在此端口上接收HTTPS请求。可以在配置文件中更改。
  • 4443:HTTPS协议,Harbor与Docker内信任服务间的连接。仅在启用Notary的情况下才需要。可以在配置文件中更改。
  • 80:HTTP协议,Harbor在此端口上接收HTTP请求。可以在配置文件中更改。

三、环境信息

准备两台主机,这里使用的是虚拟机,harbor-server用来搭建Harbor镜像仓库,这里选择搭建v2.0.1版的Harbor仓库,docker-client用来演示登录、推送和拉取等基本操作。这里harbor-server满足搭建的前置条件,两台主机均安装了Docker和Docker Compose。具体环境如下:

主机名ip配置操作系统DockerDocker ComposeHarbor备注
harbor-server192.168.1.64C4GCentOS Linux release 8.1.191119.03.111.26.0v2.0.1Harbor镜像仓库服务器,Docker和Docker Compose必须安装,Haebor选择v2.01
docker-client192.168.1.84C2GCentOS Linux release 8.1.191119.03.111.26.0/运行Docker的普通服务器,Docker必须安装,Docker Compose可选安装

四、下载安装

Harbor安装包分为在线安装包和离线安装包:

  • 在线安装包:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小。
  • 离线安装包:包含预构建的镜像,因此安装包较大。推荐使用离线安装包。

1.手动下载并上传至目标服务器

可以从官方发布页面下载指定版本的Harbor离线或在线安装包,如下图所示:
手动下载安装包
然后上传到目标服务器。这里上传到harbor-server主机/usr/local目录下并进入/usr/local目录。

2.通过命令下载

也可以通过命令在目标服务器即harbor-server下载安装包,先安装wget:

yum install -y wget

进入/usr/local目录:

cd /usr/local

下载离线安装包:

wget https://github.com/goharbor/harbor/releases/download/v2.0.1/harbor-offline-installer-v2.0.1.tgz

下载在线安装包:

wget https://github.com/goharbor/harbor/releases/download/v2.0.1/harbor-online-installer-v2.0.1.tgz

3.解压安装包

解压离线安装包:

tar -zxvf harbor-offline-installer-v2.0.1.tgz

解压在线安装包:

tar -zxvf harbor-online-installer-v2.0.1.tgz

这里使用的离线安装包安装。解压完成后进入/usr/local/harbor目录:

cd harbor

五、配置对Harbor的HTTPS访问

在开发和测试环境中,可以使用HTTP访问,但在生产环境,最好使用HTTPS。默认情况下,Harbor不附带证书。要配置HTTPS,必须创建SSL证书。可以使用由受信任的第三方CA机构签名的证书,也可以使用自签名证书。这里使用openssl创建自签名证书,如果没安装openssl工具的可以执行以下命令安装,有openssl工具就直接跳过:

yum install -y openssl 

下文中的harbor.domain.com为自定义的域名,也可以使用ip地址。

1.生成CA证书

生成CA证书私钥:

openssl genrsa -out ca.key 4096

生成CA证书:

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Chongqing/L=Chongqing/O=RtxTitanV/OU=Personal/CN=harbor.domain.com" \
 -key ca.key \
 -out ca.crt

2.生成服务器证书

生成私钥:

openssl genrsa -out harbor.domain.com.key 4096

生成证书签名请求(CSR):

openssl req -sha512 -new \
    -subj "/C=CN/ST=Chongqing/L=Chongqing/O=RtxTitanV/OU=Personal/CN=harbor.domain.com" \
    -key harbor.domain.com.key \
    -out harbor.domain.com.csr

生成一个v3版x509扩展文件:

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor.domain.com
EOF

如果没有使用域名而是直接使用ip地址,则执行以下命令生成v3版x509扩展文件:

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:192.168.1.6
EOF

使用该v3.ext文件为Harbor主机生成证书:

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

3.将证书提供给Harbor和Docker

在Harbor主机创建证书目录并将服务器证书和密钥复制到该目录下:

mkdir -p /data/cert/harbor/ && cp harbor.domain.com.crt harbor.domain.com.key /data/cert/harbor/

harbor.domain.com.crt转化为harbor.domain.com.cert供Docker使用,Dockr守护进程将.crt文件看成CA证书,将.cert看成客户端证书:

openssl x509 -inform PEM -in harbor.domain.com.crt -out harbor.domain.com.cert

在Harbor主机创建Docker证书目录并将服务器证书、密钥和CA证书复制到该目录下:

mkdir -p /etc/docker/certs.d/harbor.domain.com/ && cp harbor.domain.com.cert harbor.domain.com.key ca.crt /etc/docker/certs.d/harbor.domain.com/

如果将默认的nginx端口443映射到其他端口,需创建/etc/docker/certs.d/altrialily.com:port文件夹或/etc/docker/certs.d/harbor_IP:port

重启Docker:

systemctl restart docker

4.修改Harbor配置文件

v2.0.1版本Harbor配置文件名为harbor.yml.tmpl,将它拷贝到一份新的文件,名为harbor.yml

cp harbor.yml.tmpl harbor.yml

使用vi编辑器修改配置:

vi harbor.yml

修改如下配置:

# 设置访问地址,可以设置ip或域名
# 不能使用localhost或127.0.0.1,因为需要被外部客户端访问
hostname: harbor.domain.com

# http配置
http:
  # http端口,默认为80。如果启用https,该端口将重定向到https端口
  port: 8088

# https配置
https:
  # harbor的https端口,默认为443
  port: 443
  # 指定生成的服务器证书和私钥的路径
  certificate: /data/cert/harbor/harbor.domain.com.crt
  private_key: /data/cert/harbor/harbor.domain.com.key

# 设置Harbor登录密码,默认为Harbor12345,可以修改
harbor_admin_password: rtxtitanv

六、部署Harbor

Harbor使用一个nginx实例作为所有服务的反向代理,通过使用prepare脚本可以为nginx配置启用HTTPS。以下命令为运行prepare脚本以启用HTTPS:

./prepare

执行完成之后查看文件,生成了docker-compose.yml文件。
生成了docker-compose.yml文件
通过以下命令或sudo ./install.sh启动Harbor:

docker-compose up -d

查看容器,发现启动成功:
发现启动成功
如果想停止并删除所有实例(镜像不会删除),可以执行以下命令:

docker-compose down -v

下面验证Harbor是否部署成功,首先在Windows主机中访问Harbor仓库管理页面。由于是自定义域名,先打开C:\Windows\System32\drivers\etc\hosts文件,添加以下域名解析后保存:

192.168.1.6 harbor.domain.com

然后访问https://harbor.domain.com,出现Harbor登录页面,输入用户名密码登录:
Harbor登录页面
登录成功
能够访问Harbor仓库管理页面,说明Harbor镜像仓库搭建成功。下面在Windows主机中添加证书受信,先将ca.crt下载到Windows主机中,右键安装证书进行导入,选择本地计算机:
安装证书进行导入
选择将证书存储到受信任的根证书颁发机构:
将证书存储到受信任的根证书颁发机构
再次访问Harbor仓库管理页面,不会提示不安全连接了:
不会提示不安全连接了

七、Harbor基本使用

1.在Harbor主机登录Harbor仓库并推送镜像

下面在Harbor主机即harbor-server主机登录Harbor仓库。执行以下命令添加域名解析:

cat >> /etc/hosts << EOF
192.168.1.6 harbor.domain.com
EOF

执行以下命令使用admin用户登录harbor.domain.com

docker login harbor.domain.com

admin用户登录成功
下面进行镜像推送,注意推送至library项目必须先登录具有library管理权限的用户,而登录的admin用户默认就具有library的管理权限,所以可以推送。执行以下命令给redis:alpine镜像打上TAG并推送至harbor.domain.comlibrary中:

docker tag redis:alpine harbor.domain.com/library/myredis:v1
docker push harbor.domain.com/library/myredis:v1

推送harbor.domain.com/library/myredis:v1镜像
查看Harbor镜像仓库library项目发现推送成功:
harbor.domain.com/library/myredis:v1镜像推送成功

注意:如果使用HTTP而不是HTTPS连接Harbor镜像仓库,由于Harbor默认不允许HTTP连接,则必须在Docker客户端主机中使用--insecure-registry将Harbor镜像仓库访问地址添加进允许连接访问的列表中。即在Docker客户端主机中使用vi编辑器修改/etc/docker/daemon.json文件:

vi /etc/docker/daemon.json

新增以下内容:

{
"insecure-registries" : ["这里填自己的域名或ip:这里填HTTP暴露的端口(80可省略)", "0.0.0.0"]
}

daemon.json更新后必须重启Docker客户端主机中的Docker和Harbor主机中的Harbor:

systemctl restart docker
docker-compose down -v
docker-compose up -d

2.在Docker客户端主机登录Harbor仓库并拉取镜像

下面在docker-client主机登录Harbor仓库。先在docker-client主机执行以下命令添加域名解析:

cat >> /etc/hosts << EOF
192.168.1.6 harbor.domain.com
EOF

然后将Harbor主机即harbor-server主机的Docker证书目录(/etc/docker/certs.d/harbor.domain.com/)复制到docker-client主机/etc/docker/certs.d/目录下,在harbor-server主机执行以下命令:

scp -r /etc/docker/certs.d/ root@192.168.1.8:/etc/docker/certs.d/

然后在docker-client主机使用admin用户登录harbor.domain.com,登录成功:
docker-client主机使用admin用户登录harbor.domain.com成功
登出harbor.domain.com

docker logout harbor.domain.com

登出harbor.domain.com
拉取镜像:

docker pull harbor.domain.com/library/myredis:v1

拉取镜像成功
拉取镜像成功,因为library在Harbor中是公开项目,所以不用登陆也能拉取镜像,但推送至library必须先登录具有library管理权限的用户。

3.创建Harbor用户并赋予项目权限

在Harbor仓库管理页面创建一个新用户:
在Harbor仓库管理页面创建一个新用户
使用rtxtitanv用户登录harbor.domain.com并推送一个镜像至library,发现没有权限:
使用rtxtitanv用户登录harbor.domain.com并推送一个镜像至library没有权限
library项目下的成员中添加rtxtitanv用户,赋予用户该项目的管理权限,有以下5种权限,这里选项目管理员:
在library项目下的成员中添加rtxtitanv用户,赋予用户该项目的管理权限
再次上传,发现上传成功:
再次上传
上传成功

4.创建Harbor项目并验证访问权限

新建一个名为myproject的项目,访问级别设置为私有,不设置存储容量上限:
新建一个名为myproject的项目
myproject的项目创建成功
然后赋予rtxtitanv用户该项目的管理权限后,推送一个harbor.domain.com/myproject/myredis:v3镜像至myproject
赋予rtxtitanv用户该项目的管理权限后推送一个harbor.domain.com/myproject/myredis:v3镜像至myproject
然后在harbor-server主机拉取这个镜像,如果登录了用户先登出再拉取,发现没有权限:
如果登录了用户先登出再拉取结果没有权限
这里为了演示再创建一个名为harbortest的用户,没有赋予myproject项目的管理权限,登录harbortest用户拉取镜像,发现依然没权限:
登录没有赋予myproject项目的管理权限的harbortest用户拉取镜像结果依然没权限
然后登录赋予了myproject管理权限的rtxtitanv用户拉取镜像,拉取成功:
然后登录赋予了myproject管理权限的rtxtitanv用户拉取镜像成功
说明私有访问级别的项目必须登录具有该项目管理权限的用户才能进行推送和拉取镜像。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RtxTitanV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值