当前位置: 首页 > web >正文

部署Harbor私有仓库

一、Harbor

1、Harbor简介

        Docker容器应用的开发和运行离不开可靠的镜像管理,Docker官方提供了原生的Registry,但其功能比较简单,而且没有可视化界面,自然无法满足企业级的需求。虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。

        为了解决以上需求,VMware公司推出了Harbor,Harbor 是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、LDAP、审计、安全漏洞扫描、镜像验真、管理界面、自我注册、HA 等企业必需的功能,同时针对中国用户的特点,设计镜像复制和中文支持等功能。

Harbor的架构示意图:

Harbor的GitHub仓库地址如下:

  • https://github.com/goharbor/harbor
  • Wiki:https://github.com/goharbor/harbor/wiki

2、Harbor高可用部署

官方的安装文档:

  • https://goharbor.io/docs/2.0.2/install-config/

        本文采用的高可用方案是Harbor的双主复制,该方案比较简单,需要搭建至少两个Harbor节点,并且节点之间能够互相复制,然后通过nginx代理Harbor节点提供外部访问。这里采用的高可用方案级别没那么高,因为主要是通过Nginx代理其中一个节点,该节点挂掉后需要手动修改Nginx配置文件去代理另一个可用节点。

        所以此方案比较适合中小型公司,而且Harbor主要是给公司内部的开发人员使用的,通常只需要保证分钟级的高可用性就可以了。另外还有一点就是,云环境基本无法使用keepalived,因为云服务商一般不支持自定义外网可访问的虚拟IP,要么就是使用起来非常麻烦。这也是为什么没有采用keepalived的原因之一,当然,如果是部署在内网服务器上也是可以采用keepalived的

3、准备工作

我这里使用了三台CentOS-7.9的虚拟机,具体信息如下表:

系统版本

IP地址

节点角色

CPU

Memory

Hostname

CentOS-7.9

192.168.10.101

  Nginx

\>=2

\>=2G

     Nginx

Docker

CentOS-7.9

192.168.10.102

Harbor1

\>=2

\>=2G

Docker01

CentOS-7.9

192.168.10.106

Harbor2

\>=2

\>=2G

Docker02

二、安装Harbor(worker节点)

在两台worker节点上分别安装Harbor,由于官方提供了安装脚本,安装过程还是比较简单的。具体步骤如下:

1、下载安装包

首先下载官方的离线安装包,当然你能科学上网的话使用在线安装包也可以:

https://github.com/goharbor/harbor/releases/tag/v2.4.3

https://github.com/goharbor/harbor/releases/download/v2.4.3/harbor-offline-installer-v2.4.3.tgz

2、下载完成后,将压缩包上传到两个worker节点,并解压

3、配置harbor

3.1、将模板拷贝一份出来

4、运行脚本

./install.sh

5、访问测试

三、安装Nginx

1、拉取nginx的镜像

docker pull nginx:1.13.12

2、编辑配置文件

#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}stream {upstream hub {server 192.168.10.102:80;}server {listen 80;proxy_pass hub;proxy_timeout 300s;proxy_connect_timeout 5s;}
}

Tips:这里只所以只代理其中一个Harbor节点是因为Harbor节点之间的同步存在延迟,而且通常镜像都比较大,所以这个延迟也会比较明显。一般镜像推送完马上就会调度拉取,所以这个延迟时间一般是不可接受的。如果让nginx代理两个节点就会出现一会请求A一会请求B的问题,造成镜像pull/push不成功。只代理一个节点也成为了这个方案的缺点,当nginx代理的那个节点宕掉,我们得手动修改nginx的配置代理另一个节点。但由于Harbor是给公司内部的开发人员使用,通常可以允许分钟级别的不可用。

3、编写重启脚本

vim restart.sh
#!/bin/bashdocker stop harbor-nginx
docker rm harbor-nginxdocker run -itd --net=host --name harbor-nginx -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf nginx:1.13.12

