使用 Docker 部署 Springboot 應用
介紹一種新的部署方式,讓應用部署更加簡單高效。
對於微服務架構來說,服務拆分的越多,運維的成本也就越高,以前的一個系統只需要部署一次就可以了,但拆分成多個服務後,就需要多次部署了,為了簡化部署流程,容器化成了該問題的最佳解決方案。
這裡假定大家對 Springboot 應用的搭建及 Docker 都有了一定的瞭解,如果不知道,可以閱讀下 SpringBoot實戰 之 入門篇 等系列文章及檢視 Docker 官方文件。
第一步:使用 http://start.spring.io 快速建立一個 gradle 管理的 springboot 工程
生成完以後,需要將 build.gradle 指令碼中的版本號改成 1.5.8,如下:
buildscript {
ext {
springBootVersion = '1.5.8.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
group = 'com.qchery'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
第二步: 編寫一個簡單的介面用於服務驗證
@RestController
@SpringBootApplication
public class SpringbootGradleDockerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootGradleDockerApplication.class, args);
}
@RequestMapping("hello")
public String hello() {
return "Hello, SpringBoot With Docker";
}
}
第三步: Docker 有一個簡單的 Dockerfile 檔案格式,它用來指定映象的層次。因此,我們繼續在Spring Boot專案中建立一個Dockerfile,存放在與 build.grade 相同的目錄下:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
這個Dockerfile非常簡單,但只需執行一個Spring Boot應用程式就可以完成這一切。專案JAR檔案以“app.jar”的形式新增到容器中,然後在 ENTRYPOINT 執行。
為了縮短 Tomcat 的啟動時間,我們添加了一個系統屬性,指定 “/dev/urandom” 作為熵源。
第四步: 使用 Palantir 外掛輔助映象構建
buildscript {
...
dependencies {
...
classpath('gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.13.0')
}
}
...
apply plugin: 'com.palantir.docker'
docker {
name "${project.group}/${jar.baseName}"
files jar.archivePath
buildArgs(['JAR_FILE': "${jar.archiveName}"])
}
Docker 配置引數說明
name 用於容器的名稱,可以包括一個標籤
tags 一組標籤引數,在應用標籤之前,name 中的標籤都會被剝離;預設為空集(可選)
dockfile 用於構建映象Dockerfile檔案,預設為 project.file('Dockerfile') 且必須是一個檔案物件(可選)
files 需要包含在 Docker 上下文中的檔案列表(可選)
buildArgs 一個鍵值都為 String 的 Map 集合,將為 build 命令設定 --build-arg 引數(可選)
labels 一個鍵值都為 String 的 Map 集合,將為 build 命令設定 --label 引數,預設為空(可選)
pull 是否在構建前拉取最新的基礎映象,預設為 false 。(可選)
noCache 是否在構建時設定 --no-cache 引數,從頭開始構建映象;預設為 false 。
現在使用如下命令即可構建出 Docker 映象(需保證當前環境中的 Docker 程序已啟動)
./gradlew build -x test docker
構建完成後,可以檢視本地的映象倉庫
確認映象無誤後,啟動映象
docker run -d -p 8080:8080 --name="docker-springboot" com.qchery/springboot-gradle-docker:latest
測試映象是否釋出成功
curl http://localhost:8080/hello
參考文獻:
Getting Started - Springboot With Docker
https://github.com/palantir/gradle-docker