1. 程式人生 > >使用 Docker 部署 Springboot 應用

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