Harbor概述
Harbor是一个开源的企业级Docker Registry管理项目,由VMware公司开发。它的主要用途是帮助用户迅速搭建一个企业级的Docker Registry服务,提供比Docker官方公共镜像仓库更为丰富和安全的功能,特别适合企业环境使用。12
Harbor的主要功能包括:
- 基于角色的访问控制(RBAC):用户和仓库通过“项目”进行组织管理,用户在项目中可以拥有不同的权限。
- 镜像复制:镜像可以在多个Harbor实例之间进行复制(同步),特别适合负载均衡、高可用、混合云和多云的场景。
- AD/LDAP集成:Harbor可以集成企业内部的AD/LDAP,用于用户认证和管理。
- 图形化用户界面:用户可以通过浏览器浏览、搜索镜像仓库,并对项目进行管理。
- 审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
- 支持RESTful API:提供给管理员更多的操控,使得与其他管理软件集成变得更容易。
- 部署简单:提供在线和离线两种安装工具,也可以安装到vSphere平台(OVA方式)虚拟设备。
此外,Harbor的每个组件都是以Docker容器的形式构建的,使用docker-compose进行部署,这使得部署和维护都相对简单。
Harbor项目地址是:https://github.com/goharbor/harbor
一、安装Harbor
在官网上或者Github上拉取镜像失败可以参考下面的博客相关的资源:
Docker私有镜像仓库Harbor安装并推拉镜像_harbor-offline-installer-v2.11.1.tgz-****博客
1、解压安装包
#安装docker-compose 1.29.2版本
mv docker-compose-linux-x86_64 /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
#解压安装harbor-offline-installer-v2.11.1.tgz执行install.sh进行安装
tar -zxvf harbor-offline-installer-v2.11.1.tgz
2、修改harbor.yml配置执行安装脚本
步骤一:将需要https认证的模块注释掉
步骤二:设置admin密码和访问数据库的密码
步骤三:执行安装脚本
cd /opt/docker/harbor
sh install.sh
步骤四:检查容器是否正常运行
docker-compose ps
3、部署问题处理
之前环境中已经启动名为redis的容器,导致docker-compose启动失败在确认没使用时删掉redis
Error response from daemon: Conflict. The container name "/redis" is already in use by container "1eb39a59f4bb6c30b5283a9d8d09ac11e39d7d047c0688156f7485bc0ea5a24d". You have to remove (or rename) that container to be able to reuse that name.
#解决
docker rm 1eb39a59f4bb6c30b5283a9d8d09ac11e39d7d047c0688156f7485bc0ea5a24d
4、启动容器的方法
#进入到harbor-offline-installer-v2.11.1.tgz解压好的目录下相关操作命令
cd /opt/docker/harbor
#查看启动的容器
docker-compose ps
#启动
docker-compose up -d
#关闭
docker-compose down
5、浏览器页面登录验证
输出:http://192.168.72.140
6、修改Harbor的默认登录端口
6.1、修改配置重启容器
将访问端口改成5000
步骤一:进入到Harbor的安装目录下docker-compose.yml中ports的值
步骤二:修改harbor.yml中ports的值
步骤三:重启容器
#步骤一: 修改docker-compose.yml中ports的值
vim docker-compose.yml
...
ports:
- 5000:8080
...
#步骤二:修改harbor.yml中ports的值
vim harbor.yml
...
http:
port: 5000
...
#步骤三:重新启动容器
docker-compose down && docker-compose up
6.2、浏览器页面验证
输入:http://192.168.72.140:5000
7、创建私有仓库进行推送测试
7.1、创建一个私有仓库叫k8s
7.2、镜像推送或拉取的步骤
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Docker 推送命令
在项目中标记镜像:
docker tag SOURCE_IMAGE[:TAG] master01/k8s/REPOSITORY[:TAG]
推送镜像到当前项目:
docker push master01/k8s/REPOSITORY[:TAG]
Podman 推送命令
推送镜像到当前项目:
podman push IMAGE_ID master01/k8s/REPOSITORY[:TAG]
Helm 推送命令
在项目中打包 chart
helm package CHART_PATH
推送 chart 到当前项目
helm push CHART_PACKAGE oci://master01/k8s
CNAB 推送命令
推送 CNAB 到当前项目
cnab-to-oci push CNAB_PATH --target master01/k8s/REPOSITORY[:TAG] --auto-update-bundle
步骤一:在需要拉取或者推送镜像到私有仓库的机器上先执行登录私有仓库步骤
#登录私有仓库
[root@master secret]# docker login 192.168.72.140:5000
Username: admin
Password: xxx
步骤二:推送数据
#打标签
docker tag mysql:5.7 master01:5000/k8s/mysql:5.7
#推送镜像到仓库
docker push master01:5000/k8s/mysql:5.7
8、Harbor推送不支持HTTP协议问题处理
8.1、推送报错
客户端上传报错
The push refers to repository [192.168.72.140/k8s/nginx-ingress-controller]
Get "https://192.168.72.140/v2/": dial tcp 192.168.72.140:443: connect: connection refused
8.2、报错原因
出现这问题的原因Docker Registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP。所以与私有镜像交互时就会报错如下内容。
8.3、解决方法
步骤一: 在节点上的镜像加速配置文件中加入解析
#加入解析
vim /etc/host
192.168.72.140 master01 reg.test.org
#加入私有仓库加速
vim /etc/docker/daemon.json
"insecure-registries": ["master01:5000","192.168.72.133:5000"]
步骤二:重启docker服务使配置生效
systemctl restart docker
步骤三:登录验证
步骤四:推送数据
#打标签
docker tag mysql:5.7 master01:5000/k8s/mysql:5.7
#推送
docker push master01:5000/k8s/mysql:5.7
二、搭建阿里云私有镜像仓库
1、在阿里云上创建私有仓库
步骤一:在阿里云主页搜索"阿里云镜像服务"
浏览器搜索
阿里云-计算,为了无法计算的价值
输入"阿里云镜像服务"
步骤二:点击个人版实例
步骤三:点击镜像仓库
步骤四: 创建私有仓库
在阿里云上进行配置成功后可以按照知道文档上的操作步骤进行镜像的推送和拉取
1. 登录阿里云Docker Registry
$ docker login --username=被水淹死的与鱼尔 registry.cn-hangzhou.aliyuncs.com
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/yangbin-docker/mysql:[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=被水淹死的与鱼尔 registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/yangbin-docker/mysql:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/yangbin-docker/mysql:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。
5. 示例
使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
使用 "docker push" 命令将该镜像推送至远程。
$ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
2、推送拉取测试
2.1、推送镜像到阿里云私有仓库
#登录
docker login --username=xxxxxx registry.cn-hangzhou.aliyuncs.com
#打标签
docker tag mysql:5.7 registry.cn-hangzhou.aliyuncs.com/yangbin-docker/mysql:5.7
#推送
docker push registry.cn-hangzhou.aliyuncs.com/yangbin-docker/mysql:5.7
2.2、拉取镜像到本地
docker pull registry.cn-hangzhou.aliyuncs.com/yangbin-docker/mysql:5.7
三、Harbor私有仓库和阿里云私有仓库推送测试总结
1、阿里云私有仓库推送验证
1.1、创建私有仓库test
1.2、往test私有仓库中进行推送测试
1.3、推送镜像时没有镜像仓库则会自动创建
推送
#打标签
docker tag nginx:latest registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:latest
#推送
docker push registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:latest
2、Harbor私有仓库推送验证
2.1、在没有提前创建私有仓库的情况下进行推送验证
2.2、往创建好的仓库中推送镜像
#推送nginx 版本为1.23的镜像
docker tag mysql:5.7 master01:5000/nginx/nginx:1.23
docker push master01:5000/nginx/nginx:1.23
#推送nginx 版本为latest的镜像
docker tag nginx:latest master01:5000/nginx/nginx:latest
docker push master01:5000/nginx/nginx:latest