使用Harbor搭建私有仓库
安装需求(以harbor版本为准):
-
python版本大于2.7
-
docker引擎版本大于1.10
-
docker compose版本大于1.6.0
harbor安装:
官方地址:https://github.com/vmware/harbor/releases
https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.3.tgz
Harbor介绍:
Harbor是VMware公司开源的企业级的DockerRegistry项目,其目标是帮助用户迅速搭建一个企业级的docker仓库服务;它以Docker公司开源的Registry为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成,以及审计日志(Auditlogging)等企业用户需求的功能,同时还支持中文;
Harbor的每个组件都是以Docker容器的形式构建的,使用docker compose来对它进行部署;用于部署harbor的docker compose模板位于/Deployer/docker-compose.yml,由5个容器组成(新版本好像不止5个),这几个容器通过docker link 的形式连接在一起,在容器之间通过容器名字相互访问,对终端用户而言,只要暴露proxy(即nginx)的服务端口;
-
Proxy:由nginx服务器构成的反向代理;
-
Registry:由Docker官方的开源的registry镜像构成的容器实例;
-
UI:即架构中的core services,构成此容器的代码是Harbor项目的主体;(也就是说,harbor最大的作用是提供了web界面)
-
MySQL:由官方MySQL镜像构成的数据库容器;存放用户访问控制数据;
-
Log:运行着rsyslogd的容器,通过log-driver的形式收集其他容器的日志;
Harbor特点:
-
基于角色控制:用户和仓库都是基于项目进行组织的,而用户基于项目可以拥有不同的权限;
-
基于镜像的复制策略:镜像可以在多个harbor实例之间进行复制;
-
支持LDAP:harbor的用户授权可以使用已经存在的LDAP用户;
-
镜像删除&垃圾回收:image可以被删除并且回收image占用的空间,绝大部分的用户操作API,方便用户对系统进行扩展;
-
用户UI:用户可以轻松的浏览,搜索镜像仓库以及对项目进行管理;
-
轻松的部署功能:harbor提供了online,offline安装,除此之外还提供了virtualappliance安装;
-
harbor和docker registry的关系:harbor实质上是对docker registry做了封装,扩展了自己的业务模块;
Harbor认证过程:
-
docker daemon从docker registry拉取镜像;
-
如果docker registry需要进行授权时(私有仓库),registry将会返回401 Unauthorized响应,同时在响应中包含了docker client如何进行认证的信息;
-
docker client根据registry返回的信息,向auth server发送请求获取认证token;
-
auth server根据自己的业务实现去验证提交的用户信息是否符合业务要求;
-
用户数据仓库返回用户的相关信息;
-
auth server将会根据查询的用户信息,生成token令牌,以及当前用户所具有的相关权限信息;
上述就是完整的授权过程,当用户完成上述过程后便可执行相关的pull/push操作,认证信息会每次都带在请求头中;
Harbor整体架构:
Harbor认证流程:
-
首先,请求被代理容器监听拦截,并跳转到指定的认证服务器;
-
如果认证服务器配置了权限认证,则会返回401,通知docker client 在特定的请求中需要带上一个合法的token,而认证的逻辑地址则指向架构图中的core services;
-
当docker client 接收到错误code 后,client就会发送认证请求(带有用户名和密码)到core services 进行basic auth认证;
-
当client的请求发给nginx后,nginx会根据配置的认证地址将带有用户名和密码的请求发送到core services;
-
core services获取用户名和密码后,对用户信息进行验证(自己的数据库或者介入LDAP都可以),成功后,返回认证成功信息;
部署:
检查环境:
[root@localhost ~]# python
Python 2.7.5 (default, Nov 16 2020, 22:23:17)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
[root@localhost ~]# docker --version
Docker version 19.03.0, build aeac9490dc
[root@localhost ~]# docker-compose --version
docker-compose version 1.20.0, build ca8d3c6
准备安装包:
harbor-offline-installer-v1.8.3.tgz
解压:
tar -zxvf harbor-offline-installer-v1.8.3.tgz
mv harbor /usr/local/
因为harbor默认使用443端口,所以需要使用证书(新版本貌似默认是80);
创建一个2048位的加密私钥:
[root@localhost ~]# openssl genrsa -des3 -out server.key 2048
创建证书请求:
[root@localhost ~]# openssl req -new -key server.key -out server.csr
Common Name (eg, your name or your server's hostname) []:hub.giao.com
因为此证书,在启动nginx时,它会让我们去输入这个私钥的密码,但此时nginx是放在容器中运行的,启动时无法及时的输入证书中的密码,所以就会报错退出,因此,证书在启动的时候就不能包含密钥,因此需要退密钥操作;
备份密钥:
[root@localhost ~]# cp server.key server.key.backup
退密钥:
[root@localhost ~]# openssl rsa -in server.key.backup -out server.key
生成证书:
[root@localhost ~]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
将证书,密钥等放在指定目录:
[root@localhost ~]# mkdir -p /data/cert
[root@localhost ~]# mv server.* /data/cert
[root@localhost ~]# cd /usr/local/harbor
[root@localhost harbor]# ll
total 569632
-rw-r--r--. 1 root root 583269670 Sep 15 2019 harbor.v1.8.3.tar.gz
-rw-r--r--. 1 root root 4519 Sep 15 2019 harbor.yml # 配置文件
-rwxr-xr-x. 1 root root 5088 Sep 15 2019 install.sh # 安装脚本,会从配置文件中读取配置
-rw-r--r--. 1 root root 11347 Sep 15 2019 LICENSE
-rwxr-xr-x. 1 root root 1654 Sep 15 2019 prepare
[root@localhost harbor]# vim harbor.yml
hostname: hub.giao.com
# http related config
#http:
# port for http, default is 80. If https enabled, this port will redirect to https port
# port: 80
# https related config
https:
# # https port for harbor, default is 443 port: 443
port: 443
# # The path of cert and key files for nginx
certificate: /data/cert/server.crt
private_key: /data/cert/server.key
配置文件中还包含harbor的管理员密码,数据库密码等;
安装:
[root@localhost harbor]# ./install.sh
...
[Step 3]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-db ... done
Creating registry ... done
Creating registryctl ... done
Creating redis ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating harbor-portal ... done
Creating nginx ... done
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at https://hub.giao.com.
For more details, please visit https://github.com/goharbor/harbor .
[root@localhost harbor]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
74cb5e51898a goharbor/nginx-photon:v1.8.3 "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
44e940f1650b goharbor/harbor-portal:v1.8.3 "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes (healthy) 80/tcp harbor-portal
6128ccb0e429 goharbor/harbor-jobservice:v1.8.3 "/harbor/start.sh" 2 minutes ago Up 2 minutes harbor-jobservice
67ba5b5131a6 goharbor/harbor-core:v1.8.3 "/harbor/start.sh" 2 minutes ago Up 2 minutes (healthy) harbor-core
40e9f2a0c2d9 goharbor/redis-photon:v1.8.3 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 6379/tcp redis
66f258a03c85 goharbor/harbor-db:v1.8.3 "/entrypoint.sh post…" 2 minutes ago Up 2 minutes (healthy) 5432/tcp harbor-db
d4877bbc7ca6 goharbor/harbor-registryctl:v1.8.3 "/harbor/start.sh" 2 minutes ago Up 2 minutes (healthy) registryctl
4a601c1db422 goharbor/registry-photon:v2.7.1-patch-2819-v1.8.3 "/entrypoint.sh /etc…" 2 minutes ago Up 2 minutes (healthy) 5000/tcp registry
a5ceccf4c9bd goharbor/harbor-log:v1.8.3 "/bin/sh -c /usr/loc…" 2 minutes ago Up 2 minutes (healthy) 127.0.0.1:1514->10514/tcp harbor-log
注意修改hosts文件解析!
创建普通用户:
普通用户新建私有仓库(此处不要勾选公开):
服务器指定镜像仓库地址:
vim /etc/docker/daemon.json
{
"insecure-registries": ["hub.giao.com"]
}
systemctl restart docker
vim /etc/hosts
192.168.10.123 hub.giao.com
[root@localhost ~]# docker tag tomcat:v1.0 hub.giao.com/hamburger/tomcat:v1.0
因为是私有仓库,需要使用用户名和密码进行登录(不写地址是登录的官方仓库):
[root@localhost ~]# docker login hub.giao.com
Username: laoba
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
推送镜像到私有仓库:
[root@localhost ~]# docker push hub.giao.com/hamburger/tomcat:v1.0
客户端下载:
修改仓库地址,修改hosts解析,先进行登录认证,再正常拉取镜像使用;