前面在部署项目时,我们主要采用Jenkins推送jar包到指定服务器,再通过脚本命令让目标服务器对当前jar进行部署,这种方式在项目较多时,每个目标服务器都需要将jar包制作成自定义镜像再通过docker进行启动,重复操作比较多,会降低项目部署时间。
Docker官方提供了Registry镜像仓库,但是Registry的功能相对简陋。Harbor
是VMware公司提供的一款镜像仓库,提供了权限控制、分布式发布、强大的安全扫描与审查机制等功能。
我们可以通过Harbor作为私有的Docker镜像仓库
。让Jenkins统一将项目打包并制作成Docker镜像发布到Harbor仓库中,只需要通知目标服务,让目标服务统一去Harbor仓库上拉取镜像并在本地部署即可。
下载Harbor安装包:https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz
使用tar -zxvf harbor-offline-installer-v2.3.4.tgz
命令解压。
解压后进入文件夹,官方提供了一个配置文件模版,使用命令复制cp harbor.yml.tmpl harbor.yml
编辑harbor.yml
文件:
两处改动:
启动Harbor:执行./install.sh
命令。
由于博主机器是Mac M1芯片,是arm64
架构,提示该镜像不支持,只支持linux/amd64
。如果你的机器是linux/amd64架构的就没问题。
注意:如果不是arm64
架构的同学可以直接跳过一下步骤。
cat /etc/centos-release
uname -sr
构建Harbor-arm64 镜像的Github仓库:https://github.com/goharbor/harbor-arm
# first step: clone harbor ARM code
git clone https://github.com/goharbor/harbor-arm.git
# execute build command:Download harbor source code
cd harbor-arm && make download
# compile redis:
make compile_redis
# Prepare to build arm architecture image data:
make prepare_arm_data
# Replace build arm image parameters:
make pre_update
# Compile harbor components:
make compile COMPILETAG=compile_golangimage
# Build harbor arm image:
make build GOBUILDTAGS="include_oss include_gcs" BUILDBIN=true NOTARYFLAG=true TRIVYFLAG=true CHARTFLAG=true GEN_TLS=true PULL_BASE_FROM_DOCKERHUB=false
以下记录一下博主在安装过程中遇到的问题:
使用yum命令安装make
yum -y install make
首先下载Git安装包,Git官网下载地址:https://git-scm.com/download/linux。
然后通过tar -zxvf
命令进行解压。
进入目录后执行make configure
命令。但是出现报错:
需要安装autoconf
:
#查看 autoconf、automake 对应的包
yum whatprovides autoconf automake
# 安装对应的包
yum -y install autoconf-2.69-27.el8.noarch
yum -y install automake-1.16.1-7.el8.noarch
make configure
./configure --prefix=/usr/local/git
make profix=/usr/local/git
make install
配置环境变量:
vim /etc/profile
export GIT_HOME=/usr/local/git
export PATH=$PATH:$GIT_HOME/bin
执行make compile_redis
命令出现连接超时,拒绝连接:
正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|0.0.0.0|:443.
解决方法:
查看raw.githubusercontent.com解析出的ip,然后使用vim /etc/hosts
配置主机的host即可
执行make compile_redis
命令成功
执行make compile COMPILETAG=compile_golangimage
命令
执行make build GOBUILDTAGS="include_oss include_gcs" BUILDBIN=true NOTARYFLAG=true TRIVYFLAG=true CHARTFLAG=true GEN_TLS=true PULL_BASE_FROM_DOCKERHUB=false
命令。
过程时间会比较长。
完成之后使用docker images
命令查看构建出的Harbor-arm镜像。
修改install.sh文件和prepare文件:
install.sh
文件中的第63行注释,使用自己构建的arm镜像,不需要load Harbor离线安装包里面的镜像。prepare
文件的第60行,修改镜像的tag为dev-arm
。修改前:
修改后:
使用./install.sh
命令启动,看到输出日志表示成功。
启动成功后,访问IP地址+80
端口,看到Harbor的登录页面,说明我们支持arm64架构的Harbor版本部署成功。
(看起来非常的麻烦,博主曾经都想放弃了,但是最终部署成功以后还是有些成就感的,所以当你遇到什么解决不了的问题的时候希望你坚持下去,不要急躁)
默认的账号是admin,密码是在harbor.yml文件中配置的,默认是Harbor12345。
Harbor作为镜像仓库,主要的交互方式就是将镜像上传到Harbor上,以及从Harbor上下载指定镜像
在传输镜像前,可以先使用Harbor提供的权限管理,将项目设置为私有项目,并对不同用户设置不同角色,从而更方便管理镜像。
User --》 NEW USER
Projects --》 NEW PROJECT
修改镜像Tag。
名称要求:harbor地址/项目名/镜像名:版本
#查找镜像
docker images|grep app
#给镜像打上标签
docker tag app:v1.0.0 192.168.153.131:80/repository/app:v1.0.0
harbor默认是https协议的,如果想要通过http协议拉取harbor的镜像需要修改**/etc/docker/daemon.json**文件。使用vim /etc/docker/daemon.json
命令修改daemon.json文件。
"insecure-registries": ["192.168.153.131:80"]
注意:修改后重启docker
systemctl daemon-reload
ystemctl restart docker
docker login -u Joey -p Admin123456 192.168.153.131:80
原因是因为我修改daemon.json文件文件后没有重启docker,重启docker后登录成功。
将镜像推送到Harbor仓库。
docker ps |grep app
docker push 192.168.153.131:80/repository/app:v1.0.0
将Harbor镜像仓库中的镜像拉取下来
# 登录Harbor仓库
docker login -u Joey -p Admin123456 192.168.153.131:80
# 拉取镜像
docker pull 192.168.153.131:80/repository/app:v1.0.0
大家发现是哪里有问题了吗?
当Harbor的地址是192.168.153.131的时候,就会出现报错:Error response from daemon: Get "https://192.168.153.131/v2/": dial tcp 192.168.153.131:443: connect: connection refused
。
而地址为192.168.153.131:80
的时候是成功的。
因为如果不加上80端口号,默认使用的https的443端口号。所以不要省略端口号。
构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部官方推荐直接采用宿主机的Docker环境即可。
设置Jenkins容器使用宿主机Docker.
编辑Jenkins的docker-compose.yml
文件: 添加宿主机docker映射
version: "3.1"
services:
jenkins:
image: jenkins/jenkins
container_name: jenkins
ports:
- 8080:8080
- - 50000:50000
volumes:
- ./data/:/var/jenkins_home/
- /usr/bin/docker:/usr/bin/docker
- /var/run/docker.sock:/var/run/docker.sock
- /etc/docker/daemon.json:/etc/docker/daemon.json
然后使用docker-compose up -d
命令重新启动Jenkins。
在Jenkins项目中的设置,构建步骤,添加执行shell,加入以下脚本。
#将target目录下的jar包移动到docker目录下
mv target/*.jar docker/app.jar
#使用docker build命令通过Dockerfile文件构建Docker镜像
docker build -t app:$tag docker/
# 登录Harbor仓库
docker login -u admin -p Harbor12345 192.168.153.131:80
# 给镜像打上标签
docker tag app:$tag 192.168.153.131:80/repository/app:$tag
#将镜像推送到Harbor
docker push 192.168.153.131:80/repository/app:$tag
通过SSH Publishers插件执行构建后操作,执行服务器上准备好的脚本文件deploy.sh
# 执行脚本命令
deploy.sh $harbor_url $harbor_project_name $project_name $tag $container_port $host_port
定义了Harbor仓库的地址、镜像Tag、容器端口、宿主机端口等参数。
这个脚本文件是检查目标容器是否启动,如果启动则停止容器,并删除镜像。
从Harbor仓库重新拉去镜像并启动。
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
container_port=$5
host_port=$6
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
containerId=`docker ps -a | grep ${project_name} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
docker stop $containerId
docker rm $containerId
echo "Delete Container Success"
fi
imageId=`docker images | grep ${project_name} | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
docker rmi -f $imageId
echo "Delete Image Success"
fi
docker login -u admin -p Harbor12345 $harbor_url
docker pull $imageName
docker run -d -p $host_port:$container_port --name $project_name $imageName
echo "Start Container Success"
echo $project_name
将脚本添加到环境变量中,使脚本可以在任意目录执行mv deploy.sh /usr/local/bin
给脚本赋可执行权限:chmod a+x deploy.sh
在Jenkins项目中的设置中,选择参数化构建过程,添加参数:
字符参数
:harbor_url、harbor_project_name、project_name、host_port、container_port
Git参数
:tag
注意,由于我们是通过Git标签构建的,所以在Maven进行构建之前需要增加一部切换分支的操作:
在maven构建之前切换git分支。
Git参数需要Jenkins安装Git Parameter插件
点击Build with Parameters
开始构建,Git Parameter插件会查询远程Git仓库的分支和标签信息,我们选择v1.0.0
tag,其他参数默认即可,点击开始构建
。
在控制台输出查看运行日志:
Jenkins在完成构建后会执行构建后操作,会将这些参数传递给服务器上准备好的脚本文件,服务器执行脚本文件,从Harbor仓库上拉去Jenkins打包上传好的镜像,创建容器,启动服务。
Jenkins上传到Harbor仓库的镜像:
项目启动成功!
结束。