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
systemctl daemon-reload && systemctl restart docker
下面測試一下: 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