天天看點

部署 Spring Boot 到遠端 Docker 容器

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

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

将 Spring Boot 項目打包到 Docker 容器中部署,有很多不同的方法,今天松哥主要來和大家聊一聊如何将 Spring Boot 項目一鍵打包到遠端 Docker 容器,然後通過運作一個鏡像的方式來啟動一個 Spring Boot 項目。

至于其他的 Spring Boot 結合 Docker 的用法,大家不要着急,後續的文章,松哥會和大家慢慢的一一道來。

1.準備工作

1.1 準備 Docker

我這裡以 CentOS7 為例來給大家示範。

首先需要在 CentOS7 上安裝好 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
           

如下圖:

部署 Spring Boot 到遠端 Docker 容器

配置完成後,儲存退出,然後重新開機 Docker:

systemctl daemon-reload
service docker restart
           

Docker 重新開機成功之後,Docker 的準備工作就算是 OK 了。

1.2 準備 IDEA

IDEA 上的準備工作,主要是安裝一個 Docker 插件,點選 

File->Settings->Plugins->Browse Repositories

 如下:

部署 Spring Boot 到遠端 Docker 容器

點選右邊綠色的 Install 按鈕,完成安裝,安裝完成之後需要重新開機一下 IDEA。

IDEA 重新開機成功之後,我們依次打開 

File->Settings->Build,Execution,Deployment->Docker

 ,然後配置一下 Docker 的遠端連接配接位址:

部署 Spring Boot 到遠端 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 ,作為我鏡像的建構檔案,具體位置如下圖:

部署 Spring Boot 到遠端 Docker 容器

檔案内容如下:

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 容器中,打包方式如下:

部署 Spring Boot 到遠端 Docker 容器

打包過程會稍微有一點舊,因為還包含了鏡像的建構,特别是第一次打包,需要下載下傳基礎鏡像,會更慢一些。

部分打包日志如下(項目建構過程):

部署 Spring Boot 到遠端 Docker 容器

項目打包成功之後,我們就可以在 Docker 容器中看到我們剛剛打包成的鏡像了,如下:

部署 Spring Boot 到遠端 Docker 容器

5.1 運作方式一

此時,我們可以直接在 Linux 上像建立普通容器一樣建立這個鏡像的容器,然後啟動,執行如下指令即可:

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

啟動成功之後,我們就可以通路容器中的接口了。

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

5.2 運作方式二

大家注意,此時我們的 IDEA 中多了一個選項,就是 docker,如下:

部署 Spring Boot 到遠端 Docker 容器

點選左邊的綠色啟動按鈕,連接配接上 Docker 容器,連接配接成功之後,我們就可以看到目前 Docker 中的所有容器和鏡像了,當然也包括我們剛剛建立的 Docker 鏡像,如下:

部署 Spring Boot 到遠端 Docker 容器

此時,我們選中這個鏡像,右鍵單擊,即可基于此鏡像建立出一個容器,如下圖:

部署 Spring Boot 到遠端 Docker 容器

我們選擇 Create container,然後填入容器的一些必要資訊,配置一下容器名稱,鏡像 ID 會自動填上,暴露的端口使用 Specify 即可,然後寫上端口的映射關系:

部署 Spring Boot 到遠端 Docker 容器

配置完成後,點選下方的 

run

 按鈕,就可以開始運作了。運作日志如下:

部署 Spring Boot 到遠端 Docker 容器

注意,這個日志是在 Docker 的那個視窗裡列印出來的。

項目運作成功之後,在浏覽器輸入遠端伺服器的位址,就可以通路了:

部署 Spring Boot 到遠端 Docker 容器

繼續閱讀