服务器资源与角色

身份 角色 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即可进入登录页,输入默认用户名密码进入主页:adminHarbor12345

镜像仓库
  • 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服务器容器运行正常,网页内容正常显示则发布成功

镜像仓库
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