4、运行脚本

bash restart.sh

5、使用代理节点IP访问

5.1、创建Harbor项目和用户

将默认的library项目删除掉,然后创建一个新项目,项目名称为kubernetes

5.2、到“用户管理”新建一个用户

5.3、将该用户添加到新建的项目中

6、所有的docker主机设置daemon.json文件

        回到命令行上测试一下pushpull。由于我们自己搭建的私有仓库默认是不受Docker信任的,所以需要先在配置文件中增加如下配置项让Docker信任该registry:

vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker

vim /etc/docker/daemon.json{
"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker-0.unsee.tech","https://docker.hlmirror.com"],
"insecure-registries": ["192.168.10.101"]
}

7、重新启动一个容器

bash restart.sh

8、重新跑一遍harbor脚本

./install.sh
docker ps -a

./install.sh
docker ps -a

9、push上传

然后尝试使用命令行push一个镜像到Harbor上

docker login 192.168.10.101
docker pull cirros
docker tag cirros 192.168.10.101/kubernetes/cirros:v1
docker push 192.168.10.101/kubernetes/cirros:v1

10、pull拉取

vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
docker pull 192.168.10.101/kubernetes/cirros:v1
docker images

11、配置Harbor节点互相复制(两个节点都设置,要连接对方的ip)

        测试完Harbor的基本功能后,我们接下来配置一下Harbor节点之间的互相复制功能,让两个节点能够同步镜像数据。首先到第一个节点上的“仓库管理”界面中新建一个目标,这个目标就是另一台Harbor节点:

然后到“复制管理”界面中新建复制规则,如下

  • 资源过滤器是用于定义只复制哪些镜像的,过滤维度有名称、tag和label。不配置默认复制全部

定义了复制规则后,我们可以在界面上手动触发复制:

复制成功后,到另一个节点上可以看到kubernetes这个项目及项目下的镜像都被复制过去了:

http://www.xdnf.cn/news/15322.html

相关文章:

  • 自动化证书续签工具针对VPS服务器HTTPS服务的维护实践
  • 2025 年 06 月 GitHub 十大热门项目排行榜
  • 【Docker基础】Dockerfile核心概念解析:什么是Dockerfile?与镜像、容器的关系
  • 【Linux-云原生-笔记】Apache相关
  • 模型驱动的架构MDA的案例
  • Vscode中使用C++代码进行debug
  • 大模型KV缓存量化误差补偿机制:提升推理效率的关键技术
  • 人工智能自动化编程:传统软件开发vs AI驱动开发对比分析
  • npgsql/dapper/postgresql的时区问题
  • 【解决办法】报错Found dtype Long but expected Float
  • 每日算法刷题Day46 7.12:leetcode前缀和3道题和差分2道题,用时1h30min
  • 【算法笔记】7.LeetCode-Hot100-图论专项
  • 《目标检测模块实践手册:从原理到落地的尝试与分享》第一期
  • Kotlin基础学习记录
  • Spring Cloud Gateway中常见的过滤器
  • FastGPT革命:下一代语言模型的极速进化
  • LabVIEW键盘鼠标输入监控
  • 阿里开源AI大模型ThinkSound如何为视频配上灵魂之声
  • UI前端大数据可视化新探索:如何利用色彩心理学提升数据传达效果?
  • Oxygen XML Editor 26.0编辑器
  • Pandas:分组聚合
  • 使用sqlmap的SQL Injection注入
  • Kafka Schema Registry:数据契约管理的利器
  • 指令微调时,也要考虑提示损失
  • 多模态数据解压-Parquet
  • 精密模具大深径比微孔尺寸检测方案 —— 激光频率梳 3D 轮廓检测
  • Apache HTTP Server 从安装到配置
  • 【Linux仓库】虚拟地址空间【进程·陆】
  • 未来软件开发的新方向:从工程到智能的深度演进
  • Claude Code:完爆 Cursor 的编程体验