Windows環境下Spring Boot+Docker構建應用

Windows環境下Spring Boot+Docker構建應用

前言

最近在研究SpringCloud+Docker構建微服務化的架構,之前沒有接觸過Docker,在學習的過程中遇到了不少的問題,花了一天的時間學習了Docker,花了一天的時間學習SpringCloud,總算有了一點點的進展。本文將一步步帶你構建一個基於 Spring Boot 和 Docker 的單體應用,但願共同學習共同進步。

SpringBoot簡介

Spring Boot 是 Spring 社區發佈的一個開源項目,旨在幫助開發者快速簡單的構建可獨立運行的項目。Spring Boot 會選擇最適合的 Spring 子項目和第三方開源庫進行整合。大部分 Spring Boot 應用只需要非常少的配置就可以快速運行起來。
Spring Boot是SpringCloud的基礎,cloud是在boot之上的,所以要完成一個微服務的搭建,你必須先完成SpringBoot+Docker的構建。

官網地址:http://projects.spring.io/spring-boot/

Docker簡介

Docker 是一套以容器技術爲核心的,用於應用的構建、分發和執行的體系和生態。官網地址:

官網地址:https://docker.com
ps:我的博客裏整理一些docker的學習資料,但是經過一些彎路,還是強烈建議大家去看官網的doc文檔,雖然是英文的,但是不難懂,而且很詳細。

環境搭建

  • 操作系統:64位,系統不限(需支持Docker,我這裏是Win10),Windows 上建議安裝 Git 客戶端,方便支持 Linux 命令行操作

  • JDK 1.8 + :推薦一款 Java 環境管理工具 jenv

  • Maven 3.0 + :我這裏用的是阿里的 Maven 倉庫

  • Docker

    * Linux安裝教程參考:https://docs.docker.com/engine/installation/linux/
    
    * 如果你使用的是Mac或Windows,官方已有原生應用支持,下載地址:https://docs.docker.com/
    
  • 一個你喜歡的編譯器或IDE,推薦 Atom 或 Intellij IDEA,或者Sublime Text

步驟

第一步:新建工程目錄

因爲是Windows系統,走了不少的彎路。Spring官方給出的docker整合示例,是在Linux環境下的。Linux環境是直接可以通過指令build打包的,但是Windows不行,得藉助Docker Quickstart Terminal,也就是安裝成功後桌面上的:

於是我們打開終端Terminal,輸入:mkdir spring-boot-docker

創建了我們的項目。接着,在根目錄下創建 pom.xml 文件
touch pom.xml

在當前目錄下新建子目錄:

mkdir -p src/main/java/com/keozhao/hello

一個典型的 Maven 項目結構

第二步:配置pom.xml文件

在 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>bingohuang.com</groupId>
<artifactId>spring-boot-docker-cloudcomb</artifactId>
<version>0.1.0</version>
<packaging>jar</packaging>
<name>Spring Boot + Docker + Cloudcomb</name>
<description>一步步帶你構建 Spring Boot + Docker 應用及網易蜂巢服務</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.3.RELEASE</version>
    <relativePath/>
</parent>

<properties>
    <java.version>1.8</java.version>
</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>
</dependencies>


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
    </project>

以上 pom 文件並不複雜,是一個 Spring Boot 的標準配置,Spring Boot 的 Maven 插件會提供以下功能:

1.收集的類路徑上所有 jar 文件,並構建成一個單一的、可運行的 jar 文件,這使得它更方便地執行和傳輸服務。
2.搜索 public static void main() 方法來標記爲可運行的類。
3.提供了一個內置的依賴解析器,用於設置版本號以匹配 Spring Boot 的依賴。你可以覆蓋任何你想要的版本,但它會默認使用 Spring Boot 所設置的版本集。

操作示例:

通過start指令,調用系統默認打開該文件的程序,你直接將上述代碼寫入即可

第三步:編寫SpringBoot應用程序

創建一個簡單的 Java 應用程序:
touch src/main/java/com/keozhao/hello/Application.java

