在前面的文章中给大家介绍了云原生架构相关的一些工具,但是还无法使用串联整合起来,最主要的问题在于如何使用Jenkins制作镜像并推送到Harbor仓库中,要想完成这一步,首先需要让Jenkins能够使用Docker命令。今天给大家介绍Jenkins如何整合Docker以及具体的使用流程。
让Jenkins能够使用宿主机上的Docker。
[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
[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使用的文件映射到容器内部。
docker-compose up -d
# 进入到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通知目标服务器拉取镜像部署即可。
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仓库中。
在日志中可以看出构建命令已经开始执行。
推送Harbor仓库成功。
[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]#
可以将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的镜像,并且运行为容器。
成功。
可以多次执行,我们在脚本里已经写了删除的方法,在每一次拉取镜像和运行容器之前会判断是否已经存在,存在的情况下会先删除。
点击下方微信公众号名片,获取更多内容。