Spring boot

为Spring Boot App创建Docker容器

2019-10-13  本文已影响0人  开心人开发世界

在本系列中,我们将为简单的Hello World创建一个Docker容器!使用Gradle OR Maven的Spring Boot应用

在尝试本指南之前,您应该具有:

先决条件:

如果您不使用Linux机器,则需要一个虚拟服务器。访问VirtualBox的下载站点,并为您的计算机选择版本。


一旦安装了所有必需的软件,就该从git下载源代码了

下载并解压缩本指南的源存储库,或使用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>

pom.xml for docker

在这里,我们具有使用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 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.8
targetCompatibility = 1.8

dependencies {
    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所必需的

该配置还指定以下内容


设置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);
    }

}

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-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

这个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

上一篇下一篇

猜你喜欢

热点阅读