為Spring Boot App創建Docker容器

在本系列中,我們將為簡單的Hello World創建一個Docker容器!使用Gradle OR Maven的Spring Boot應用


為Spring Boot App創建Docker容器


在嘗試本指南之前,您應該具有:

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


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

該配置還指定以下內容

  • 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);
}
}

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


分享到:


相關文章: