天天看點

第一個 spring Boot 應用通過Docker 來實作建構、運作、釋出

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/u010046908/article/details/56008445

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://spring.io/guides/gs/spring-boot-docker/

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