在本系列中,我们将为简单的Hello World创建一个Docker容器!使用Gradle OR Maven的Spring Boot应用
在尝试本指南之前,您应该具有:
- 约15分钟的时间
- Spring Boot应用程序的基本知识
- Docker基础知识
- 使用Gradle或Maven构建Java应用程序的基本知识
先决条件:
- JDK 1.8或更高版本
- Docker
- Gradle 4+或Maven 3.2+
- 任意文字编辑器
如果您不使用Linux机器,则需要一个虚拟服务器。访问VirtualBox的下载站点,并为您的计算机选择版本。
一旦安装了所有必需的软件,就该从git下载源代码了
下载并解压缩本指南的源存储库,或使用Git对其进行克隆:
git clone https://github.com/shrikarvk/SpringBootOnDocker.git
选择Maven或Gradle构建代码。
如果您选择使用Maven,请按照以下步骤操作
了解克隆的git repo中存在的POM.xml
org.springframework spring-boot-docker 0.1.0jarSpring Boot DockerGetting started with Spring Boot and Dockerorg.springframework.boot spring-boot-starter-parent 2.0.5.RELEASEmydocker1.8
pom.xml for docker
在这里,我们具有使用groupId和版本构建Docker所需的工件。在这里,我们提到了下一步将要构建的Docker映像的前缀。此配置指定将使用名称创建映像的强制性内容mydocker/spring-boot-docker
org.apache.maven.plugins maven-dependency-plugin unpackpackageunpack${project.groupId} ${project.artifactId} ${project.version}
pom.xml for maven plugin
POM.xml的这一部分具有构建项目所需的插件
Spring Boot Maven插件收集了类路径上的所有jar,并构建了一个可运行的“ spring-boot-docker-0.1.0.jar”,这使执行和传输服务更加方便。它搜索公共static void main()方法以将其标记为可运行类。而且,它提供了一个内置的依赖项解析器,用于设置版本号以匹配Spring Boot依赖项。
如果您选择使用Gradle,请按照以下步骤操作
了解克隆的git repo中存在的build.gradle
buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } mavenCentral() } dependencies { classpath('org.springframework.boot:spring-boot-gradle-plugin:2.0.5.RELEASE') classpath('gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.13.0') }}apply plugin: 'java'apply plugin: 'eclipse'apply plugin: 'idea'apply plugin: 'org.springframework.boot'apply plugin: 'io.spring.dependency-management'apply plugin: 'com.palantir.docker'group = 'mydocker'bootJar { baseName = 'spring-boot-docker' version = '0.1.0'}task unpack(type: Copy) { dependsOn bootJar from(zipTree(tasks.bootJar.outputs.files.singleFile)) into("build/dependency")}docker { name "${project.group}/${bootJar.baseName}" copySpec.from(tasks.unpack.outputs).into("dependency") buildArgs(['DEPENDENCY': "dependency"])}repositories { mavenCentral()}sourceCompatibility = 1.8targetCompatibility = 1.8dependencies { compile("org.springframework.boot:spring-boot-starter-web") }
build.gradle
这里,依赖项中添加的Spring Boot gradle插件收集了类路径上的所有jar,并构建了一个可运行的单个“ spring-boot-docker-0.1.0.jar”,这使执行和传输您的文件更加方便服务。它搜索公共static void main()方法以将其标记为可运行类。而且,它提供了一个内置的依赖项解析器,用于设置版本号以匹配Spring Boot依赖项。Docker依赖关系是构建Docker所必需的
该配置还指定以下内容
- unpack jar文件的任务
- 图像名称(或标签)是从jar文件属性中设置的,最终将显示为 mydocker/spring-boot-docker
- 解压缩的jarfile的位置,我们可以在其中进行硬编码 Dockerfile
- docker指向jar文件的构建参数
设置Spring Boot App
了解克隆的仓库中src文件夹下的Application.java类
package helloDockerWorld;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@SpringBootApplication@RestControllerpublic class Application { @RequestMapping("/") public String home() { return "Hello Docker World"; } public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
application.java
该类被标记为@SpringBootApplication和@RestController,这意味着Spring MVC已准备好使用该类来处理Web请求。@RequestMapping映射/到home()仅发送“ Hello Docker World”响应的方法。该main()方法使用Spring Boot的SpringApplication.run()方法来启动应用程序。
在没有Docker容器的情况下(即在主机OS中)运行应用程序。
如果您使用的是Gradle,请在cmd下执行以构建jar,然后在8080端口运行该应用
./gradlew build && java -jar build/libs/spring-boot-docker-0.1.0.jar
如果您使用的是Maven,请在cmd下执行以构建jar,然后在8080端口运行该应用
./mvnw package && java -jar target/spring-boot-docker-0.1.0.jar
并转到localhost:8080以查看“ Hello Docker World”消息。
如果您能够看到“ Hello Docker World”消息,则表明Spring Boot App已在Tomcat中启动并运行。但是还没有容器化。
我们将其容器化
了解克隆的仓库中的Dockerfile
FROM openjdk:8-jdk-alpineVOLUME /tmpARG DEPENDENCY=target/dependencyCOPY ${DEPENDENCY}/BOOT-INF/lib /app/libCOPY ${DEPENDENCY}/META-INF /app/META-INFCOPY ${DEPENDENCY}/BOOT-INF/classes /appENTRYPOINT ["java