本文最后更新于 259 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
docker的企业级私有仓库之docker-harbor
一.Harbor下载地址
1.harbor概述
harbor私有镜像仓库是在docker官方提供的"registry"基础之上二次开发,它包含了registry的核心功能。
harbor相比docker的registry使用起来更加友好,基本上大多数操作都是在web界面中就能完成。
harbor的下载地址:
https://github.com/goharbor/harbor
2.下载harbor
wget https://github.com/goharbor/harbor/releases/download/v2.3.0/harbor-offline-installer-v2.3.0.tgz
温馨提示:
如下图所示,下载速度还是蛮快的,如果网络不好的同学,可以直接使用我下载好的软件包哟~
3.解压harbor软件
tar xf harbor-offline-installer-v2.3.0.tgz -C /oldboy/softwares/
温馨提示:
建议大家将软件包解压到指令目录,便于查看。
4.创建harbor的配置文件
[root@docker201.oldboyedu.com ~]# cd /oldboy/softwares/harbor/
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]#
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]# cp harbor.yml.tmpl harbor.yml
温馨提示:
如下图所示,推荐大家使用将默认的配置文件使用cp命令拷贝,而不要使用mv直接重命名。
5.修改harbor的配置文件-修改主机的监听地址
如下图所示,设置监听地址,设置主机名就得在当前服务器的"/etc/hosts"文件有解析哟~
6.修改harbor的配置文件-禁用https
如下图所示,默认同时启用了http和https,如果同时配置了http和https则直接回发生跳转操作哟~
7.修改harbor的管理员密码
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]# grep harbor_admin_password harbor.yml
#harbor_admin_password: Harbor12345
harbor_admin_password: oldboyedu_linux
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]#
8.安装harbor服务
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]# ./install.sh
温馨提示:
(1)如下所示,执行安装脚本后,就会自动开始安装harbor服务了哟;
(2)以后每次修改"harbor.yml"胚子文件后,都需要重新安装harbor服务哟;
(3)请确保安装harbor服务之前没有容器占用80端口,否则harbor的nginx容器会启动失败;
9.访问安装成功后,访问80端口
如下图所示,安装成功后会启动nginx服务,访问对应的80端口即可。
温馨提示:
请确保安装harbor服务之前没有容器占用80端口。
10.登录用户名和密码
如下图所示,默认的用户名为admin,密码为我们自定义的
11.登录成功
如下图所示,为登录成功的页面。
二.harbor仓库的基本使用-用户角色分配
1.使用docker-compose工具启动harbor
您是否有想过,当我们关闭了服务器后,如果在想启动harbor该如何是好呢?
如下图所示,我们可以借助docker-compose工具来启动咱们的服务。
温馨提示:
如果您没有关闭harbor,则可以直接跳过本步骤。
2.切换主题
如下图所示,主题分为"深色主题"和"浅色主题"两种哈。
3.查看推送镜像的帮助信息
我们可以依次点击"项目" ---> "library" ---> "推送命令"。
如下图所示,就可以看到如下对应的帮助信息啦。
4.创建镜像仓库
我们可以依次点击"项目" ---> "新建项目" ---> "填写项目的相关信息" ---> 点击"确定"。
温馨提示:
(1)如果填写时不知道对应字段啥意思时请点击旁边的问好会又详细说明哟;
(2)如下图所示创建项目成功会有相应的提示信息哟;
5.删除镜像
如下图所示,依次"勾选镜像" ---> "操作" ---> "删除" ---> "确认删除"
温馨提示:
如果大量删除镜像后,我们应该还需要依次点击"系统管理" ---> "垃圾清理" ---> "立即清理垃圾"。
6.授权用户对某个项目有相关的权限
(1)创建用户
依次点击"系统管理" ---> "用户管理" ---> "创建用户" ---> "填写用户信息" ---> "确定"
(2)为用户分配已有项目的权限
依次点击"项目" ---> "选择项目" ---> "成员" ---> "用户" ---> "搜索并分配相应的角色" ---> "确定"
(3)验证权限
关于权限验证请参考下面的三个图即可。
三.推送本地镜像到自建的harbor仓库
1.配置可信任的私有仓库
[root@docker202.yinzhengjie.com ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"],
"insecure-registries": ["docker201.oldboyedu.com"]
}
[root@docker202.yinzhengjie.com ~]#
[root@docker202.yinzhengjie.com ~]# systemctl restart docker
[root@docker202.yinzhengjie.com ~]#
温馨提示:
(1)"insecure-registries"表示不安全的注册,也就是使用的是http协议,而非https协议哟;
(2)我们在"insecure-registries"属性中可以直接指定IP地址或主机名,但请不要加上端口号。
(3)修改后请立即重启服务使得配置文件生效。
2.登录私有的harbor仓库
[root@docker202.yinzhengjie.com ~]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
[root@docker202.yinzhengjie.com ~]#
温馨提示:
(1)在shell命令行中不建议直接使用"-u"和"-p"来指定用户名和密码,因为我们可以通过history命令轻松获取密码;
(2)如下图所示,登录成功后,请记得定期删除"~/.docker/config.json"文件,因为里面暴露了你本地的用户名和密码。
3.上传镜像
docker tag oldboyedu_dockerfile_xiaoniao:v3 docker201.oldboyedu.com/oldboyedu/oldboyedu_dockerfile_xiaoniao:v3
docker push docker201.oldboyedu.com/oldboyedu/oldboyedu_dockerfile_xiaoniao:v3
温馨提示:
(1)上传镜像之前,需要将镜像打上相应的tag;
(2)如下图所示,当镜像上传成功后,可以在web界/面发现上传后的镜像经过了压缩处理。
4.下载镜像
如下图所示,下载镜像时只需要点击"拉取命令"的按钮,然后在终端执行相应的命令即可。
但很可惜,拉去后的镜像时没有tag的哟~因此我们需要下载后在基于镜像ID打上相应的tag。
docker image tag 3eed6dec1c0c docker201.oldboyedu.com/oldboyedu/oldboyedu_dockerfile_xiaoniao:v3
5.运行镜像测试是否可以正常使用
如下图所示,咱们的镜像可以正常使用哈。
docker container run -it -d -P docker201.oldboyedu.com/oldboyedu/oldboyedu_dockerfile_xiaoniao:v3
四.配置https证书
1.自建CA证书
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]# mkdir certificates
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]#
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]# openssl genrsa -out certificates/harbor-ca.key 2048
温馨提示:
我建议大家将CA证书相关文件统一放在"certificates"目录。
2.根据自建的ca证书文件创建认证证书
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]# openssl req -x509 -new -nodes -key certificates/harbor-ca.key -subj "/CN=docker201.oldboyedu.com" -days 7120 -out certificates/harbor-ca.crt
温馨提示:
如下图所示,创建认证证书后,该目录下总共只有2个证书文件哟。
3.查看证书信息
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]# openssl x509 -in certificates/harbor-ca.crt -noout -text
4.修改harbor的主机名
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]# openssl x509 -in certificates/harbor-ca.crt -noout -text | grep CN
Issuer: CN=docker201.oldboyedu.com
Subject: CN=docker201.oldboyedu.com
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]#
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]# grep ^hostname harbor.yml
hostname: docker201.oldboyedu.com
[root@docker201.oldboyedu.com /oldboy/softwares/harbor]#
5.启用https功能并指定证书文件
如下图所示,我们需要指定证书文件的存储位置。
6.优化安装脚本(可选)
如下图所示,注释掉"docker load -i ./harbor*.tar.gz"可以减少包的导入时间。
7.重新运行install.sh脚本即可使得配置文件生效
如下图所示,直接运行install.sh脚本就能使得修改的"harbor.yml"配置文件生效哟~
温馨提示:
如果harbor服务正在运行,则直接运行install.sh脚本时会自动停止这些容器!
8.访问harbor站点
如下图所示,我们可以基于https协议访问harbor站点啦~
9.导出客户端证书
我们将客户端浏览器证书导出以便后续使用,当然,该证书文件我们可以在命令行中生成哟~
温馨提示:
如果想要知道如何命令行生成证书,可直接参考第11步骤。
10.更新CA证书文件并尝试登录
[root@docker202.yinzhengjie.com /oldboyedu]# ll
总用量 4
-rw-r--r--. 1 root root 795 6月 23 15:40 harbor.pub.cer
[root@docker202.yinzhengjie.com /oldboyedu]#
[root@docker202.yinzhengjie.com /oldboyedu]# cp harbor.pub.cer /etc/pki/ca-trust/source/anchors/
[root@docker202.yinzhengjie.com /oldboyedu]#
[root@docker202.yinzhengjie.com /oldboyedu]# ll /etc/pki/ca-trust/source/anchors/
总用量 4
-rw-r--r--. 1 root root 795 6月 23 15:41 harbor.pub.cer
[root@docker202.yinzhengjie.com /oldboyedu]#
[root@docker202.yinzhengjie.com /oldboyedu]# update-ca-trust extract
[root@docker202.yinzhengjie.com /oldboyedu]#
[root@docker202.yinzhengjie.com /oldboyedu]# systemctl restart docker
温馨提示:
将浏览器的公钥证书文件上传到客户端服务器受信任的CA目录,并本地的CA证书文件,同时需要重启docker服务方能生效。
11.命令行中生成自建CA的客户端证书文件
[root@docker201.oldboyedu.com /oldboy/softwares/harbor/certificates]# ll
总用量 8
-rw-r--r-- 1 root root 1131 6月 23 14:27 harbor-ca.crt
-rw-r--r-- 1 root root 1675 6月 23 14:25 harbor-ca.key
[root@docker201.oldboyedu.com /oldboy/softwares/harbor/certificates]#
[root@docker201.oldboyedu.com /oldboy/softwares/harbor/certificates]# openssl req -new -x509 -text -key harbor-ca.key -subj "/CN=docker201.oldboyedu.com" -days 7120 -out client.cert
[root@docker201.oldboyedu.com /oldboy/softwares/harbor/certificates]#
[root@docker201.oldboyedu.com /oldboy/softwares/harbor/certificates]# ll
总用量 16
-rw-r--r-- 1 root root 4129 6月 23 16:03 client.cert
-rw-r--r-- 1 root root 1131 6月 23 14:27 harbor-ca.crt
-rw-r--r-- 1 root root 1675 6月 23 14:25 harbor-ca.key
[root@docker201.oldboyedu.com /oldboy/softwares/harbor/certificates]#
[root@docker201.oldboyedu.com /oldboy/softwares/harbor/certificates]# scp client.cert 172.200.1.202:/etc/pki/ca-trust/source/anchors/
温馨提示:
如果做了该步骤,可以直接跳过第9步骤,该步骤是命令行生成客户端证书文件。
推荐阅读:
https://docs.docker.com/engine/security/certificates/
12.使用生产环境的证书文件
如果使用生产环境证书文件的话,就无需在自建证书文件,也无需添加信任证书之类的,直接将证书文件上传到服务器端,然后修改"harbor.yml"即可。
尽管很简单,但我还是需要提示以下几点:
(1)证书的CN命中要和我们的harbor的主机名称要配置一致;
(2)指定https协议时需要指定正确的路径;
(3)只需要执行本案例的4-8步骤,其它步骤请忘记它吧;
五.配置harbor的镜像复制
1.测试环境准备
如下图所示,我们需要在搭建一个harbor仓库进行测试。
实验需求:
将"https://docker201.oldboyedu.com/"的oldboyedu项目迁移到"https://harbor250.oldboyedu.com/"中。
2.新建目标仓库
如下图所示,依次点击"系统管理" ---> "仓库管理" ---> "新建目标" ---> "按要求填写相关信息并点击测试链接" ---> "确定"
温馨提示:
(1)harbor官方对于提供者镜像源支持包括但不限于阿里巴巴的ACR,谷歌的GRC,华为的SWR,腾讯的TCR以及官方的Docker Registry等等。
(2)目标URL此处必须写IP地址,这意味着我们需要重新安装目标URL的仓库;
(3)
3.创建复制规则
如下图所示,依次点击"系统管理" ---> "复制管理" ---> "新建规则" ---> "按照提示填写相关信息即可" ---> "确定"
温馨提示:
(1)注意选择"源仓库",这个名称是我们上一步创建的目标仓库。
(2)如果指向过滤一部分仓库则可以自定义"资源过滤器"的相关规则,如不设置则默认复制目标仓库的所有镜像资源哟;
4.手动执行复制规则
如下图所示,依次点击"系统管理" ---> "复制管理" ---> "勾选需要执行的规则" ---> "点击复制" ---> "确认复制"
温馨提示:
如下图所示,我们成功的执行了复制规则,要注意观察"成功百分比"
5.观察镜像仓库是否将数据同步
如下图所示,我们成功的将目标仓库全部同步过来啦~
6.手动复制镜像(仅供参考)
7.定时任务复制镜像案例(仅供参考)
8.查看镜像的规则列表(仅供参考)
六.可能会遇到的错误
1.connect: connection refused
报错原因:
默认走的是https协议,但我们并没有给harbor配置ssl相关整数。
解决方案:
方案一:
将harbor配置为https即可。
方案二:
修改"/etc/docker/daemon.json"配置文件中的"insecure-registries"属性,但要记得重启docker服务哈!
例如: "insecure-registries": ["docker201.oldboyedu.com"]
2.unauthorized: incorrect username or password
报错原因:
用户名和密码输入不正确。
解决方案:
(1)输入正确的用户名和密码即可。
(2)当然,也有可能是你的想要认证的仓库有问题哟:
比如你想要认证的是私有仓库,而下图显示的是官方的认证仓库。这个时候的解决方案就是登陆时指定SERVER。
3.x509: certificate signed by unknown authority
报错原因:
从字面意思很容易理解,即"未知机构签署的证书",因为咱们的证书是自签证书,并非权威机构,因此其合法性不言而喻。
解决方案:
将证书文件上传到服务器的"/etc/pki/ca-trust/source/anchors/"目录,再执行"update-ca-trust extract"和"systemctl restart docker"
4.failed to ping registry https://docker201.oldboyedu.com: http status code: 404
报错原因:
我使用harbor.v2.3.0发现依旧存在该问题,不得不说这是官方的一个bug。
我曾尝试将域名换成IP地址,发现依旧出现相同的报错。
解决方案:
需要将"docker201.oldboyedu.com"服务器的harbor.yml文件中的hostname属性改为IP地址并重新执行安装命令即可。
对官方的期望:
希望官网早日修改该bug。
5.x509: cannot validate certificate for 172.200.1.201 because it doesn't contain any IP SANs
报错原因:
本地的证书文件无效。
解决方案:
需要重新生成证书文件,参考"配置https证书"案例。
6.precondition failed: the project contains repositories, can not be deleted
报错原因:
项目中包含存储卡,无法删除。
解决方案:
(1)请先检查是否是误操作。
(2)手动删除项目下的各个存储库,然后在执行删除操作即可;
7.x509: certificate is valid for www.oldboyedu.com, oldboyedu.com, not harbor250.oldboyedu.com
问题原因:
无法解析"harbor250.oldboyedu.com"这个域名。
解决方案:
请检查"/etc/hosts"文件是否做了相关配置信息。
8.x509: certificate has expired or is not yet valid
问题原因:
证书已经过期或者无效。但是我查看了证书相关信息,发现自建的证书文件并没有失效。
解决方案:
(1)请尝试重新生成证书并更新,我测试这种方法好像无效;
(2)在"/etc/docker/daemon.json"文件中添加以下内容:
"insecure-registries": ["0.0.0.0/0"]
(3)也有网友说是集群时间不同步导致,但这种情况下并不适合我;
9.unauthorized: unauthorized to access repository
故障原因:
未授权访问存储库,换句话说,未登录存储库就直接push镜像是不允许的。
解决方案:
登录即可。
10.failed with status: 502 Bad Gateway
故障原因:
初步怀疑是容器内的访问未正常工作,可重启容器在进行测试。
解决方案:
方案一:(推荐)
docker-compose restart # 需要进入到harbor安装路径执行。
方案二:
systemctl daemon-reload
systemctl restart docker
11.dial tcp 10.0.0.102:443: connect: no route to host
故障原因:
初步怀疑是协议指定错误,我的环境是http协议,而连接的是https协议。
解决方案:
修改docker的配置文件,"insecure-registries": ["10.0.0.102"]
12.which when updated to current usage of 75.3 MiB will exceed the configured upper limit of 100.0 MiB.
故障原因:
存储配额上限。
解决方案:
协商存储扩容方案。