详解在Docker容器中运行Spring Boot应用
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应用
在应用代码编写完成后,可以直接将其打包并运行:
- maven: mvn package && java -jar target/spring-boot-docker-0.1.0.jar
- 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应用:
- volume /tmp创建/tmp目录并持久化到docker数据文件夹,因为spring boot使用的内嵌tomcat容器默认使用/tmp作为工作目录
- add spring-boot-docker-0.1.0.jar app.jar 将应用jar包复制到/app.jar
- 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的配置:
- imagename指定了镜像的名字
- dockerdirectory指定dockerfile的位置
- 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Spring Boot应用Docker化的步骤详解
-
在Docker容器中不需要运行sshd的原因浅析
-
运行中的docker容器端口映射如何修改详解
-
详解在Docker容器中运行Spring Boot应用
-
Docker容器化spring boot应用详解
-
在Docker容器中配置和运行Django + Celery
-
Spring Boot Admin 更换应用管理端口后在Environment中配置参数
-
RabbitMQ入门:在Spring Boot 应用中整合RabbitMQ
-
在Docker容器中不需要运行sshd的原因浅析
-
在Docker中开发Java 8 Spring Boot应用程序的方法