Harbor私有镜像仓库无坑搭建
一、介绍
Docker容器应用的开发和运行路不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境的Registry也是非常必要的。 Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。
二、组件
用于部署 Harbor 的 Docker Compose 模板位于 /Deployer/docker-compose.yml. 打开这个模板文件,会发现 Harbor 由 5 个容器组成:
proxy:由 Nginx 服务器构成的反向代理。
registry:由 Docker 官方的开源 registry 镜像构成的容器实例。
ui:即架构中的 core services, 构成此容器的代码是 Harbor 项目的主体。
mysql:由官方 MySql 镜像构成的数据库容器。
log: 运行着 rsyslogd 的容器,通过 log-driver 的形式收集其他容器的日志。
这几个容器通过 Docker link 的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露 proxy (即 Nginx)的服务端口。
三、工作原理
假设我们将 Harbor 部署在主机名为 registry.abcdocker.com 的虚机上。用户通过 docker login 命令向这个 Harbor 服务发起登录请求:docker login registry.abcdocker.com当用户输入所需信息并点击回车后,Docker 客户端会向地址“registry.abcdocker.com/v2/” 发出 HTTP GET 请求。
Harbor 的各个容器会通过以下步骤处理:
(1)Docker login
(a) 首先,这个请求会由监听 80 端口的 proxy 容器接收到。根据预先设置的匹配规则,容器中的 Nginx会将请求转发给后端的 registry 容器;
(2) 在 registry 容器一方,由于配置了基于 token 的认证,registry 会返回错误代码 401,提示 Docker客户端访问 token 服务绑定的 URL。在 Harbor 中,这个 URL 指向 Core Services;
(3) Docker 客户端在接到这个错误代码后,会向token服务的URL发出请求,并根据HTTP协议的BasicAuthentication 规范,将用户名密码组合并编码,放在请求头部(header);
(4)类似地,这个请求通过 80 端口发到 proxy 容器后,Nginx 会根据规则把请求转发给 ui 容器,ui 容器监听 token 服务网址的处理程序接收到请求后,会将请求头解码,得到用户名、密码;
(5) 在得到用户名、密码后,ui 容器中的代码会查询数据库,将用户名、密码与 mysql 容器中的数据进行比对(注:ui 容器还支持 LDAP 的认证方式,在那种情况下 ui 会试图和外部 LDAP 服务进行通信并校验用户名/密码)。比对成功,ui 容器会返回表示成功的状态码, 并用密钥生成 token,放在响应体中返回给 Docker 客户端。这个过程中组件间的交互过程如下图所示
三、安装
| 环境 | ip | 主机名 |
|---|---|---|
| harbor-server | 100.100.157.10 | k8s-master01 |
| harbor-client | 100.100.157.11 | k8s-work01 |
| harbor-client | 100.100.157.12 | k8s-work02 |
Harbor 2种安装方式
1.离线安装
wget https://github.com/goharbor/harbor/releases/download/v2.12.1/harbor-offline-installer-v2.12.1.tgz
tar xf harbor-offline-installer-v2.12.1.tgz
2.在线安装
$ wget https://storage.googleapis.com/harbor-releases/harbor-online-installer-v1.5.2.tgz
$ tar xf harbor-online-installer-v1.5.2.tgz[root@harbor harbor]# head harbor.yml
需:cp harbor.yml.tmpl harbor.yml
修改hostname :ip地址
修改port:默认端口号
注释https

本次我们使用离线安装,安装包在上面
$ tar xf harbor-offline-installer-v2.12.1.tgz
cd harbor/
执行 prepare 命令来准备启动环境。这个过程会检查并准备相关的环境设置。
./prepare
完成准备后,运行以下命令来安装并启动 Harbor。这个过程会下载并运行 7 个镜像。
./install.sh
默认端口为80,需要修改端口请修改docker-compose.yaml对应服务的映射
- 这里修改的端口为5000
3.1访问Harbor
访问:100.100.157.10:5000
Harbor 的默认用户名是 admin,默认密码是 Harbor12345
docker push 需要项目路径,需要Harbor 创建项目 k8s
3.2客户端配置免https
[root@k8s-work01 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.1panel.dev",
"https://docker.foreverlink.love",
"https://dytt.online",
"https://func.ink",
"https://lispy.org",
"https://docker.xiaogenban1993.com",
"https://docker.xn--6oq72ry9d5zx.cn",
"https://docker.zhai.cm",
"https://docker.5z5f.com",
"https://a.ussh.net",
"https://docker.cloudlayer.icu",
"https://docker.linkedbus.com",
"https://docker.m.daocloud.io"
],
"insecure-registries": [
"100.100.157.10:5000"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
[root@k8s-work01 ~]# systemctl reset-failed docker.service
[root@k8s-work01 ~]# systemctl restart docker如果不配置,客户端使用时候会报错: Error response from daemon: Get https:// 172.16.1.146:5000/v1/\_ping: http: server gave
HTTP response to HTTPS client
3.3客户端登陆
docker login 需单独创建一个用户,否则push不了


[root@k8s-work01 ~]# docker login 100.100.157.10:5000
Username: hxy
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四、管理镜像
4.1下拉镜像
docker pull nginx4.2打标签
docekr tag 镜像名称:标签 你的IP:端口/harbor项目名称/镜像名称:标签
docker tag nginx:latest 100.100.157.10:5000/k8s/nginx:latest4.3上传
docker push 你的IP:端口/harbor项目名称/镜像名称:标签
docker push 100.100.157.10:5000/k8s/nginx:latest4.4下拉
docker pull 100.100.157.10:5000/k8s/nginx:latest