代碼如下:

  package com.keozhao.hello;

  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;

  /**
      * Sprint Boot 主應用入口
      * @author Keo.Zhao
      * @date 2016.12.10
  */
@SpringBootApplication
@RestController
public class Application {

@RequestMapping("/")
public String home() {
    return "Hello Spring Boot, Docker and CloudComb!";
}


public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}
 } 

代碼核心就是處理了根路徑(/)的 web 請求,幷包含可執行的 main 方法,比較好理解,解釋一下其中幾個關鍵點:

  • 用 @SpringBootApplication 和 @RestController 註解類, 表示可用 Spring MVC 來處理 Web 請求

  • @RequestMapping 將 / 映射到 home() 方法,並返回相應文本

  • main() 方法使用 Spring Boot 的 SpringApplication.run() 方法來啓動應用

操作示例:

我這裏默認打開是Sublime Text,於是從Sublime寫入

第四步:本地運行

Maven構建

該應用的核心代碼就已完成,也就兩個文件,可見 Spring Boot 非常簡單。在項目根目錄執行:mvn package

之後會在根目錄下生成一個 target 目錄,並在 target 目錄下包含一個可執行的 jar 包。

運行jar包

Spring Boot 的強大之處是將應用打成一個可獨立運行的 jar 文件:

java -jar target/spring-boot-docker-cloudcomb-0.1.0.jar

不出意外,輸出日誌,應用啓動,默認會監聽 8080 端口。

訪問應用

應用正常啓動後,瀏覽器訪問 http://127.0.0.1:8080/,即可看到頁面輸出字樣:

第五步:容器化構建及運行

書寫DockerFile

在項目根目錄下創建一個 Dockerfile 文件,touch Dockerfile
內容如下:

FROM frolvlad/alpine-oraclejdk8:slim

COPY target/spring-boot-docker-cloudcomb-0.1.0.jar app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

此 Dockerfile 並不複雜,核心功能就是將可執行文件拷貝到鏡像中,並在容器啓動時默認執行啓動命令 java -jar /app.jar
一樣也是也通過start的指令打開,再寫入、保存。

docker 構建

在項目根目錄下執行 docker 構建鏡像命令:
docker build -t spring-boot-docker-cloudcomb:0.1.0 .
(別忘記後面的點)

docker build 指令詳情

這一步完成,你已經成功構建了鏡像,輸入docker images可以看見

docker運行

運行 docker 容器:
docker run -p 8080:8080 -t spring-boot-docker-cloudcomb:0.1.0

訪問項目

同樣,會輸出日誌(略有不同),監聽 8080 端口,瀏覽器訪問 192.168.99.100:8080,輸出文本。

Hello Spring Boot, Docker and CloudComb!

其實就是啓動docker的ip地址,如下:
這裏寫圖片描述

到這裏,你已經成功完成了Windows環境下SpringBoot + Docker構建應用!!

一點小發現:

如果你覺得在終端窗口一步步創建文件比較麻煩,或許我們可以直接把工程copy到Terminal的運行環境中。其實在上文,start打開應用時,我們可以發現文件創建在了C:\Users\Keo.Zhao這個路徑下,Keo.Zhao是我的用戶名,不同的電腦這裏必然會有差異,不妨打開你的電腦看看這個路徑。因爲docker才學習了一天,其實一些細節、機制還不瞭解。但是我猜測,Terminal本質還是爲Windows用戶提供了一個虛擬的Linux環境,在Linux的環境裏是沒有盤符這個概念的,所以默認當前系統用戶的目錄爲運行的目錄(應該可以更改,後期再研究,有不對的地方希望大牛能指出,多謝!)。所以,可以直接把你在ide裏寫好的項目,copy到C:\Users\Keo.Zhao目錄下,你的也許會叫做C:\Users\administrator,打開Terminal,輸入dir,一定會有新的發現~

本文參考鏈接:

https://github.com/163yun/spring-boot-docker-cloudcomb

https://docs.docker.com/

https://spring.io/guides/gs/spring-boot-docker/#initial

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章