1. 程式人生 > >Docker 容器整合 Spring Boot 應用

Docker 容器整合 Spring Boot 應用

docker 微服務 容器 devops jfrog

在本文中,我們將重點介紹如何對 Spring Boot 應用程序進行 Docker 容器化以在獨立的環境(即容器)中運行它。

此外,我們還會展示如何創建容器的集成,它們彼此依賴並在虛擬專用網絡中彼此鏈接。我們還能看到如何通過單個命令進行統一管理。

那麽我們先來創建一個運行在 Alpine Linux 的基於 Java 的輕量級基礎映像。

基礎鏡像構建

我們將使用 Docker 獨有的編譯文件格式: Dockerfile。

Dockerfile 是一個面向行的批處理文件,包含建立一個鏡像的命令。將這些命令放在一個文件中不是必須的,我們能夠在命令行直接輸入命令,但是一個文件會更簡單。

所以,讓我們寫第一個 Dockerfile :

技術分享

FROM:關鍵字 FROM,告訴 Docker 將給定的圖像及其標記用作鏡像的基礎。如果此映像不在本地庫中,則會對 DockerHub 或任何其他配置的遠程倉庫進行在線搜索。

MAINTAINER:MAINTAINER 通常是一個電子郵件地址,用於識別鏡像的作者。

RUN:使用 RUN 命令,我們會在目標系統中執行一個 Shell 命令行。這裏我們利用 Alpine Linux 的軟件包管理器 Apk 安裝 Java 8 OpenJDK。

COPY:最後的命令告訴 Docker 從本地文件系統中復制一些文件到鏡像中的給定路徑,特別是子文件夾到構建目錄中。

要求:為了成功運行本教程,您必須從 Oracle 下載 Java 加密擴展(JCE)無限強度管理策略文件。只需將下載的歸檔文件解壓縮到名為 files 的本地文件夾中。

為了最終能構建鏡像並將其存儲在本地庫中,我們必須運行:

docker build --tag=alpine-java:base --rm=true .

註意:該-tag 選項將定義圖像的名稱,-rm =true 已成功建成後,將刪除中間圖像。此 Shell 命令中的最後一個字符是一個點,用作構建目錄參數。

Docker 化獨立的 Spring Boot

應用程序

作為我們可以容器化的應用的例子,我們從 Spring Cloud Configuration Tutorial 配置 Spring-cloud-config/server 文件。作為一個準備步驟,我們必須組裝一個可運行的 Jar 文件並將其復制到我們的 Docker 構建目錄中:

技術分享

現在,我們將創建一個名為 Dockerfile.server 的 Dockerfile 文件,內容如下:

技術分享

  • FROM:作為我們的基礎鏡像,我們將采用在上一節中創建的可運行 Java 程序的 Alpine Linux。

  • COPY:我們讓 Docker 將我們的 Jar 文件復制到鏡像中。

  • ENV:該命令允許我們定義一些環境變量,這些變量將被容器中運行的應用程序所引用。在這裏我們定義 Spring Boot 應用程序的配置,以便稍後將其傳遞給可執行的 Jar 文件。

  • ENTRYPOINT / CMD:這是在容器啟動時啟動的可執行文件。我們必須將它們定義為 JSON-Array 格式的,因為我們將使用 ENTRYPOINT 與 CMD 結合的某些應用程序參數。

  • VOLUME:因為我們的容器將在獨立的環境中運行,沒有直接的網絡訪問,所以我們必須為我們的配置庫定義一個掛載點占位符。

  • EXPOSE:這裏我們告訴 Docker,我們的應用程序在哪個端口啟動。當容器啟動時,該端口將被發布到主機。

我們要從 Dockerfile 創建一個鏡像,必須像之前一樣運行 ‘docker build ‘:

技術分享

但是,在我們從鏡像中運行容器之前,我們必須創建一個用於安裝的卷:

技術分享

註意:雖然容器是不可變的,但是在應用程序退出後未提交到映像的情況下,存儲在卷中的數據將在多個容器中持久存儲。

最後我們可以在我們的鏡像中運行容器。

技術分享

  • 首先,我們要命名我們的容器。如果沒有,將選擇默認的。

  • 然後,我們必須將我們公開的端口(請參閱 Dockerfile)發布到我們主機上的端口。該值以 “host-port:container-port” 的形式給出。如果只提供了一個容器端口,將使用隨機選擇的主機端口。如果我們不寫這個選項,容器將被完全隔離。

  • Volume 選項可以訪問任一主機上的一個目錄(以絕對路徑使用時)或先前創建的 Docker Volume(當時用 Volume-Name 時)。冒號後面的路徑指定容器內的掛載點。

  • 作為參數,我們必須告訴 Docker,要使用哪個鏡像。在這裏,我們必須從之前的“ docker build ”步驟給出的鏡像名稱。

  • 一些更有用的選項:

  1. -it 啟用交互模式並分配虛擬終端機

  2. -d 啟動後從容器中分離

