前言
上一章说到利用docker-compose一键部署redis,mysql和java服务。本章我们要实现的,就是通过jenkins构建项目,在docker容器部署的自动化功能。
配置
docker-compose
首先配置好docker-compose.yml文件,前提当然是要先安装好docker以及docker-compose,可以参考我上一篇文章 docker-compose 一键安装redis和Mysql,部署java。
下面我直接贴上代码。(这里我们配置两个java项目)
version: '3'
services:
java-demo-one:
## jdk镜像
image: ascdc/jdk8
## 容器名字
container_name: java-demo-one
ports:
- "8083:8083"
## 挂载
volumes:
##这是我们要启动的jar包
- /data/java-demo-one/java-demo-one-1.0.0.jar:/data/java-demo-one-1.0.0.jar
##这是服务启动脚本,代码见下面
- /data/docker/app.sh:/data/app.sh
##日志输出,具体输出位置可以在app.sh指定,加了这个配置我们到时就能在/data/java-demo-one/logs目录下查看日志
- /data/java-demo-one/logs:/logs/java-demo-one/
## 容器启动脚本,app.sh输入三个参数,restart:重启,java-demo-one:项目名称,1.0.0:jar包版本号,则jar包名称为java-demo-one-1.0.0.jar
entrypoint: /data/app.sh restart java-demo-one 1.0.0
##环境变量
environment:
- TZ=Asia/Shanghai
java-demo-two:
## jdk镜像
image: ascdc/jdk8
## 容器名字
container_name: java-demo-two
ports:
- "8083:8083"
## 挂载
volumes:
##这是我们要启动的jar包
- /data/java-demo-two/java-demo-two-1.0.0.jar:/data/java-demo-two-1.0.0.jar
##这是服务启动脚本,代码见下面
- /data/docker/app.sh:/data/app.sh
##日志输出,具体输出位置可以在app.sh指定,加了这个配置我们到时就能在/data/java-demo-two/logs目录下查看日志
- /data/java-demo-two/logs:/logs/java-demo-two/
## 容器启动脚本,app.sh输入三个参数,restart:重启,java-demo-two:项目名称,1.0.0:jar包版本号,则jar包名称为java-demo-two-1.0.0.jar
entrypoint: /data/app.sh restart java-demo-two 1.0.0
##环境变量
environment:
- TZ=Asia/Shanghai
贴上app.sh脚本(该脚本用来重启java服务)
#!/bin/bash
## jar包版本号
version=$3
day=$(date '+%Y-%m-%d')
##app名称,如java-demo-two、java-demo-one
appName=$2
if [ -z $appName ];then
appName=`ls -t |grep .jar$ |head -n1`
fi
function start()
{
count=`ps -ef |grep java|grep $appName|wc -l`
if [ $count != 0 ];then
echo "Maybe $appName is running, please check it..."
else
echo "The $appName is starting..."
java -jar /data/$appName-$version.jar --spring.profiles.active=test -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G > /logs/$appName/$day.log 2>&1
fi
}
function stop()
{
appId=`ps -ef |grep java|grep $appName|awk '{print $2}'`
if [ -z $appId ];then
echo "Maybe $appName not running, please check it..."
else
echo "The $appName is stopping..."
kill -9 $appId
fi
}
function restart()
{
echo "The appName is $appName"
stop
for i in {5..1}
do
echo -n "$i "
sleep 1
done
echo 0
start
}
function backup()
{
# get backup version
backupApp=`ls |grep -wv $releaseApp$ |grep .jar$`
# create backup dir
if [ ! -d "backup" ];then
mkdir backup
fi
# backup
for i in ${backupApp[@]}
do
echo "backup" $i
mv $i backup
done
}
function status()
{
appId=`ps -ef |grep java|grep $appName|awk '{print $2}'`
if [ -z $appId ]
then
echo -e "\033[31m Not running \033[0m"
else
echo -e "\033[32m Running [$appId] \033[0m"
fi
}
function usage()
{
echo "Usage: $0 {start|stop|restart|status|stop -f}"
echo "Example: $0 start"
exit 1
}
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
usage;;
esac
我们根据上面配置的挂载路径,先把文件配置好,放到指定的路径
- 在/data/docker目录下,保存docker-compose.yml和app.sh
- 新建java项目目录,分别为/data/java-demo-one和/data/java-demo-two,然后在里面再新建一个logs文件夹用来存放日志。
到此,我们docker这边的配置已经搭建好了,下面我们来配置jenkins。
jenkins 配置
安装jenkins这里就不多说了吧…..自寻教程
首先我们新建一个任务
配置git,拉取项目
触发构建后到远程服务器
也就是我们需要用docker容器部署的服务器,最后目的就是把我们构建好的jar包,推送到docker服务器对应的java项目路径,如java-demo-one-1.0.0.jar,需要推送到/data/java-demo-one目录下,不会操作的,请先了解jenkins如何构建java。
command中,我们利用docker-compose命令来重启容器。
source /etc/profile
cd /data/docker
docker-compose stop java-demo-one
docker-compose rm -f java-demo-one
docker-compose up -d java-demo-one
配置另外一个项目只要改下项目的名称即可 整个流程下来就是:
- jenkins构建代码,生成jar包
- jar包到指定的远程服务器的指定目录下
- 利用命令,执行docker-compose指令,删除旧容器,运行新的容器。
总结
至此,我们已经实现了利用jenkins+docker-compose实现了服务一键部署。 当然还有很多地方需要优化,比如版本号怎么管理,环境变量是不是可以统一配置等等。 而且思路也有局限,如果有更好方式的朋友,非常欢迎提出建议。