在本系列中,我们将为简单的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 clone https://github.com/shrikarvk/SpringBootOnDocker.git
选择Maven或Gradle构建代码。
如果您选择使用Maven,请按照以下步骤操作
了解克隆的git repo中存在的POM.xml
<groupId>org.springframework</groupId>
<artifactId>spring-boot-docker</artifactId>
<version>0.1.0</version>
<packaging>jar</packaging>
<name>Spring Boot Docker</name>
<description>Getting started with Spring Boot and Docker</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath />
</parent>
<properties>
<docker.image.prefix>mydocker</docker.image.prefix>
<java.version>1.8</java.version>
</properties>
在这里,我们具有使用groupId和版本构建Docker所需的工件。在这里,我们提到了下一步将要构建的Docker映像的前缀。此配置指定将使用名称创建映像的强制性内容mydocker/spring-boot-docker
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
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.8
targetCompatibility = 1.8
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
}
这里,依赖项中添加的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
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello Docker World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
该类被标记为@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-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","helloDockerWorld.Application"]
这个Dockerfile有一个DEPENDENCY
参数指向我们解开胖子jar包的目录。如果正确,它已经包含一个包含BOOT-INF/lib
依赖项jar的BOOT-INF/classes
目录和一个包含应用程序类的目录。请注意,我们正在使用应用程序自己的主类helloDockerWorld.Application
现在,我们来构建Docker映像。在构建Docker映像之前,让我们通过执行以下cmd来确保Docker正在运行
docker ps
如果收到错误消息,则说明有问题。重新访问Docker设置
使用Maven构建Docker映像
以下步骤将创建一个名称为Docker的镜像 mydocker/spring-boot-docker
$ ./mvnw install dockerfile:build
使用Gradle构建Docker映像
./gradlew build docker
运行Docker映像
$ docker run -p 8081:8080 -t mydocker/spring-boot-docker
然后可以在http:// localhost:8081上找到该应用程序(访问它,并显示“ Hello Docker World”)。这里的8081是Docker端口,而8080是Tomcat端口。这意味着在tomcat的8080端口上运行的应用程序将在Docker的8081端口上可用。
当Docker运行时,您可以在容器列表中看到,例如:
$ docker ps
CONTAINER ID IMAGE
81c723d22865 mydocker/spring-boot-docker:latest
要关闭Docker,您可以docker stop
使用容器ID
$ docker stop 81c723d22865
81c723d22865
做完了!我们为Spring Boot App创建了一个Docker容器
翻译自:https://medium.com/@shrikarvk/creating-a-docker-container-for-spring-boot-app-d5ff1050c14f
网友评论