一鍵部署 Spring Boot 到遠程 Docker 容器,就是這麼秀!

不知道各位小夥伴在生產環境都是怎麼部署 Spring Boot 的,打成 jar 直接一鍵運行?打成 war 扔到 Tomcat 容器中運行?不過據鬆哥瞭解,容器化部署應該是目前的主流方案。java

不一樣於傳統的單體應用,微服務因爲服務數量衆多,在部署的時候出問題的可能性更大,這個時候,結合 Docker 來部署,就能夠很好的解決這個問題,這也是目前使用較多的方案之一。git

將 Spring Boot 項目打包到 Docker 容器中部署,有不少不一樣的方法,今天鬆哥主要來和你們聊一聊如何將 Spring Boot 項目一鍵打包到遠程 Docker 容器,而後經過運行一個鏡像的方式來啓動一個 Spring Boot 項目。github

至於其餘的 Spring Boot 結合 Docker 的用法,你們不要着急,後續的文章,鬆哥會和你們慢慢的一一道來。web

1.準備工做

1.1 準備 Docker

我這裏以 CentOS7 爲例來給你們演示。spring

首先須要在 CentOS7 上安裝好 Docker,這個安裝方式網上不少,我就很少說了,我本身去年寫過一個 Docker 入門教程,你們能夠在公衆號後臺回覆 Docker 獲取教程下載地址。docker

Docker 安裝成功以後,咱們首先須要修改 Docker 配置,開啓容許遠程訪問 Docker 的功能,開啓方式很簡單,修改 /usr/lib/systemd/system/docker.service 文件,加入以下內容:瀏覽器

-H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock

以下圖:服務器

配置完成後,保存退出,而後重啓 Docker:app

systemctl daemon-reload    
service docker restart

Docker 重啓成功以後,Docker 的準備工做就算是 OK 了。maven

1.2 準備 IDEA

IDEA 上的準備工做,主要是安裝一個 Docker 插件,點擊 File->Settings->Plugins->Browse Repositories 以下:

點擊右邊綠色的 Install 按鈕,完成安裝,安裝完成以後須要重啓一下 IDEA。

IDEA 重啓成功以後,咱們依次打開 File->Settings->Build,Execution,Deployment->Docker ,而後配置一下 Docker 的遠程鏈接地址:

配置一下 Docker 的地址,配置完成後,能夠看到下面有一個 Connection successful 提示,這個表示 Docker 已經鏈接上了。

如此以後,咱們的準備工做就算是 OK 了。

2.準備項目

接下來咱們來建立一個簡單的 Spring Boot 項目(只須要引入 spring-boot-starter-web 依賴便可),項目建立成功以後,咱們再建立一個普通的 HelloDockerController,用來作測試,以下:

@RestController
public class HelloDockerController {
    @GetMapping("/hello")
    public String hello() {
        return "hello docker!";
    }
}

這是一個很簡單的接口,無需多說。

3.配置 Dockerfile

接下來,在項目的根目錄下,我建立一個 Dockerfile ,做爲我鏡像的構建文件,具體位置以下圖:

文件內容以下:

FROM hub.c.163.com/library/java:latest
VOLUME /tmp
ADD target/docker-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

這裏只有簡單的四行,我說一下:

  1. Spring Boot 項目的運行依賴 Java 環境,因此我本身的鏡像基於 Java 鏡像來構建。
  2. 考慮到 Docker 官方鏡像下載較慢,我這裏使用了網易提供的 Docker 鏡像。
  3. 因爲 Spring Boot 運行時須要 tmp 目錄,這裏數據卷配置一個 /tmp 目錄出來。
  4. 將本地 target 目錄中打包好的 .jar 文件複製一份新的 到 /app.jar。
  5. 最後就是配置一下啓動命令,因爲我打包的 jar 已經成爲 app.jar 了,因此啓動命令也是啓動 app.jar。

這是咱們配置的一個簡單的 Dockerfile。

4.配置 Maven 插件

接下來在 pom.xml 文件中,添加以下插件:

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.2.0</version>
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <dockerHost>http://192.168.66.131:2375</dockerHost>
        <imageName>javaboy/${project.artifactId}</imageName>
        <imageTags>
            <imageTag>${project.version}</imageTag>
        </imageTags>
        <forceTags>true</forceTags>
        <dockerDirectory>${project.basedir}</dockerDirectory>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>

這個插件的配置不難理解:

  1. 首先在 execution 節點中配置當執行 mvn package 的時候,順便也執行一下 docker:build
  2. 而後在 configuration 中分別配置 Docker 的主機地址,鏡像的名稱,鏡像的 tags,其中 dockerDirectory 表示指定 Dockerfile 的位置。
  3. 最後 resource 節點中再配置一下 jar 的位置和名稱便可。

OK,作完這些咱們就算大功告成了。

5.打包運行

接下來對項目進行打包,打包完成後,項目會自動構建成一個鏡像,而且上傳到 Docker 容器中,打包方式以下:

打包過程會稍微有一點舊,由於還包含了鏡像的構建,特別是第一次打包,須要下載基礎鏡像,會更慢一些。

部分打包日誌以下(項目構建過程):

項目打包成功以後,咱們就能夠在 Docker 容器中看到咱們剛剛打包成的鏡像了,以下:

5.1 運行方式一

此時,咱們能夠直接在 Linux 上像建立普通容器同樣建立這個鏡像的容器,而後啓動,執行以下命令便可:

docker run -d --name javaboy -p 8080:8080 javaboy/docker:0.0.1

啓動成功以後,咱們就能夠訪問容器中的接口了。

可是這種操做顯然仍是有點麻煩,結合咱們一開始安裝的 Docker 插件,這個運行步驟還能夠作進一步的簡化。

5.2 運行方式二

你們注意,此時咱們的 IDEA 中多了一個選項,就是 docker,以下:

點擊左邊的綠色啓動按鈕,鏈接上 Docker 容器,鏈接成功以後,咱們就能夠看到目前 Docker 中的全部容器和鏡像了,固然也包括咱們剛剛建立的 Docker 鏡像,以下:

此時,咱們選中這個鏡像,右鍵單擊,便可基於此鏡像建立出一個容器,以下圖:

咱們選擇 Create container,而後填入容器的一些必要信息,配置一下容器名稱,鏡像 ID 會自動填上,暴露的端口使用 Specify 便可,而後寫上端口的映射關係:

配置完成後,點擊下方的 run 按鈕,就能夠開始運行了。運行日誌以下:

注意,這個日誌是在 Docker 的那個窗口裏打印出來的。

項目運行成功以後,在瀏覽器輸入遠程服務器的地址,就能夠訪問了:

如此以後,咱們的 Spring Boot 項目就算順利發佈到遠程 Docker 容器中了。

好玩嗎?試試!

本文案例我已經上傳到 GitHub,小夥伴們能夠參考:https://github.com/lenve/java...

圖片描述

相關文章
相關標籤/搜索