江小南

V1

2022/06/16阅读:28主题:默认主题

Jenkins整合Docker以及应用

引言

在前面的文章中给大家介绍了云原生架构相关的一些工具,但是还无法使用串联整合起来,最主要的问题在于如何使用Jenkins制作镜像并推送到Harbor仓库中,要想完成这一步,首先需要让Jenkins能够使用Docker命令。今天给大家介绍Jenkins如何整合Docker以及具体的使用流程。

总体思路

让Jenkins能够使用宿主机上的Docker。

具体步骤

  1. 修改Docker核心文件docker.sock
[root@hecs-33408 run]# pwd
/var/run
[root@hecs-33408 run]# ll
total 32
...
srw-rw----  1 root   docker    0 Jun  9 20:20 docker.sock
...
[root@hecs-33408 run]# 
# 将所属组修改为root,并赋予其他用户读和写的权限。
[root@hecs-33408 run]# chown root:root docker.sock 
[root@hecs-33408 run]# chmod o+rw docker.sock
  1. 修改Jenkins的docker-compose.yml文件
[root@hecs-33408 jenkins_docker]# pwd
/root/docker/jenkins_docker
[root@hecs-33408 jenkins_docker]# ll
total 8
drwxrwxrwx 22 root root 4096 Jun 13 00:02 data
-rw-r--r--  1 root root  188 Jun 12 11:42 docker-compose.yml
[root@hecs-33408 jenkins_docker]# vi docker-compose.yml 
[root@hecs-33408 jenkins_docker]# cat docker-compose.yml 
version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /etc/docker/daemon.json:/etc/docker/daemon.json
[root@hecs-33408 jenkins_docker]# 

追加了后面三行,目的是将本地Docker使用的文件映射到容器内部。

  1. 重启Jenkins容器
docker-compose up -d
  1. 验证
# 进入到Jenkins内部执行Docker命令
[root@hecs-33408 jenkins_docker]# docker exec -it jenkins bash
jenkins@c22a8714797f:/$ docker version
Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:05:12 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:03:33 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.6
  GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
 runc:
  Version:          1.1.2
  GitCommit:        v1.1.2-0-ga916309
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
jenkins@c22a8714797f:/$ 

成功。

在前面的文章中,我们使用Jenkins将编译的jar包传到目标服务器,再由目标服务器制作镜像部署。当Jenkins整合了Docker,就可以通过Jenkins制作镜像并推送到Harbor仓库,Jenkins通知目标服务器拉取镜像部署即可。

具体使用

  1. 修改代码,提交gitlab并打标签3.0.0
  1. 修改Jenkins配置
mv target/*.jar docker/
docker build -t jiagnan:$test_tag docker/
docker tag jiagnan:$test_tag 114.116.110.197:80/registry/jiagnan:$test_tag
docker login -u admin -p Harbor12345 114.116.110.197:80
docker push 114.116.110.197:80/registry/jiagnan:$test_tag

这里使用构建命令,可以通过Jenkins将jar包制作为镜像,并且推送到Harbor仓库中。

  1. 进行构建

在日志中可以看出构建命令已经开始执行。

推送Harbor仓库成功。

  1. 部署
  • 在目标服务器编写脚本
[root@ecs-132233 jiangnan]# pwd
/root/jiangnan
[root@ecs-132233 jiangnan]# vi deploy_jiangnan.sh
[root@ecs-132233 jiangnan]# cat deploy_jiangnan.sh 
#!/bin/sh
# 这几个参数将由Jenkins传送到目标服务器
harbor_addr=$1    # 仓库地址
harbor_repo=$2    # 仓库名称
project=$3        # 项目名称
version=$4        # 版本号
host_port=$5      # 宿主机端口
container_port=$6 # 容器映射端口
# 获取镜像名称
imageName=$harbor_addr/$harbor_repo/$project:$version
echo $imageName
# 判断当前服务器容器是否运行,运行的话需要删除
containerId=`docker ps -a | grep ${project} | awk '{print $1}'`
echo $containerId
if [ "$containerId" != "" ];then
  docker stop $containerId
  docker rm $containerId
fi
# 判断当前服务器是否有镜像,有的话需要删除
tag=`docker images | grep ${project} | awk '{print $2}'`
echo $tag
if [[ "$tag" =~ "$version" ]];then
  docker rmi -f $imageName
fi
# 登录Harbor
docker login -u admin -p Harbor12345 $harbor_addr
# 拉取镜像
docker pull $imageName
# 将拉取下来的镜像运行成容器
docker run -d -p $host_port:$container_port --name $project $imageName

echo "SUCCESS..."
[root@ecs-132233 jiangnan]# 
  • 进行Jenkins配置

可以将Harbor地址,仓库,端口等信息写到这里来,作为参数手动输入。做到这一步,我们前面在第二步中的构建命令也可以修改为获取参数的形式。

通过$符获取前面写的参数。deploy_jiangnan.sh $harbor_addr $harbor_repo $project $test_tag $host_port $container_port。我这里直接写了执行脚本,是因为在目标服务器上将此脚本放在P$ATH的一个路径下。

  • 再次构建

构建时将参数填写进去。

  • 验证

Harbor仓库中有了v3.0.0版本的镜像

[root@master sbin]# docker images
REPOSITORY                             TAG                IMAGE ID       CREATED              SIZE
114.116.110.197:80/registry/jiangnan   v3.0.0             788ef23aedaa   About a minute ago   832MB
hello-world                            latest             feb5d9fea6a5   8 months ago         13.3kB
daocloud.io/library/java               openjdk-8u40-jdk   4aefdb29fd43   7 years ago          816MB
[root@master sbin]# docker ps
CONTAINER ID   IMAGE                                         COMMAND                  CREATED              STATUS          PORTS                                       NAMES
5d5ac88bf4f6   114.116.110.197:80/registry/jiangnan:v3.0.0   "/bin/sh -c 'java -j…"   About a minute ago   Up 59 seconds   0.0.0.0:8081->8080/tcp, :::8081->8080/tcp   jiangnan
[root@master sbin]# 

目标服务器上拉取到了v3.0.0的镜像,并且运行为容器。

  • 访问

成功。

可以多次执行,我们在脚本里已经写了删除的方法,在每一次拉取镜像和运行容器之前会判断是否已经存在,存在的情况下会先删除。

分类:

后端

标签:

后端

作者介绍

江小南
V1