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 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
,一定會有新的發現~
本文參考鏈接: