上一章说到利用docker-compose一键部署redis,mysql和java服务。本章我们要实现的,就是通过jenkins构建项目,在docker容器部署的自动化功能。
首先配置好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 复制代码
我们根据上面配置的挂载路径,先把文件配置好,放到指定的路径
到此,我们docker这边的配置已经搭建好了,下面我们来配置jenkins。
安装jenkins这里就不多说了吧.....自寻教程
也就是我们需要用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+docker-compose实现了服务一键部署。 当然还有很多地方需要优化,比如版本号怎么管理,环境变量是不是可以统一配置等等。 而且思路也有局限,如果有更好方式的朋友,非常欢迎提出建议。