如果我們在分離模式下運行容器,我們可以檢查其細節,停止並使用以下命令將其刪除:

技術分享

將互相依賴的應用程序進行容器化

Docker 命令和 Dockerfiles 特別適用於創建單個容器。但是,如果要在隔離的網絡上運行微服務,容器管理將會變得非常混亂。

為了解決這個問題,Docker 提供了一個名為 Docker Compose 的工具。它具有自己的 YAML 格式的構建文件,更適合管理多個容器。例如:它能夠在一個命令中啟動或停止服務組合,或將多個服務的日誌輸出合並到一個虛擬終端機中。

我們來構建運行在不同 Docker 容器中的兩個應用程序的例子。它們將彼此通信,並被視為主機系統的獨立單元。我們將把 Spring Cloud 配置教程中描述的 spring-cloud-config / client 示例構建復制到我們的文件夾,就像我們之前使用的配置服務一樣。

下面是我們的 Docker-compose.yml:

技術分享

技術分享

  • Version:指定應使用哪種版本的格式。這是必填字段。這裏我們使用較新版本,而舊版格式為‘1‘。

  • Services:此鍵中的每個對象定義一個服務,也稱為容器。這個選項是必填的。

  • Build:如果指定,docker-compose 可以從 Dockerfile 構建鏡像。

  • Context:如果指定,就會生成 Dockerfile 中制定的目錄。

  • Dockerfile:如果指定,它會生成一個Dockerfile 中設置的備用名稱。

  • Image:在構建功能被使用時,告訴 Docker 它應該使用的鏡像的名字。否則,它會在本地庫或遠程註冊表中搜索此圖像。

  • Networks:這是命名網絡名稱的標識符。給定的名稱值必須是在網絡節點中存在的。

  • Volumes:標識要使用的命名卷和掛載點,以冒號分隔。同樣應該是在網絡節點中存在的,卷名必須在單獨的卷部分中定義。

  • Links:將創建此服務和列出的服務之間的內部網絡鏈接。此服務將連接到列出的服務,其中冒號之前的部分從服務節點中指定服務名稱,冒號後面的部分是指定服務在外部端口上偵聽的主機名。

  • Depends_on:告訴 Docker 僅啟動服務,如果列出的服務已成功啟動。註意:這只在容器級別有用!關於啟動從屬應用程序的解決方法,請參閱 Config-client-entrypoint.sh。

  • Logging:這裏我們使用 ‘json-file‘ 驅動,這是默認驅動。可替換為其他日誌驅動或使用 “none”。

  • Networks:在本選項中,我們將指定可用於我們服務的網絡。在這個例子中,我們讓 docker-compose 創建一個對我們來說名為“橋接”的網絡類型。如果選項 external 設置為 true,它將使用具有給定名稱的現有選項。

  • Volumes:這與網絡部分相似。

在繼續之前,我們將檢查我們的構建文件以檢查語法錯誤:

技術分享

下面是我們的 Dockerfile.client 來構建配置客戶端映像。它不同於 Dockerfile.server,因為我們還安裝了 OpenBSD netcat(這在下一步需要),並使 Entrypoint 成為可執行文件:

技術分享

這是我們的配置客戶端服務定制的 Entrypoint。這裏我們在一個循環中使用 netcat 來檢查我們的配置服務器是否準備就緒。您必須註意,我們可以通過其鏈接名稱而不是 IP 地址訪問我們的配置服務器:

技術分享

最後,我們可以構建我們的鏡像,創建定義的容器並在一個命令中啟動它們:

技術分享

要停止容器,請將其從 Docker 中刪除,並從中刪除所連接的網絡和卷,我們可以使用相反的命令:

技術分享

Docker-compose 的一個很好的功能是擴容服務的能力。例如,我們可以告訴 Docker 啟動一個容器配置服務器和三個容器的配置客戶端。

但是為了正常工作,我們必須讓 Docker 選擇一個 Container_name 從 Docker-compose.yml 中刪除,我們必須更改暴露的端口配置,以避免沖突。

之後,我們可以擴容我們的服務,擴容為擁有3臺 Client 的集群:

技術分享

結論

正如我們所看到的,我們現在可以構建定制的 Docker 映像,用 Docker 容器運行 Spring Boot 應用程序,並使用 Docker-compose 創建依賴容器。

有關構建文件的進一步閱讀,請參考官方 Dockerfile Reference 和 Docker-compose.yml reference。

作者:靳日陽,JFrog 研發工程師

具有多年軟件開發經驗;對Java主流技術、前沿框架都具有豐富的開發經驗;擅長Linux服務器,對優化,部署等有深入研究,熟悉Jenkins,持續集成及交付,DevOps等。

歡迎轉載,但轉載請註明作者與出處。謝謝!

Docker 容器整合 Spring Boot 應用