07-Harbor镜像仓库
本文介绍了基于Harbor私有镜像仓库的容器化部署方案。通过Jenkins构建jar包并制作Docker镜像,推送到Harbor仓库,再由目标服务器拉取运行。详细说明了Harbor的安装配置过程。同时阐述了Jenkins服务器和目标服务器的Docker配置要求,以及镜像命名规范。最后通过编写部署脚本实现自动化流程:Jenkins构建推送镜像后,触发目标服务器执行脚本完成容器更新。该方案优化了多服务
服务器资源与角色
| 身份 | 角色 | ip | 版本 |
|---|---|---|---|
| 服务器 | Gitlab | 10.0.0.133 | Rocky Linux 9 |
| 服务器 | Jenkins | 10.0.0.134 | Rocky Linux 9 |
| 服务器 | APP | 10.0.0.137 | Rocky Linux 9 |
| 服务器 | Harbor | 10.0.0.139 | Rocky Linux 9 |
| 中间件 | Harbor | - | 2.14.2 |
基于后端maven项目的容器化构建
当前发布步骤是Jenkins构建好jar包后发送到目标服务器,在目标服务通过dockerfile文件构建出自定义镜像,然后运行成docker容器。但是如果我们有多台目标服务器都需要部署,这种操作会在每台服务器本地都进行自定义镜像的构建
如果我们可以通过Jenkins先将镜像构建好,再将构建好的自定义镜像推送到目标服务器,让目标服务器直接将镜像运行成容器,这样可以极大提高部署效率,所以我们采用Harbor镜像仓库来保存制作好的自定义镜像
此时的完整步骤就变成了:
Jenkins拉取代码-->本地构建jar包-->代码质量检测-->制作自定义镜像-->上传Harbor仓库-->通知目标服务器前往Harbor仓库拉取镜像-->将镜像运行成容器
一、Harbor仓库的安装
1.下载安装包
可以访问Harbor官网:
https://goharbor.cn/,或者GitHub:https://github.com/goharbor/harbor/可以用国内镜像链接下载:
https://bgithub.xyz/goharbor/harbor/releases/download/v2.14.2/harbor-offline-installer-v2.14.2.tgz
wget https://bgithub.xyz/goharbor/harbor/releases/download/v2.14.2/harbor-offline-installer-v2.14.2.tgz
# 解压到指定目录
tar -zxvf harbor-offline-installer-v2.14.2.tgz -C /usr/local/
# 查看解压目录
[root@Harbor-/usr/local/harbor]# ll
total 696568
-rw-r--r-- 1 root root 11347 Jan 12 17:13 LICENSE
-rw-r--r-- 1 root root 3646 Jan 12 17:13 common.sh
-rw-r--r-- 1 root root 713241468 Jan 12 17:14 harbor.v2.14.2.tar.gz
-rw-r--r-- 1 root root 14688 Jan 12 17:13 harbor.yml.tmpl
-rwxr-xr-x 1 root root 1975 Jan 12 17:13 install.sh
-rwxr-xr-x 1 root root 2211 Jan 12 17:13 prepare
2.修改配置
之后我们会通过运行
install.sh安装,在这个脚本执行时,会加载harbor.yml,而harbor.yml.tmpl是提供的模板文件,所以我们复制一份后修改
修改
hostname为我们服务器的ip
port显示默认端口是80因为我们没有证书,所以注释掉https的相关信息
harbor_admin_password显示admin用户的默认密码修改完
./install.sh安装,默认是安装为docker容器
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
-------------------------------------------------------------------------------
hostname: 10.0.0.139
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
# https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
# enable strong ssl ciphers (default: false)
# strong_ssl_ciphers: false
harbor_admin_password: Harbor12345
-------------------------------------------------------------------------------
# 执行安装脚本
./install.sh
3.启动访问
-
用docker ps命令可以查看Harbor容器运行情况
-
浏览器访问服务器ip即可进入登录页,输入默认用户名密码进入主页:
admin,Harbor12345
| 镜像仓库 |
|---|
![]() |
![]() |
![]() |
-
Harbor私有镜像仓库已经部署完成,后续Jenkins制作好自定义镜像推送到此,目标服务器即可前往指定仓库拉取镜像在本地运行成容器
二、Harbor仓库配置
1.新建仓库
我们首先可以点击主页
新建项目,建立一个新的仓库
项目名称是这个仓库的名称,设置为mydevops
访问级别如果未勾选公开则进入此仓库操作需要账号密码,设置勾选
项目配额限制为此仓库空间占用限制,-1代表无限容量
镜像代理暂时不需要设置这个镜像仓库也像Gitlab一样,可以设置不同用户和角色进行合作管理
| 镜像仓库 |
|---|
![]() |
2.推送要求
- 镜像名称要求
和其他镜像仓库一样,要将自定义镜像推送到Harbor仓库,对镜像名称是有一定要求的
首先是
Harbor仓库的地址,也就是之前配置的ip+端口其次是
Harbor中的仓库名称,也就是之前新建的mydevops然后是
镜像名,我们可以自定义最后是
镜像版本,也就是docker镜像的标签一个可推送到Harbor仓库的标准镜像名是:
Harbor地址/项目名/镜像名:版本首先在服务器中手动改名,调试好命令之后只需要在Jenkins配置中使用即可
因为我们之前是在application服务器构建镜像的,所以此步进入application服务器调试命令
docker ps查询当前镜像
docker tag 原镜像ID 新镜像标签,tag参数本质上是给某个镜像追加一个标签,而新老标签镜像的ID是一致的
[root@Application-~]# docker images
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
myapp:v1.0.0 bb3afd22bad7 761MB 261MB
myapp:v2.0.0 6a5174dbfbc4 761MB 261MB U
myapp:v3.0.0 31b38137caaa 761MB 261MB
[root@Application-~]# docker tag bb3afd22bad7 10.0.0.139:80/mydevops/myapp:v1.0.0
[root@Application-~]# docker images
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
10.0.0.139:80/mydevops/myapp:v1.0.0 bb3afd22bad7 761MB 261MB
myapp:v1.0.0 bb3afd22bad7 761MB 261MB
myapp:v2.0.0 6a5174dbfbc4 761MB 261MB U
myapp:v3.0.0 31b38137caaa 761MB 261MB
- docker配置要求
我们使用docker拉取阿里云等仓库的镜像时,需要先在
/etc/docker/daemon.json中配置好仓库路径后,docker才能前往拉取所以我们自己的私有镜像仓库也需要在
daemon.json中写入地址后才可以==推送(Jenkins服务器)==和==拉取(目标服务器)==
在 Jenkins服务器 和 application服务器 中编辑
/etc/docker/daemon.json文件配置加速仓库,防止构建镜像中拉取失败
配置
insecure-registries字段,写入Harbor仓库地址保存后重载配置
vim /etc/docker/daemon.json
-------------------------------------------------------------------------------
{
"registry-mirrors": [
"https://mj13bvr2.mirror.aliyuncs.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.credclouds.com",
"https://k8s.credclouds.com",
"https://quay.credclouds.com",
"https://gcr.credclouds.com",
"https://k8s-gcr.credclouds.com",
"https://ghcr.credclouds.com",
"https://do.nark.eu.org",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.1panel.live",
"https://docker.rainbond.cc"
],
"insecure-registries": ["10.0.0.139:80"]
}
-------------------------------------------------------------------------------
systemctl daemon-reload
systemctl restart docker
- 权限要求
Jenkins服务器要推送镜像到Harbor私有仓库,要配置登录用户名和密码:
docker login -u admin -p Harbor12345 10.0.0.139:80,显示Login Succeeded即是登录成功,后续可推送代码application服务器需要前往Harbor仓库拉取镜像,因为此处mydevops仓库是公开的可以直接上,如果是私有的也需要先
docker login登录,拉取命令是docker pull跟上上文提到的标准镜像名最重要的一点,Jenkins要通过docker命令构建镜像、推送镜像,需要让Jenkins用户可以使用服务器上的docker命令
# 将jenkins用户添加到docker用户组
usermod -aG docker jenkins
# 重启Jenkins使配置生效
systemctl restart jenkins
# 修改docker.sock的所属组
chown root:docker /var/run/docker.sock
# 重启docker
systemctl restart docker
三、Jenkins配置
1.Jenkins制作镜像
在之前的Jenkins任务配置中,构建后操作是通过Send build artifacts over SSH将构建好的jar包发送到application服务器后传入命令让application服务器制作镜像并运行容器
而此时我们需要Jenkins先制作好镜像,因为,我们先
删除之前配置的构建后操作然后在构建步骤最后追加
执行shell,因为通过dockerfile制作镜像,而dockerfile文件内容有COPY myapp.jar /usr/local/myapp-docker/,意思是将当前路径的jar包复制到容器内指定目录,而在构建时需要jar包和dockerfile在同一目录,所以先执行mv target/*.jar docker/将jar包移动写入制作镜像、推送镜像的命令:
docker build -t myapp:$tag docker/
docker build -t是docker制作镜像的命令,myapp是镜像名,$tag是之前参数化构建设置的标签,docker/是指定dockerfile文件所在目录应用后保存,我们可以先构建一次,查看控制台输出和服务器镜像情况查看
| 镜像仓库 |
|---|
![]() |
![]() |
![]() |
2.Jenkins推送镜像
在镜像构建成功后,我们继续追加shell命令,将构建好的镜像推送到Harbor仓库
首先还是登录Harbor仓库:
docker login -u admin -p Harbor12345 10.0.0.139:80然后修改镜像标签:
docker tag myapp:$tag 10.0.0.139:80/mydevops/myapp:$tag最后推送镜像:
docker push 10.0.0.139:80/mydevops/myapp:$tag点击构建,查看控制台输出成功后,打开Harbor主页进入mydevops仓库,即可看到镜像
| 镜像仓库 |
|---|
![]() |
![]() |
四、application服务器配置
1.制作脚本文件
在Jenkins完成镜像制作,推送镜像到Harbor仓库后,需要Jenkins通知目标application服务器,进入Harbor仓库拉取制作好的自定义镜像并将其运行成镜像
Jenkins告知application拉取哪个镜像
判断当前是否正在运行这个镜像形成的容器,需要停止并删除
判断当前是否存在当前镜像,需要删除
目标服务拉取Harbor上的镜像
将拉取下来的镜像运行成容器
而这些操作都让Jenkins来告知完成的话成本较大且每次修改都需要进入Jenkins的任务配置,我们可以在application服务器编写脚本完成这些操作,Jenkins服务器只需要让application运行这个脚本即可
并且在运行这个脚本时,标准镜像名中的每个参数都需要Jenkins服务器告知application服务器,application服务器才知道拉取哪个镜像。这些参数有
Harbor仓库地址、Harbor仓库名、镜像名、镜像版本其次容器运行时是需要占用application服务器的端口,Jenkins服务器也需要告知application服务器可占用的
端口号
# 在application服务器编辑脚本文件
vim /usr/bin/deploy.sh
-------------------------------------------------------------------------------
harbor_addr=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6
# 由Jenkins告知需要拉取的镜像信息
imageName=$harbor_addr/$harbor_repo/$project:$version
# step1:查看当前镜像是否有容器运行,若有则停止删除容器
containerID=`docker ps -a | grep ${project} | awk '{print $1}'`
if [ "$containerID" != "" ] ; then
docker stop $containerID
docker rm $containerID
fi
# step2:查看当前是否存在相同镜像,如果有则删除
tag=`docker images --format "{{.Tag}}" ${project}`
if [[ "$tag" =~ "$version" ]] ; then
docker rmi $imageName
fi
# step3:登录远程Harbor仓库,拉取镜像
docker login -u admin -p Harbor12345 $harbor_addr
docker pull $imageName
# step4:将拉取的镜像运行成容器
docker run -d -p $host_port:$container_port --name $project $imageName
-------------------------------------------------------------------------------
2.Jenkins任务配置
脚本文件准备好后,
Harbor仓库地址、Harbor仓库名、镜像名、镜像版本、宿主机端口、容器端口都需要Jenkins服务器告知在Jenkins的myapp-docker任务配置中,增加构建后操作步骤,依旧选择
Send build artifacts over SSH方式
SSH Server的Name选择之前配置的application
Exec command写入执行目标服务器的脚本文件,并且传入所需参数sh /usr/bin/deploy.sh 10.0.0.139:80 mydevops myapp $tag 8082 8080
和之前一样,因为创建镜像时就是用
$tag等参数构建的,所以这里直接调用即可应用保存后,点击构建查看控制台输出,无报错且application服务器容器运行正常,网页内容正常显示则发布成功
| 镜像仓库 |
|---|
![]() |
![]() |
![]() |
![]() |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐













所有评论(0)