• Spring-boot项目部署Docker镜像中
  • 启动Docker,运行Spring应用

本篇的实战项目沿用Jenkins Tomcat部署持续交付实战中的项目,项目具体配置请看该篇。

SpringBoot Docker应用部署流程

image-20210222205841813

Jenkins自由风格任务部署SpringBoot Docker应用

注意:本篇采用的是Jenkins依旧是在官网下载的war包,放到Tomcat中启动即可

SpringBoot打包Docker镜像部署的Shell脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env bash

## 需要在Jenkins任务中配置以下参数
#export mysql_ip=mysql server ip or host
#export mysql_port=mysql port
#export mysql_user=mysql username
#export mysql_pwd=mysql password
#export PROJ_PATH=project path
# Docker镜像名称
export docker_image_name=jeesite4
# Docker容器命名
export docker_container_name=iJeesite4

## 检查系统类型
export os_type=`uname`

## 配置数据库参数
cd $PROJ_PATH/web/bin/docker
if [[ "${os_type}" == "Darwin" ]]; then
sed -i "" "s/mysql_ip/${mysql_ip}/g" application-prod.yml
sed -i "" "s/mysql_port/${mysql_port}/g" application-prod.yml
sed -i "" "s/mysql_user/${mysql_user}/g" application-prod.yml
sed -i "" "s/mysql_pwd/${mysql_pwd}/g" application-prod.yml
else
sed -i "s/mysql_ip/${mysql_ip}/g" application-prod.yml
sed -i "s/mysql_port/${mysql_port}/g" application-prod.yml
sed -i "s/mysql_user/${mysql_user}/g" application-prod.yml
sed -i "s/mysql_pwd/${mysql_pwd}/g" application-prod.yml
fi

## Maven 编译
cd $PROJ_PATH/root
mvn clean install -Dmaven.test.skip=true

## Maven 打包
cd $PROJ_PATH/web
mvn clean package spring-boot:repackage -Dmaven.test.skip=true -U

## 停止/删除 现有的Docker container
docker stop $docker_container_name
docker rm $docker_container_name
docker rmi $docker_image_name

## 生成新的docker image
cd $PROJ_PATH/web/bin/docker
rm -f web.war
cp $PROJ_PATH/web/target/web.war .
docker build -t $docker_image_name .

## 启动新的docker image 暴露端口 8981
docker run -d --name $docker_container_name -p 8981:8980 $docker_image_name

Dockerfile

根据Dockerfile生成镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM frolvlad/alpine-java:jdk8-slim
MAINTAINER ThinkGem@163.com
ENV TZ "Asia/Shanghai"
ENV LANG C.UTF-8
VOLUME /tmp
WORKDIR /app
ADD web.war .
RUN jar -xvf web.war
WORKDIR /app/WEB-INF
ENV JAVA_OPTS "-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"
ENV JAVA_OPTS "$JAVA_OPTS -Dspring.profiles.active=prod"
ADD application-prod.yml ./classes/config
ENTRYPOINT java -cp /app $JAVA_OPTS org.springframework.boot.loader.WarLauncher
EXPOSE 8980

Jenkins创建自由风格Job进行部署

  1. [新建任务]创建一个“构建一个自由风格的软件项目”的Job,进入配置页

  2. 配置”源码管理” -> “Git”

    image-20210224072014882

  3. “构建” -> “增加构建步骤” -> “执行shell”

    • 注意:我们SpringBoot是Docker应用,需要连接的MySQL同样是Docker引用,因此在连接MySQL的时候,使用Docker的内网IP,会加快访问速度,查看内网ip
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 1. 进入容器,查看cat /etc/host
    root@iZ2ze0mc5577fn814ewhb8Z ~]# docker exec -it 401b286b9d15 bash
    root@401b286b9d15:/# cat /etc/hosts
    127.0.0.1 localhost
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.2 401b286b9d15
    # 2. docker inspect 容器id|容器name,查看容器详情也是可以查看到

    image-20210224072245273

    shell脚本

    1
    2
    3
    4
    5
    6
    7
    8
    . ~/.bash_profile
    export mysql_ip=172.17.0.2
    export mysql_port=3306
    export mysql_user=root
    export mysql_pwd=123123
    export PROJ_PATH=`pwd`

    sh deploy/deploy_docker.sh
  4. 完成以上配置后,点击[保存],回到Job页面,点击[Build Now],进入Build Number查看“控制台输出”,查看执行的日志

    image-20210224072451809

  5. Job执行成功,浏览器访问:http://ip:8981

    image-20210224074936882

    默认最高管理员账号:system 密码:admin,登录后的页面

    image-20210224075025053

