特别说明
1、如何使用Maven结合Docker把SpringBoot应用编译成可用的镜像进行部署。
2、其中JDK和Maven是传统方式进行安装,由于本人Centos操作系统是有其他软件依赖它们,有时候传统方式安装软件会更好,这里不过多的阐述。有些软件在Docker安装过程与使用过程并没传统方式的简单,比如:Jenkins。
【CentOS-7-x86_64-Minimal-1810.iso下载地址】 http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso
4.1 工程结构
4.2、SpringBoot配置和代码详解
4.2.1工程的pom.xml配置
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-configuration-processor
true
org.springframework.boot
spring-boot-starter-test
test
springboot
org.apache.maven.plugins
maven-compiler-plugin
1.8
1.8
org.springframework.boot
spring-boot-maven-plugin
repackage
com.spotify
docker-maven-plugin
0.4.12
${project.basedir}
/
${project.build.directory}
${project.build.finalName}.jar
org.apache.maven.plugins
maven-jar-plugin
com.flong.SpringbootApplication
4.2.2 no main manifest attribute错误解决
org.apache.maven.plugins
maven-jar-plugin
com.flong.SpringbootApplication
4.2.3 env环境变量文件
JAVA_OPTS_DEFAULT=-Xmx512m
4.2.4 Dockerfile打包工程镜像细讲
FROM frolvlad/alpine-oraclejdk8:slim
MAINTAINER [email protected]
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN mkdir -p /home/devsoft/springboot_dev
WORKDIR /home/devsoft/springboot_dev
EXPOSE 7011
ADD ./target/springboot.jar ./
CMD java ${JAVA_OPTS_DEFAULT} -Djava.security.egd=file:/dev/./urandom -jar springboot.jar
docker exec -it 容器名称或容器id /bin/sh
或要使用sh和bash要看COMMAND,-it
docker exec -it 容器名称或容器id/bin/bash
4.2.5 build.sh文件shell脚本详解
#!/usr/bin/env bash
# 动态变量的【等号】不能有空格和tab键置位,否则获取不了值,而且在shell脚本代码里面不支持空格格式化,支持tab置位格式化。
# 在终端(ssh软件端)或Jenkins客户端shell命令,参数以空格隔开。如:sh build.sh 192.168.1.235 springboot 0.0.1 7011 /home/jenkins/workspace/springboot_dev
IMG_SERVER="$1"
IMG_NAME="$2"
IMG_VERSION="$3"
IMG_PORT="$4"
RUN_EVN="$5"
IMG_PATH="$6"
echo "服务地址:$IMG_SERVER"
echo "工程镜像名称:$IMG_NAME"
echo "工程版本号:$IMG_VERSION"
echo "工程端口:$IMG_PORT"
echo "服务环境:$RUN_EVN"
echo "create $IMG_PATH"
mkdir -p $IMG_PATH
#私服访问url路径和编译之后镜像文件存放到指定路径固定,不动态参数进行处理传值.
REGISTRY_URL="192.168.1.235:5000"
IMG_TAR_GZ_PATH="/home/img_tar_gz_path/"
# 判断动态参数不为空字符串的时候才执行下面操作
if [ "$IMG_SERVER" != "" ] && [ "$IMG_NAME" != "" ] && [ "$IMG_VERSION" != "" ] && [ "$IMG_PORT" != "" ]; then
echo " .......进入删除 Container & Images 操作 ......."
docker rm -f $(docker ps -a | grep $IMG_NAME | awk '{ print $1 }')
docker rmi $(docker images | grep $IMG_NAME | awk '{ print $3 }')
# $IMG_NAME:$IMG_VERSION 这个IMG_VERSION版本(tag)参数不指定默认latest,通过不同参数执行不同环境文件
# -f 表示强制指定Dockerfile文件进行编译
echo " .......进入Building & Images 操作 ....... "
#方法1、指定不同文件存放默认的Dockerfile,使用-f进行强制编译
#docker build -t $IMG_NAME:$IMG_VERSION -f $IMG_PATH"env/"$RUN_EVN/Dockerfile $IMG_PATH
#方法2、跟据不同Dockerfile文件的后缀进行编译不同环境的文件
docker build -t $IMG_NAME:$IMG_VERSION -f $IMG_PATH"env/"Dockerfile_$RUN_EVN $IMG_PATH
# 将镜像打一下标签,然后安照标签进行推送到私服里面,标签名就以服务名即可
docker tag $IMG_NAME:$IMG_VERSION $REGISTRY_URL/$IMG_NAME:$IMG_VERSION
# 推镜像到私服里面
docker push $REGISTRY_URL/$IMG_NAME:$IMG_VERSION
# 创建目录
mkdir -p $IMG_TAR_GZ_PATH
# 保存编译之后镜像文件存放到指定路径
docker save $IMG_NAME -o $IMG_TAR_GZ_PATH/$IMG_NAME.tar.gz
echo " .......进入Runing操作 ....."
docker run -d --network default_network --restart=always --env-file=./.env -e spring.profiles.active=$RUN_EVN --expose=$IMG_PORT --name=$IMG_NAME -p $IMG_PORT:$IMG_PORT $IMG_NAME:$IMG_VERSION
echo " .......Build & Run Finish Success~...."
else
echo " .......Illegal Command Operation ......."
fi
4.2.6 Docker (save、load、tag、push,pull)命令使用
docker save 镜像名 -o 路径/镜像名.tar.gz
或
docker save 镜像名 -o 路径/镜像名.tar
docker load 命令是用于导入使用 docker save 命令导出的镜像,此命令非常重要,由于有些客户要求项目工程要求部署在内网,此时这个命令在无网络的内网情况下部署项目的时候就体现它重要的地位了.语法 docker load [OPTIONS],在加载的过程有点慢,因为文件有点大,其中显示Loady Layer [======]输出信息,证实镜像是分层关系。
docker load -i /home/img_tar_gz_path/springboot.tar.gz
# 将镜像打一下标签,然后安照标签进行推送到私服里面,标签名就以服务名即可
docker tag 镜像名:版本号 私服路径/镜像名:版本号
# 推镜像到私服里面
docker push私服路径/镜像名:版本号
浏览器验证docker push推送上私服的镜像
4.2.7 虚悬镜像
4.2.9 Controller测试代码
@RestController
public class SimpleController {
//读取配置动态参数
@Value("${runEvn}")
private String runEvn;
@GetMapping("/test")
public String test() {
return "this spring boot " + runEvn +" date long "
+ System.currentTimeMillis();
}
}
5.1 特别说明
5.2 新建maven工程
5.3 参数化构建过程说明
clean install -U -Dmaven.test.skip=true
5.4 SSH Publishers设置
#!/bin/bash
# 创建目录
mkdir -p ${serverPath}
# 切换目录
cd ${serverPath}
# 运行脚本
sh build.sh $server ${appName} ${version} ${port} ${env} ${serverPath}
5.5 构建与编译部署项目
5.6 构建&运行&&部署结果
6.1 特别说明
6.2 新建maven工程
6.3 参数化构建过程说明
#!/bin/bash
# 打印信息
echo "用户名${userName}"
echo "服务器${server}"
echo "服务器目录${serverPath}"
# 远程创建存放远程上传的代码目录路径
ssh $server mkdir -p ${targetServerPath}
# 远程拷贝代码到目标机器指定路径
scp -r ${serverPath}/ ${userName}@${server}:${targetServerPath}
docker_server2 Shell脚本
#!/bin/bash
# 切换文件目录
cd ${serverPath}
# 执行脚本
sh build.sh ${server} ${appName} ${version} ${port} ${env} ${serverPath}
6.5 构建与编译部署项目
6.6 构建&运行&部署结果
备注:部署操作动态图片
7.1 总结与建议
7.2 个人简书
Docker+Jenkins+GitLab+Maven+SpringBoot&SpringCloud实现自动化构建镜像与部署详解
访问地址 https://www.jianshu.com/p/bdb0642b7495