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在目标主机上要求安装的软件:
- Docker Engine:17.06.0-ce +版或更高版本,安装可参考Docker在CentOS7上的安装及常用命令。
- Docker Compose:1.18.0版或更高版本,安装可参考Docker Compose在Linux上的安装。
- Openssl:首选最新版本,用于生成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 | 配置 | 操作系统 | Docker | Docker Compose | Harbor | 备注 |
---|---|---|---|---|---|---|---|
harbor-server | 192.168.1.6 | 4C4G | CentOS Linux release 8.1.1911 | 19.03.11 | 1.26.0 | v2.0.1 | Harbor镜像仓库服务器,Docker和Docker Compose必须安装,Haebor选择v2.01 |
docker-client | 192.168.1.8 | 4C2G | CentOS Linux release 8.1.1911 | 19.03.11 | 1.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
文件。
通过以下命令或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镜像仓库搭建成功。下面在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
下面进行镜像推送,注意推送至library
项目必须先登录具有library
管理权限的用户,而登录的admin用户默认就具有library
的管理权限,所以可以推送。执行以下命令给redis:alpine
镜像打上TAG并推送至harbor.domain.com
的library
中:
docker tag redis:alpine harbor.domain.com/library/myredis:v1
docker push harbor.domain.com/library/myredis:v1
查看Harbor镜像仓库library
项目发现推送成功:
注意:如果使用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
,登录成功:
登出harbor.domain.com
:
docker logout harbor.domain.com
拉取镜像:
docker pull harbor.domain.com/library/myredis:v1
拉取镜像成功,因为library
在Harbor中是公开项目,所以不用登陆也能拉取镜像,但推送至library
必须先登录具有library
管理权限的用户。
3.创建Harbor用户并赋予项目权限
在Harbor仓库管理页面创建一个新用户:
使用rtxtitanv用户登录harbor.domain.com
并推送一个镜像至library
,发现没有权限:
在library
项目下的成员中添加rtxtitanv用户,赋予用户该项目的管理权限,有以下5种权限,这里选项目管理员:
再次上传,发现上传成功:
4.创建Harbor项目并验证访问权限
新建一个名为myproject
的项目,访问级别设置为私有,不设置存储容量上限:
然后赋予rtxtitanv用户该项目的管理权限后,推送一个harbor.domain.com/myproject/myredis:v3
镜像至myproject
:
然后在harbor-server
主机拉取这个镜像,如果登录了用户先登出再拉取,发现没有权限:
这里为了演示再创建一个名为harbortest的用户,没有赋予myproject
项目的管理权限,登录harbortest用户拉取镜像,发现依然没权限:
然后登录赋予了myproject
管理权限的rtxtitanv用户拉取镜像,拉取成功:
说明私有访问级别的项目必须登录具有该项目管理权限的用户才能进行推送和拉取镜像。