Harbor私有镜像仓库高可用部署
Harbor介绍
harbor是一个docker私有镜像仓库,虽然docker官方提供了公共的镜像仓库(Docker Hub),但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目。
Harbor的优势:
图形管理界面。
按项目管理镜像。
独立的用户管理,不同用户可以操作不同镜像,细粒度的权限控制,包含create、push 、pull、delete。
镜像管理。
标签管理。
操作日志管理。
【Harbor 安装步骤】:
一、安装Docker
安装yum的工具包集合 yum install -y yum-utils 安装docker仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 卸载docker-ce yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine yum list installed | grep docker yum remove -y docker-ce.x86_64 rm -rf /var/lib/docker rm -rf /etc/docker/ 查看可安装版本 yum list docker-ce --showduplicates | sort -r 安装最新版本 yum -y install docker-ce 安装特定版本的docker-ce: yum -y install docker-ce-23.0.3-1.el7 启动docker,并设为开机自启动 systemctl enable docker && systemctl start docker docker相关命令: systemctl stop docker systemctl start docker systemctl enable docker systemctl status docker systemctl restart docker docker info docker --version containerd --version
二、安装docker-compose
下载 docker-compose离线安装包 https://github.com/docker/compose/releases mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose -v
三、下载 Harbor离线安装包
从harbor官网下载离线安装包,下载地址:https://github.com/goharbor/harbor/releases
下载当前最新版本harbor 2.11.0,离线包大小为629M 。
下载完离线包之后,将离线安装包【harbor-offline-installer-v2.11.0.tgz】上传到c服务器。比如将文件上传到 /etc/yum.repos.d/harbor-offline-installer-v2.11.0.tgz
四、创建https证书
# 创建证书目录,并赋予权限 mkdir -p /cert/harbor chmod -R 777 /cert/harbor cd /cert/harbor # whereis openssl 检查是否有安装openssl,如果没有先安装openssl组件,如果有就不用安装了 whereis openssl yum install openssl # 创建服务器证书密钥文件harbor.key openssl genrsa -des3 -out harbor.key 2048 # 输入密码,确认密码,自己随便定义,但是要记住,后面会用到。 # 创建服务器证书的申请文件harbor.csr openssl req -new -key harbor.key -out harbor.csr # 输入密钥文件的密码, 然后一路回车 # 备份一份服务器密钥文件 cp harbor.key harbor.key.org # 去除文件口令 openssl rsa -in harbor.key.org -out harbor.key # 输入密钥文件的密码 # 创建一个自当前日期起为期十年的证书 harbor.crt openssl x509 -req -days 3650 -in harbor.csr -signkey harbor.key -out harbor.crt
五、解压软件包,修改配置文件
先进入harbor离线包上传的目录,解压离线包到/usr/local/harbor下
tar zxf /etc/yum.repos.d/harbor-offline-installer-v2.11.0.tgz -C /usr/local/
ls /usr/local/harbor
解压软件包之后有这些文件及目录:
配置harbor.yml 文件
vi /usr/local/harbor/harbor.yml
主要修改以下地方:
# 将hostname改成本机IP或域名,不要用localhost,127.0.0.1或0.0.0.0,冒号后面都有一个空格 hostname: 192.168.0.101ui_url_protoc0l: https # 将http端口改成10080,因为默认用的80端口已经被占用,http可以指定任意端口 http: port: 10080 # 配置https的端口,只能使用443端口,更改证书路径,证书路径为刚刚生成的https证书的实际路径 https: port: 443 certificate: /cert/harbor/harbor.crt private_key: /cert/harbor/harbor.key # 修改后台管理密码 harbor_admin_password: harbor12345 # harbor的内部数据库密码 database: password: root123 # 修改harbor数据存储路径与日志存储路径,目录要先创建好并赋予777权限 data_volume: /data/harbor-data # 修改日志存放路径,默认路径为/var/log/harbor log: local: localtion: /data/harbor-log
六、安装harbor
执行harbor安装脚本
cd /usr/local/harbor
./install.sh
安装成功后输出下面的信息:
在浏览器地址输入:https://192.168.0.101:10443,打开harbor登录页面
用户名:admin,密码:harbor12345
登录成功后进入后台主页:
七、docker信任配置
要让docker可以访问harbor,需要将harbor域名或IP设置为docker的受信任仓库,修改配置文件 /etc/docker/daemon.json ,增加docker受信任IP或域名。
vi /etc/docker/daemon.json
追加内容:
{ "insecure-registries": ["192.168.0.101:10080"] }
拷贝https证书文件harbor.crt到 /etc/docker/certs.d/serverIp 文件夹。每个docker都要拷贝证书文件。
mkdir –p /etc/docker/certs.d/192.168.0.101 cp /cert/harbor/harbor.crt /etc/docker/certs.d/192.168.0.101/ca.crt #注意,拷贝过去的证书文件名为 ca.crt
重启docker
#重启docker systemctl daemon-reload systemctl restart docker.service
重启harbor
cd /usr/local/harbor ./prepare docker-compose down docker-compose up -d
八、将本地业务镜像push到harbor
首先在harbor中新建一个项目,项目名称为【eshop】
用docker登录harbor
docker login 192.168.0.101:10080 -u 用户名 -p 密码
登录成功输出以下信息:
给本地镜像打上tag标记,打标记的时候要加上项目名称。
# docker tag 本地镜像名:版本号 ip:port/项目名称/远程镜像名:版本号,如果不加版本号表示最新版本 docker tag demo1.mvcone:v1.0.1 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1 # 上传镜像到harbor docker push 192.168.0.101:10080/eshop/demo1.mvconev:v1.0.1
push成功输入以下信息:
在harbor后台管理中查看eshop项目下的镜像
点击镜像名称,查看镜像版本号
上传镜像遇到的坑
如果不在harbor中新建项目,或者创建tag的时候不加项目名称,在上传镜像时会发生错误:received unexpected HTTP status: 500 Internal Server Error ,所以docker tag 打标签的时候要一定要加上项目名称。
#push不加项目名称的镜像出现错误,下面是错误方法: # docker tag 本地镜像名:v1.0.1 ip:port/远程镜像名:v1.0.1 docker tag demo1.mvcone:v1.0.1 192.168.0.101:10080/demo1.mvcone:v1.0.1 docker push 192.168.0.101:10080/demo1.mvcone:v1.0.1 #应该这样写docker tag demo1.mvcone:v1.0.1 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1 # 上传镜像到harbor docker push 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1
这样在push镜像时出现500 Internal Server Error错误:
九、为刚才上传到harbor的镜像创建一个容器
eshop/demo1.mvcone镜像已经上传到harbor,现在要用eshop/demo1.mvcone镜像创建一个容器,测试一下容器是否跑得起来。
步骤:
(1) 删除本地镜像 192.168.0.101:10080/eshop/demo1.mvcone
docker rmi 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1
(2)从harbor上 拉取eshop/demo1.mvcone 镜像到本地
docker pull 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1 #从harbor上拉取像镜要写全路径, IP地址:端口/项目名称/镜像名:版本号
(3) 创建 192.168.0.101:10080/eshop/demo1.mvcone 镜像的容器,以8001端口运行
docker run -d --name my.eshop.demo1.mvcone -p 8001:50001 -v /appdata/mvcone 192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1
--name 容器名
-d 后台运行容器
-p 参数:8001是docker对外暴露的端口,可以任意指定,50001是Dockerfile文件配置的docker内部运行端口,不可以随意指定。
-v 参数,数据卷,容器的数据存放路径。
192.168.0.101:10080/eshop/demo1.mvcone:v1.0.1 是镜像名
(4) 查看docker中是否运行着刚刚创建的容器
docker ps
从截图上可以看出 my.ehop.demo1.mvcone 容器已经创建并于处运行状态。
(5) 用浏览器验证容器运行项目的效果
十、harbor停止/重启/御载
重启harbor:
cd /usr/local/harbor docker-compose down ./prepare #配置文件有改动时需要执行 docker-compose up -d
关闭harbor
cd /usr/local/harbor docker-compose down -v
# 或者
docker-compose stop
卸载Harbor
cd /usr/local/harbor docker-compose stop rm -rf /usr/local/harbor
十一、Harbor 分布式集群配置
11.1 Harbor镜像复制的重要性
镜像复制是将一个或多个镜像从一个源位置复制到目标位置的过程。在容器化部署中,镜像复制是非常重要的,它可以帮助用户在不同的环境中快速部署和迁移应用程序。
镜像复制可以提高应用程序的可用性和容灾能力。当一个地区的服务器发生故障或网络中断时,可以通过复制镜像到其他地区的服务器来保证应用程序的正常运行。
此外,镜像复制还可以提供就近访问优化。根据用户的位置,将镜像复制到离用户最近的服务器上,可以大大减少访问延迟,提升用户的体验。
11.2 准备工作
准备两台Harbor服务器
Harbor01 10.1.1.167
Harbor02 10.1.16.175
目标:Harbor01复制Harbor02镜像
11.3 Harbor仓库管理
1、我们在Harbor01配置Harbor02远程仓库地址,这样我们就与Harbor02建立了数据源。
11.4 Harbor复制管理
1、Harbor01想要复制Harbor02的镜像,还需要配置复制规则。
在这里,我们可以配置很多规则,比如我只想同步一个Harbor02中的一个项目,可以设置项目名称。还有就是同步时间,可以设置手动或定时同步。
2、选择copy-10.1.16.175,点击复制。在下面的复制任务,可以看到复制的进度和状态。
十二、Trivy实现镜像漏洞扫描
随着容器镜像的大行其道,Harbor集成Trivy镜像扫描工具,可以有效起到安全防范,满足信息安全要求。
12.1 Trivy离线漏洞库下载
安装oras
- 下载安装
下载地址:https://github.com/oras-project/oras/releases
tar -zxf oras_1.0.1_linux_amd64.tar.gz mv oras /usr/local/bin/
- 版本查看
[root@harbor-new2 /]# oras version Version: 1.0.1 Go version: go1.20.7 Git commit: acf147b7564f44f8637dc59937d6167e5427e612 Git tree state: clean
- 漏洞库下载
文件:db.tar.gz
oras pull ghcr.io/aquasecurity/trivy-db:2
文件:javadb.tar.gz
oras pull ghcr.io/aquasecurity/trivy-java-db:1
12.2 Harbor配置Trivy
trivy设置离线配置,修改harbor.yml 文件
vi /usr/local/harbor/harbor.yml
拷贝trivy-db到harbor-trivy持久化目录
这里我的持久化目录为 /data/harbor/trivy-adapter/trivy/ # 漏洞库离线文件移动至对应目录 tar -xzvf db.tar.gz -C /data/harbor/trivy-adapter/trivy/db tar -xzvf javadb.tar.gz -C /data/harbor/trivy-adapter/trivy/java-db # 授权 chown 10000:10000 -R /data/harbor/trivy-adapter/trivy
12.3 Harbor安装Trivy
在已经安装harbor的前提下:
# 停止harbor服务 docker-compose down # 安装trivy ./install.sh --with-trivy # 启动harbor服务 docker-compose up -d
未安装harbor的前提下:
./install.sh --with-trivy
查看安装结果:
........ ........ ✔ ----Harbor has been installed and started successfully.---- 出现上面的信息,说明Harbor已经安装完成了。
查看容器运行情况,可以看到容器:trivy-adapter
12.4 Harbor审查服务
我们可以在Harbor的审查服务,看到一个新增的trivy镜像扫描器。
我们可以在漏洞页面,对全部镜像进行安全扫描
也可以进入到项目中的某一类镜像,进行安全扫描
查看扫描结果
点击某一个镜像,查看具体漏洞信息
12.5 镜像漏洞修复
可以依据当前基础镜像做Dockerfile,使用"yum update -y 漏洞所属软件名" 进行升级操作,然后再重新做一个基础镜像。
1) 编译Dockerfile
升级原来centos7.7基础镜像里报出来漏洞的软件
[root@k8s-harbor01 ~]# cat Dockerfile FROM 172.16.60.238/kevin/centos7.7:latest RUN yum update -y sqlite \ && yum update -y nss-util \ && yum update -y nss-sysinit \ && yum update -y dbus-libs \ && yum update -y bind-license \ && yum update -y nss \ && yum update -y nss-softokn \ && yum update -y dbus \ && yum update -y nss-softokn-freebl \ && yum update -y nss-tools \ && yum update -y bash \ && yum update -y python-libs \ && yum update -y python \ && yum update -y bind-license \ && yum update -y expat \ && yum update -y libxml2-python \ && yum update -y libxml2 \ && yum update -y shared-mime-info \ && yum update -y libcurl \ && yum update -y file-libs \ && yum update -y curl
2)制作新的基础镜像
[root@k8s-harbor01 ~]# docker build -t 172.16.60.238/kevin/centos7.7:updatev1 .
3)上传到Harbor仓库
[root@k8s-harbor01 ~]# docker push 172.16.60.238/kevin/centos7.7:updatev1
将修复好漏洞的新基础镜像上传到Harbor仓库,再扫描新镜像,发现漏洞已修复。