使用 Harbor 自建具有代理功能的私有 Docker 存储库
前言
在某个不知名时间点 (其实是我记不住) 开始,中国大陆的服务器就没法直接连接到 Docker Hub(docker.io)了,这对所有的内地服务器无疑是个打击,好在代理服务越来越多,也不至于说彻底没法用
但是,和 Docker Hub 同病相怜的、由 GitHub 提供的 Docker 镜像服务 ghcr.io 却没什么人弄代理服务,即使有人弄了,也没法去访问私有仓库(这基本上是登录不上去导致的)
因为有两个项目用了 ghcr 并弄了私密,内地服务器完全不能去拉取,或者说拉取很慢,导致不能用内地服务器去做分流,一直苦苦寻求于 ghcr 的代理方案,正好前不久翻找到了 Harbor 这个企业级 Docker 私有库,就试着搭建起来了
EP0:前置步骤
配置服务器
首先你得有:
- 一台服务器,最好是 Linux 的,最好不是 Windows 的
- SSH 远程工具,Termius、Tabby、XShell 都可以(本地部署可忽略)
- 一个域名(建议),在中国大陆部署时若需使用域名,请提前备案
Harbor 是基于 Docker 运行的程序,因而服务器需要提前安装 Docker,如果服务器在内地的话还需要提前配置好代理,否则会导致后续步骤的失败,为此,你有以下选择:
下载安装包
打开 Harbor Releases),你会在 Release 看到类似如下的内容

harbor-offline-installer-v<版本号>tgz 的是离线安装包,harbor-online-installer-v<版本号>tgz 的是在线安装包,请根据实际最新版本来部署
本教程使用的是在线版本,如果你的服务器实在连不上 Docker Hub,请使用离线版本,两者在使用上无任何差别,区别在于在线安装包会从 Docker Hub 拉取镜像后部署,相对来说会更轻便,本地文件也会更干净
将文件下载到服务器,解压,此时会多出一个名为 harbor 的文件夹
进入harbor 文件夹,如果目录下有以下内容(并且一个不缺的话),此时我们就完成了第一步

所有的文件
EP1:配置
重命名harbor.yml.tmpl 为harbor.yml
将harbor.yml.tmpl 复制后修改名字为harbor.yml,务必不要直接修改文件名,避免因误删除内容导致严重后果
cp harbor.yml.tmpl harbor.yml
修改密码
进入harbor.yml,
vim harbor.yml
找到 harbor_admin_password

将 Harbor12345 修改为另外的字符,请牢记这串字符,这段字符将成为待会登录网页控制台的 Admin 账号的初始密码
同时,建议把 database.password 也修改成其他的字符(如下图位置),这串字符将成为 Harbor 待会部署的数据库的访问密码,但无需记住

修改访问地址
在harbor.yml的顶部,找到 hostname

修改 hostname 为实际的访问地址,这段不要求必须写域名,可以写服务器的IP
配置端口
基于各类原因,大体上会出现三种情况:
保存 harbor.yml
做完以上配置后,按下 esc,输入 :qw,此时harbor.yml 的修改就已经完成
EP2:启动安装脚本
使用命令行执行以下命令
bash install.sh
此时就进入了安装步骤
出现 Harbor has been installed and started successfully. 时候,整个安装就完成了

同时整一个服务已经运作起来了
EP4:访问网页
我不会数那个介于2和4之间的数字
根据你的配置的 hostname 和 prot,在浏览器访问你的 Harbor
然后你可以看到如下界面

登录,初始账号(或者说 Admin 账号)的用户名为 admin,密码为你刚才设置的 harbor_admin_password
登入后,你可以看到如下界面

此时已经可以确定,整一个 Harbor 服务都已经正常运作起来了
EP5:安全性操作
修改 Admin 账户的密码
尽管已经在 harbor.yml 修改了默认的密码,但为保安全,仍旧需要在网页这边修改一次密码
点击右上角的用户标识,然后点击 修改密码,根据弹出的填写框填写所有必填内容即可

创建新用户
虽说不一定要创建新用户,但为保安全,我仍旧建议创建一个新的用户专门用于在 Docker 登录你的账户
点击左侧的 用户管理,再点击 创建用户,根据弹出的填写框填写所有必填内容即可

EP6:在 Docker 进行登录
在命令行输入
docker login <hostname>:<port>
然后会出现交互式填写

先填写 Username(你刚创建用户时设置的用户名),回车,然后再填写 Passport(你刚创建用户时设置的密码,填写 Passport 不会显示填写的内容),然后回车
如果账密都对,会出现以下内容

此时你的服务器已经和你的 Harbor 连接上,各类提交和拉取(包括私密仓库)都畅通无阻
EP-S-1:配置代理
与其他服务进行关联
登录到你的 Harbor 网页之后,点击页面左边的 仓库管理,再点击 新建目标

此时弹出 新建目标 窗口
调整 提供者 选项,可以看到有12个选项

如若选择 harbor 或是 Docker Registry 的话需要填写对应服务的地址(即 目标URL),如若选择这两个以外的选项的话,无需填写对应服务的地址
这里以 GitHub GHCR 作为例子(不是 Google GCR,要看清了,这俩的地址就差一个字母)

(关于如何获取 GitHub 访问凭证,请访问 https://github.com/settings/tokens获取)
配置好后点确定即可
设置项目
何为“项目”?在 Harbor 里,项目就相当于一个单独的存储地,他指向了镜像存储的地方,在访问管理这一块(也就是镜像是公开的还是私密的)是基于每一个项目而定的,不是基于每一个镜像,这和很多 Docker 云服务都不相同
点击页面左边的 项目,再点击 新建项目


然后点确定,就设置完成项目了

END:拉取镜像
以 ghcr.io 以及上图配置的项目名称 ghcr 为例,假设原始地址为
ghcr.io/NiuBoss123/114514:latest
在经过 Harbor 的代理之后,地址将变为
<hostname>:<port>/ghcr/NiuBoss123/114514:latest
也就是把 ghcr.io 替换为 <hostname>:<port>/ghcr
之后的操作与原地址的操作无异
后记
如果只是为了个代理就搭建 Harbor 的话是不是太大材小用了呢?我个人觉得确实是很大材小用了 ,但若考虑到他作为一个企业级 Docker 存储的地位,应当就不奇怪了言外之意就是我想折腾了
有人会说为什么不用 Docker Registry,考虑到这个本质上只是一个存储库,没有网页控制台,没有代理功能,需要自己把镜像传上去,感觉还是好麻烦(虽然用 Harbor 一样麻烦就是了,只不过用 Harbor 的话比较讨巧 )真的讨巧吗
相关链接
- Harbor 官网:goharbor.io
- Harbor GitHub 仓库:goharbor/harbor
(本教程在编写过程中没有一个域名受到伤害)