1. 程式人生 > >Spring Boot專案Docker化快速上手

Spring Boot專案Docker化快速上手

開篇

  服務部署是應用上線前的必需環節。大道至簡,如何做到專案簡單化、自動化甚至傻瓜式部署是考驗DevOps的一大難題。從docker面世到k8s的脫穎而出,有越來越多的開源工具也在幫助開發和運維人員解決這些問題。

  對於開發人員,瞭解和學習Docker可謂是迫在眉睫。網上有很多優秀的學習資源,當然了,本文的主角不全是docker,但也不無關係。

  現在是CI時代。用過Jenkins,但對於個人或小型專案來說太笨重了,不過還有例如像Travis這樣的輕量級CI可供我們選擇。本文要介紹的不涉及CI工具,只需要藉助Maven外掛,就可以輕鬆打包SpringBoot專案到遠端伺服器,啟動映象即可部署上線。如果這描述適合你最近在搗騰的一些專案,可以繼續往下看!

環境說明

  • Docker v18.06.1-ce
  • Spring Boot v2.0.4.RELEASE

配置準備

  通過Maven將本地打包好的SpringBoot Jar包推送到遠端Docker服務中,關鍵步驟就在於為Docker服務配置這個暴露埠。這步操作也簡單,直接命令編輯vim /lib/systemd/system/docker.service( 左側為Ubuntu的路徑; CentOS 的路徑參考:/usr/lib/systemd/system/docker.service),找到ExecStart=/usr/bin/dockerd -H fd://這行,修改為ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:22375 -H unix:///var/run/docker.sock

(表示讓Docker服務監聽22375這個TCP埠),重啟讓配置生效:systemctl daemon-reload && systemctl restart docker

  下面測試一下: curl localhost:22375/info,如果有一堆資訊出來就可以繼續往下走:

curl localhost:22375/info

外掛新增

  沒有Spring Boot專案可以自行新建,然後在pom.xml中新增如下配置:

 <build>
        <!-- 最終Maven本地打包出來的jar包名稱 -->
        <finalName>example</finalName
>
<defaultGoal>package</defaultGoal> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <!-- GitHub: https://github.com/spotify/docker-maven-plugin --> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.1.1</version> <configuration> <!-- 遠端映象名稱 --> <imageName>example</imageName> <forceTags>true</forceTags> <imageTags> <imageTag>${project.version}</imageTag> <imageTag>latest</imageTag> </imageTags> <dockerHost>http://伺服器IP:22375</dockerHost> <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>

  參考上述配置,還需要新建docker資料夾,然後建立Dockerfile檔案,並新增如下內容:

# 指定基礎映象(必需且為第一條指令,scratch是空白映象)
FROM openjdk:8-jre-alpine

# MAINTAINER已經過期,具體參考:https://docs.docker.com/engine/reference/builder/#label
LABEL author-name="author-email"

# 為了防止執行時使用者忘記將動態檔案所儲存目錄掛載為卷,在 Dockerfile 中,我們可以事先指定某些目錄掛載為匿名卷,
# 這樣在執行時如果使用者不指定掛載,其應用也可以正常執行,不會向容器儲存層寫入大量資料。
VOLUME /opt/tmp

# 在 COPY 和 ADD 指令中選擇的時候,可以遵循這樣的原則,
# 所有檔案複製使用 COPY 指令,僅在需要自動解壓縮的場合使用 ADD 指令
COPY example.jar example.jar

# JVM引數可選
CMD ["java","-jar","-Xms64m","-Xmx64m","example.jar"]

# EXPOSE 指令僅僅是宣告的是執行時容器提供服務的埠
# 用於幫助映象使用者理解這個映象服務的守護埠,以方便配置對映;
EXPOSE 8080

構建執行

  用maven命令構建遠端映象:mvn clean package docker:build -Dmaven.test.skip=true

  在遠端伺服器上執行服務:docker run --name example -d -p 8080:8080 example

  可以檢視服務啟動情況:docker logs -f example

學習資源

參考連結