Jenkins Pipeline任务部署SpringBoot Docker应用

本次流水线脚本采用的是Declared pipeline,跟上一篇Tomcat的中使用的流水线脚本是Script pipeline,可以对比学习

SpringBoot打包Docker镜像部署的pipeline脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
pipeline {
agent {
label 'master'
}

environment {
docker_image_name = 'jeesite4'
docker_container_name = 'iJeesite4'
}

parameters {
string(name: 'branch', defaultValue: 'master', description: 'Git branch')
}

stages{
stage('同步源码') {
steps {
git url:'https://gitee.com/jeanlv/jeesite4.git', branch:"$params.branch"
}
}

stage('设定配置文件'){
steps{
sh '''
. ~/.bash_profile

export os_type=`uname`
cd ${WORKSPACE}/web/bin/docker
if [[ "${os_type}" == "Darwin" ]]; then
sed -i "" "s/mysql_ip/${mysql_docker_ip}/g" application-prod.yml
sed -i "" "s/mysql_port/${mysql_port}/g" application-prod.yml
sed -i "" "s/mysql_user/${mysql_user}/g" application-prod.yml
sed -i "" "s/mysql_pwd/${mysql_pwd}/g" application-prod.yml
else
sed -i "s/mysql_ip/${mysql_docker_ip}/g" application-prod.yml
sed -i "s/mysql_port/${mysql_port}/g" application-prod.yml
sed -i "s/mysql_user/${mysql_user}/g" application-prod.yml
sed -i "s/mysql_pwd/${mysql_pwd}/g" application-prod.yml
fi
'''
}
}

stage('Maven 编译'){
steps {
sh '''
. ~/.bash_profile

cd ${WORKSPACE}/root
mvn clean install -Dmaven.test.skip=true

cd ${WORKSPACE}/web
mvn clean package spring-boot:repackage -Dmaven.test.skip=true -U
'''
}
}

stage('停止 / 删除 现有Docker Container/Image '){
steps {
script{
try{
sh 'docker stop $docker_container_name'
}catch(exc){
echo 'The container $docker_container_name does not exist'
}

try{
sh 'docker rm $docker_container_name'
}catch(exc){
echo 'The container $docker_container_name does not exist'
}

try{
sh 'docker rmi $docker_image_name'
}catch(exc){
echo 'The docker image $docker_image_name does not exist'
}
}
}
}

stage('生成新的Docker Image'){
steps {
sh '''
cd ${WORKSPACE}/web/bin/docker
rm -f web.war
cp ${WORKSPACE}/web/target/web.war .
docker build -t $docker_image_name .
'''
}
}

stage('启动新Docker实例'){
steps {
sh '''
docker run -d --name $docker_container_name -p 8981:8980 $docker_image_name
'''
}
}
}
}

Dockerfile

与自由风格的一致,详情查看”Jenkins自由风格任务部署SpringBoot Docker应用”中的Dockerfile脚本即可。

Jenkins创建流水线Job进行部署

  1. [新建任务]创建一个“构建一个自由风格的软件项目”的Job,进入配置页

  2. [General] -> [This project is parameterized]进行参数配置,mysql相关的配置信息等

    image-20210224074006476

  3. 配置”流水线” -> “定义”选择”Pipeline script from SCM”,配置Git信息

    image-20210224074428227

    配置Groovy脚本的路径

    image-20210224074501456

  4. 完成以上配置后,点击[保存],回到Job页面,点击[Build with Parameters],查看配置的参数

    image-20210224074634413

  5. 点击[开始构建],查看“控制台日志”

    image-20210224074706616

  6. 查看到是执行成功的,回到Job Build页面,查看流水线执行图

    image-20210224074747647

这时我们浏览器再次访问:http://ip:8981,访问成功

image-20210224074936882

用户名:system 密码:admin,查看登录后的页面

image-20210224075025053

注意:相比直接部署到Tomcat中的优势很明显,Tomcat篇将Jenkins和SpringBoot应用部署到同一个Tomcat中引起了冲突,非常不便,如果要隔离还需要重新复制一个Tomcat在修改tomcat的端口号,进行隔离,操作起来非常繁琐。本篇采用的Docker就非常好的做到了环境隔离,部署起来也相当方便及理解,目前该种方法时非常推荐的。