1. 程式人生 > >第一個 spring Boot 應用通過Docker 來實現構建、執行、釋出

第一個 spring Boot 應用通過Docker 來實現構建、執行、釋出

1. Docker 簡介

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。Docker image 是用於執行容器化程序的方案,在本文中,我們將構建一個簡單的 Spring Boot 應用程式。

2.環境搭建

  • JDK 1.8+
  • Maven 3.0+
  • Docker 最新版。

3.用 Maven 構建專案

3.1 建立目錄結構

 mkdir -p src/main/java/com/lidong/demo

在linux或者mac系統中。
這裡寫圖片描述

3.2 建立 pom.xml 檔案

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion
>
<groupId>com.lidong.demo</groupId> <artifactId>lidong-spring-boot-demo</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId
>
<version>1.5.1.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <docker.image.prefix>springio</docker.image.prefix> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build> </project>

注意:

  1. Spring Boot Maven plugin 提供了很多方便的功能:
    1)它收集的類路徑上所有 jar 檔案,並構建成一個單一的、可執行的jar,這使得它更方便地執行和傳輸服務。
    2)它搜尋的 public static void main() 方法來標記為可執行的類。
    3)它提供了一個內建的依賴解析器,用於設定版本號以匹配 Spring Boot 的依賴。您可以覆蓋任何你想要的版本,但它會預設選擇的 Boot 的版本集。

  2. Spotify 的 docker-maven-plugin 外掛是用於構建 Maven 的 Docker Image
    1)imageName指定了映象的名字,本例為 springio/lidong-spring-boot-demo
    2)dockerDirectory指定 Dockerfile 的位置
    3)resources是指那些需要和 Dockerfile 放在一起,在構建映象時使用的檔案,一般應用 jar 包需要納入。

4.編寫 第一個Spring Boot 應用

編寫一個簡單的 Spring Boot 應用 :

src/main/java/com/lidong/demo/SampleController.java:

package com.lidong.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @專案名稱:lidong-dubbo
 * @類名:SampleController
 * @類的描述:
 * @作者:lidong
 * @建立時間:2017/2/19 上午9:34
 * @公司:chni
 * @QQ:1561281670
 * @郵箱:[email protected]
 */
@Controller
@SpringBootApplication
public class SampleController {

    @ResponseBody
    @RequestMapping(value = "/")
    String home(){
        return "Hello Docker World";
    }

    public static void main(String[] args) {
        SpringApplication.run(SampleController.class,"--server.port=8081");
    }
}
  • 類用 @SpringBootApplication @RestController 標識,可用 Spring MVC 來處理 Web 請求。
  • @RequestMapping 將 / 對映到 home() ,並將”Hello Docker World” 文字作為響應。
  • main() 方法使用 Spring Boot 的 SpringApplication.run() 方法來啟動應用。

5.執行程式

5.1使用Maven命令
mvn package

執行:

java -jar target/lidong-spring-boot-demo-1.0-SNAPSHOT.jar

訪問專案

如果程式正確執行,瀏覽器訪問 http://localhost:8081/,可以看到頁面 “Hello Docker World.” 字樣。

5.2 使用IDEA 外掛

這裡寫圖片描述

6.將專案容器化

Docker 使用 Dockerfile 檔案格式來指定 image 層,

建立檔案 src/main/docker/Dockerfile:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD lidong-spring-boot-demo-1.0-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

解釋下這個配置檔案:

VOLUME 指定了臨時檔案目錄為/tmp。其效果是在主機 /var/lib/docker 目錄下建立了一個臨時檔案,並連結到容器的/tmp。改步驟是可選的,如果涉及到檔案系統的應用就很有必要了。/tmp目錄用來持久化到 Docker 資料資料夾,因為 Spring Boot 使用的內嵌 Tomcat 容器預設使用/tmp作為工作目錄
專案的 jar 檔案作為 “app.jar” 新增到容器的
ENTRYPOINT 執行專案 app.jar。為了縮短 Tomcat 啟動時間,新增一個系統屬性指向 “/dev/urandom” 作為 Entropy Source
構建 Docker Image

執行構建成為 docker image:

mvn package docker:build

執行

執行 Docker Image

docker run -p 8081:8081 -t springio/lidong-spring-boot-demo

這裡寫圖片描述

看到這個Spring的圖示。就以為這我們在docker 上釋出Spring boot 程式已經完成。

接下來去訪問在瀏覽器訪問 http://localhost:8081/,可以看到頁面 “Hello Docker World.” 字樣。

在這裡是一個簡單的spring boot的入門。後面會詳細介紹Spring-boot 構建微服務一些具體的知識。