在本系列中,我們將為簡單的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
<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
閱讀更多 開心人開發世界 的文章