详解在Docker容器中运行Spring Boot应用

作者:我是阿永吖 时间:2023-02-21 06:17:34 

spring Boot简化了Spring应用的开发过程,遵循约定优先配置的原则提供了各类开箱即用(out-of-the-box)的框架配置。另一方面,Spring Boot还具备将代码直接构建为可执行jar包的能力,这个jar包是一个可以独立运行的部署单元。基于以上特性,现在普遍认为Spring Boot提供了一种快速构造微服务(Micro-Service)的能力。

Docker与Spring Boot

Docker是一种Linux容器的实现,Linux容器是基于进程的轻量级资源隔离技术,每一个容器对应操作系统中的一个进程,但是它又会有自己的网络空间、文件系统、PID等。Docker除了实现Linux容器,还使得容器具有“社会化”的功能,用户可以将容器镜像发布在Docker Hub与其他开发者共享、协作。安装Docker的教程请参考官方文档

Spring Boot应用通常被构建为一个可单独执行的jar包,通过Java -jar ...运行,但是框架本身并没有提供以服务形式运行在后台的方法,通常需要借助Systemd, Supervisord等进程管理工具来实现。另一方面,虽然应用运行环境非常的简单,但是将他们容器化为Docker容器镜像并运行,对于自动化部署、运维都是非常有利的。

本文将以一个最简单的Spring Boot开发的Web应用为例,讲解如何将其容器化运行。本文的重点是构建Docker镜像、运行Docker容器

构建并Spring Boot应用

在应用代码编写完成后,可以直接将其打包并运行:

  1. Maven: mvn package && java -jar target/spring-boot-docker-0.1.0.jar

  2. Gradle: gradle build && java -jar build/libs/gs-spring-boot-docker-0.1.0.jar

在浏览器地址栏种输入[http://localhost:8080/](http://localhost:8080/)可以访问应用

Dockerfile构建镜像

Docker提供了Dockerfile格式的文件来构建应用镜像,现在开始创建一个Spring Boot应用的Dockerfile:


FROM java:8
VOLUME /tmp
ADD spring-boot-docker-0.1.0.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

java:8是指Docker Hub上官方提供的java镜像,版本号是8也就是jdk1.8,有了这个基础镜像后,Dockerfile可以通过FROM指令直接获取它的状态——也就是在容器中java是已经安装的,接下来通过自定义的命令来运行Spring Boot应用:

  1. VOLUME /tmp创建/tmp目录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录

  2. ADD spring-boot-docker-0.1.0.jar app.jar 将应用jar包复制到/app.jar

  3. ENTRYPOINT表示容器运行后默认执行的命令

Dockerfile非常的简单,编辑完成后运行docker构建镜像命令:


docker build -t tmy/spring-boot-app .

然后运行Docker容器:


docker run -d -p 8080:8080 --name sample-app tmy/spring-boot-app

其中-d表示后台运行容器,这也就自然地解决的Spring Boot不支持后台运行应用程序的问题。-p 8080:8080表示将容器内部的8080端口映射到宿主机器的8080端口,这样就可以通过宿主机器直接访问应用。--name sample-app给容器取一个容易记住的名字方便日后管理。

使用Maven/Gradle创建Docker镜像

为了方便Java开发者创建Docker镜像,Maven/Gradle都提供了响应的插件。

Maven


<properties>
  <docker.image.prefix>springio</docker.image.prefix>
</properties>
<build>
 <plugins>
   <plugin>
     <groupId>com.spotify</groupId>
     <artifactId>docker-maven-plugin</artifactId>
     <version>0.2.3</version>
     <configuration>
       <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
       <dockerDirectory>src/main/docker</dockerDirectory>
       <resources>
         <resource>
           <targetPath>/</targetPath>
           <directory>${project.build.directory}</directory>
           <include>${project.build.finalName}.jar</include>
         </resource>
       </resources>
     </configuration>
   </plugin>
 </plugins>
</build>

上述pom.xml包含了docker-maven-plugin的配置:

  1. imageName指定了镜像的名字

  2. dockerDirectory指定Dockerfile的位置

  3. resources是指那些需要和Dockerfile放在一起,在构建镜像时使用的文件,一般应用jar包需要纳入

经过以上配置后,运行下列命令可以在本地Docker中创建一个镜像:


$ mvn package docker:build

Gradle

Gradle同样也有支持Docker的插件:


buildscript {
 ...
 dependencies {
   ...
   classpath('se.transmode.gradle:gradle-docker:1.2')
 }
}

group = 'springio'

...
apply plugin: 'docker'

task buildDocker(type: Docker, dependsOn: build) {
push = true
applicationName = jar.baseName
dockerfile = file('src/main/docker/Dockerfile')
doFirst {
 copy {
  from jar
  into stageDir
 }
}
}

上述配置和Maven基本类似,执行以下命令构建镜像:


$ gradle build buildDocker

来源:http://blog.csdn.net/lsy0903/article/details/53048198

标签:Docker,Spring,Boot
0
投稿

猜你喜欢

  • 二十个搜索引擎优化常见问题解答

    2009-01-12 15:24:00
  • 详细讲解西软FOXHIS增量备份与恢复方法

    2020-12-29 19:54:12
  • 微软首席财务官里德尔年底离职 克莱恩接替

    2009-11-27 08:41:00
  • 我是怎样快速将一个500IP的站转型为30000IP的

    2007-08-05 17:41:00
  • 黑带高手帮你解网赚难题

    2010-05-10 21:56:00
  • google AdWords新功能介绍

    2008-08-08 12:42:00
  • windows服务器下IIS和PHP共存安装方法

    2009-10-18 07:48:00
  • windows2003 服务器系统权限与安全配置

    2009-11-28 15:34:00
  • 酷炫!趣味十足的Linux命令

    2022-07-24 15:28:36
  • Linux下利用unzip命令如何解压多个文件详解

    2023-04-01 01:08:40
  • adsense广告管理又添新功能!

    2008-01-17 12:07:00
  • 汇总博客网站优化(SEO)的实用技巧

    2009-03-11 10:58:00
  • 建立、升级、降级GoDaddy共享主机帐户需要多长时间

    2010-04-13 13:22:00
  • PHPWind v7.3.2综合积分计算错误

    2009-05-31 17:45:00
  • 新手做站,网游站是个不错的选择

    2008-01-04 12:11:00
  • shell中的各种括号的使用方法

    2023-11-10 15:03:40
  • 关于Apache默认编码错误 导致网站乱码的解决方案

    2023-07-29 21:19:24
  • 用IIS建立高安全性Web服务器

    2008-04-14 14:03:00
  • 腾讯,到了该创新的时候了

    2010-06-11 12:50:00
  • SNS盛宴开席 人人网千金买马

    2009-11-22 09:38:00
  • asp之家 网站运营 m.aspxhome.com