docker 运行jar exit_基于docker部署springboot项目

  • Post author:
  • Post category:其他


基于docker部署springboot项目,可以用war包加tomcat部署,也可以用jar包制作docker镜像部署。

使用war包加tomcat部署

这是传统的部署方式,每个tomcat里面可以部署多个war包,然后根据contextPath访问不同的项目。tomcat可以是物理安装(直接安装到服务器),也可以通过docker安装。


基于docker部署:

一、调整springboot项目。

  1. 在pom文件中,修改springboot项目的打包方式为war结构。
  2. 将内置的tomcat依赖(spring-boot-starter-tomcat)去掉。(scope改为provided即可,即tomcat只在编译和测试时使用,或者直接用exclude的方式)。
  3. 加入SpringBootServletInitializer的实现。

二、在docker中安装tomcat

1. 在服务器中,创建tomcat的工作目录

/home/tomcat:conf: 放置配置文件,server.xml,context.xml等lib:放置依赖的第三方jar包webapps:放置需要发布的war包logs:放置日志文件

2. 安装tomcat

docker pull tomcat[:version] //如果version不提供,则下载最新版latest

tomcat安装后,在docker中的目录结构如下:

209c73399d29421d9fed3eee1433aacf

docker tomcat 目录

3. 准备发布

a. 将springboot项目打包成war包,并上传到服务器webapps目录。如果只有一个项目,又不需要contextPath,则可以直接打包成ROOT.war,然后上传到webapps目录。

b. 如果有多个项目,则需要在server.xml文件中配置context path映射。

c. 如果需要修改tomcat其它配置文件,修改后存储到服务器的/homt/tomcat/conf目录下即可。

4. 运行tomcat

docker run -it -d -p 8080:8080 -v /home/tomcat/logs:/usr/local/tomcat/logs -v /home/tomcat/webapps:/usr/local/tomcat/webapps -v /home/tomcat/conf:/usr/local/tomcat/conf -v /etc/localtime:/etc/localtime --name tomcat tomcat[:version]

注意:需要将[:version]替换成你需要的版本或标签,或者直接用:latest使用最新版

如此这般,你的springboot项目便能部署成功。

使用jar包制作docker镜像部署

使用这种方式部署时,需要为每个项目制作一个docker镜像,镜像又可以制作成不同的版本。

一、制作镜像文件Dockerfile

FROM java:8ARG JAR_FILE=admin.jarCOPY ${JAR_FILE} /jar/admin.jarEXPOSE 8081ENV JAVA_OPTS="-Xms56m -Xmx256m -Djava.security.egd=file:/dev/./urandom"ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /jar/admin.jar"]

这是一个基于java8的简单的镜像文件,会将打成的jar包(admin.jar)copy到容器的/jar/admin.jar,然后运行“java -jar”的命令来启动服务。

二、将springboot项目打包成jar,并上传到服务器,可以是任意目录。

三、将Dockerfile和jar包放置在同一个目录,然后运行命令,制作镜像。

# -t 表示指定镜像仓库名称/镜像名称:镜像标签 .表示使用当前目录下的Dockerfiledocker build -t demo/admin:${VERSION} /home/demo/admin

运行命令后,会自动下载java:8的docker镜像,制作完成后,可通过命令来查看。

docker images

四、运行

docker run --restart=always -it -d -m 1g -p 8080:8080 -v /home/demo/admin/logs:/logs -v /etc/localtime:/etc/localtime --name admin demo/admin:${VERSION}

至此,你的springboot项目就部署完成了,–restart=always指定此示例在docker启动时会自启;-m 1g 指定分配1G的内存;-v 是目录映射;还可通过 -e 来设置环境变量等。

哪种方式好?

  1. 首先,这两种方式部署所使用的war包和jar包,在结构上并没有太大的区别。
  2. war包可能更方便一点,直接扔在tomcat里就行。
  3. jar包镜像则只能在docker里运行。
  4. 使用jar包镜像时,有个不好处就是,每个docker镜像都有6、7百兆,迭代多了之后会很占空间。