Docker Stack部署Java Web項目的實現(xiàn)
前言
本篇主要記錄 Docker Stack 部署編排中部分鍵或元素的疑難點,例如網(wǎng)絡和數(shù)據(jù)卷的配置區(qū)別用法。之后再演示一個Java Web項目如何應用到 Docker Stack 中。
部分鍵/元素用法
Networks
定義頂級鍵networks
可以創(chuàng)建網(wǎng)絡,在services
中定義次級network
可以讓服務加入網(wǎng)絡。
如下示例中,創(chuàng)建了一個網(wǎng)絡wei
,且將服務wei-app
連接到這個網(wǎng)絡中。
services: wei-app: image: jre8:4.0 networks: - wei networks: wei:
Services Ports
ports
可用于暴露容器的端口。注意端口映射在network_mode: host
網(wǎng)絡模式下無法使用,否則會報錯。
- target,容器端口。
- published,對外開放的服務端口??梢栽O置一個范圍內(nèi)端口(形如:
start-end
),因此這是用字符串表示的。 - host_ip,主機 IP 映射,未指定則意味著所有網(wǎng)絡接口(
0.0.0.0
)。 - protocol,端口協(xié)議(
tcp
或udp
),未指定則意味著任何協(xié)議。 - mode,
host
則開放每個節(jié)點上的主機端口,ingress
則對端口實現(xiàn)負載均衡。
services: wei-app: image: jre8:4.0 ports: - published: "80" target: 8080 mode: ingress
Volumes
volumes
可以是要掛載的主機路徑或者指定的命名數(shù)據(jù)卷。
如果說掛載的是主機路徑,且只被一個服務使用,那么基本上只需在services
內(nèi)定義次級volumes
,而不用定義頂級volumes
;如果是想要 volume 是多個服務間復用的,那么必須在頂級volumes
聲明命名數(shù)據(jù)卷。
頂級鍵volumes
之下的值可以是空的,這時是用的 Docker 中默認的配置來創(chuàng)建數(shù)據(jù)卷。
以下示例中,定義了命名數(shù)據(jù)卷db-data
,并且在backend
服務中使用了db-data
數(shù)據(jù)卷。
services: backend: image: awesome/backend volumes: - type: volume source: db-data target: /data volume: nocopy: true - type: bind source: /var/run/postgres/postgres.sock target: /var/run/postgres/postgres.sock volumes: db-data:
Healthcheck
用于配置檢查服務容器是否為healthy
狀態(tài)。
- test,用于定義檢查容器健康狀態(tài)的命令。為字符串或列表形式。若為列表形式,第一個元素必須為
NONE
、CMD
或CMD-SHELL
其一;如果為字符串則等效于CMD-SHELL
。CMD-SHELL
會運行字符串形式的命令,它使用的是容器中默認的 shell(在 Linux 中是/bin/sh
)。NONE
則禁用健康檢查,可以用于禁用鏡像中已配置的健康檢查。 - interval,健康檢查命令執(zhí)行的間隔時間。
- timeout,超時,如果檢查時間超過時間則認為檢查失敗。
- retries,重試次數(shù),連續(xù)多次重試健康檢查失敗則認為容器處于
unhealthy
狀態(tài)。 - start_period,用于緩沖容器啟動的時間。如果在此期間健康檢查失敗則不計入重試次數(shù)。
示例一:
# Hit the local web app test: ["CMD", "curl", "-f", "http://localhost"]
示例二:
### 這兩個是等效的 test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] test: curl -f https://localhost || exit 1
示例三:
services: backend: image: awesome/backend healthcheck: test: wget -q -O- localhost:8080/actuator/health | grep UP || exit 1 interval: 5s timeout: 2s retries: 10 start_period: 10s
項目的應用
通過對 Docker Swarm 以及 Docker Stack 的相關了解后,就可以在實際的項目中快速部署一個完整的應用程序棧。
項目架構示意圖
本例是以 Docker Desktop for Mac 為平臺的,將演示項目以單集群形式部署,項目包含兩個 Java Web 應用服務:demo-admin 和 demo-app,并且分別運行2個實例。
Java Web 項目
本例的 Java Web 應用程序以 Spring Boot 為框架,并且特別地集成了 Spring Boot Actuator。
Spring Boot Actuator,可以用于對應用程序的監(jiān)控和管理,它本身提供了一些 Http 端點方便我們查看應用的狀態(tài),包括 Health 健康信息、Info 應用信息、HTTP Request 跟蹤信息、Metrics 信息等。
那么集成 Spring Boot Actuator 的用處是什么?舉例一個簡單的場景,假設要判斷 Java 服務部署后是否可用,那么可以怎么做。最簡單的我們可以手動向服務發(fā)起一次請求,根據(jù)請求的響應即可判斷。而 Spring Boot Actuator 正好可以幫忙做這樣的事。而更好的使用場景是,與 Docker 的 healthcheck 機制一同使用,可以更好地做到服務回滾與滾動更新,且在單集群單實例部署情況下十分有用。
引入 Spring Boot Actuator 依賴
services: backend: image: awesome/backend healthcheck: test: wget -q -O- localhost:8080/actuator/health | grep UP || exit 1 interval: 5s timeout: 2s retries: 10 start_period: 10s
本地啟動應用并測試端點
curl localhost:8080/actuator/health ### 服務未啟動/啟動中時返回 curl: (7) Failed to connect to localhost port 8080: Connection refused ### 服務已啟動時返回 {"status":"UP"}
項目的棧編排
網(wǎng)絡配置
棧的編排中,創(chuàng)建了一個overlay
驅動類型的demo
網(wǎng)絡,這可以讓服務間通過服務名通信。
服務編排
以demo-admin
服務為說明:其對外開放的服務端口是8080
,容器內(nèi)的 Java Web 應用進程監(jiān)聽8080
端口,服務連接到demo
網(wǎng)絡,并使用ingress
路由組網(wǎng)實現(xiàn)端口負載均衡。demo-app
服務與demo-admin
服務的部署區(qū)別在于,demo-app
服務啟動兩個實例,而demo-admin
服務只啟動一個實例,因此demo-admin
服務以start-first
方式保證更新時的服務可用性。
健康檢查
healthcheck
健康檢查中,通過wget -q -O- localhost:8080/actuator/health | grep UP || exit 1
命令判斷服務是否可用來決定容器是否為健康狀態(tài)。
當wget -q -O- localhost:8080/actuator/health | grep UP
的結果不是UP
時則exit 1
退出狀態(tài)碼為1,表示服務不可用。
version: "3.9" services: demo-admin: image: jre8:4.0-arm64 ports: - published: 8080 target: 8080 mode: ingress networks: - demo deploy: mode: replicated replicas: 1 update_config: parallelism: 1 order: start-first restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s rollback_config: parallelism: 1 order: start-first volumes: - type: bind source: /Users/wei/data/project/demo/demo-admin target: /data/project/demo/demo-admin working_dir: /data/project/demo/demo-admin/jar/dev/ healthcheck: test: wget -q -O- localhost:8080/actuator/health | grep UP || exit 1 interval: 5s timeout: 2s retries: 10 start_period: 10s environment: JAVA_OPT_EXT: -server -Xmx512m -Xms512m -Xmn256m -Xss256k JAVA_OPTS: -Djava.security.egd=file:/dev/./urandom --spring.config.location=file:./ --spring.profiles.active=dev command: java -jar demo-admin-2.0.0.jar demo-app: image: jre8:4.0-arm64 ports: - published: 8081 target: 8081 mode: ingress networks: - demo deploy: mode: replicated replicas: 2 update_config: parallelism: 1 order: stop-first restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s rollback_config: parallelism: 1 order: stop-first volumes: - type: bind source: /Users/wei/data/project/demo/demo-app target: /data/project/demo/demo-app working_dir: /data/project/demo/demo-app/jar/dev/ healthcheck: test: wget -q -O- localhost:8081/actuator/health | grep UP || exit 1 interval: 5s timeout: 2s retries: 10 start_period: 10s environment: JAVA_OPT_EXT: -server -Xmx512m -Xms512m -Xmn256m -Xss256k JAVA_OPTS: -Djava.security.egd=file:/dev/./urandom --spring.config.location=file:./ --spring.profiles.active=dev command: java -jar demo-app-2.0.0.jar networks: demo: driver: overlay
部署項目
部署命令
docker stack services demo ID NAME MODE REPLICAS IMAGE PORTS 6w0nmrunl0rq demo_admin replicated 1/1 jre8:4.0-arm64 *:8080->8080/tcp p6jzkyy12c9a demo_app replicated 2/2 jre8:4.0-arm64 *:8081->8081/tcp
查看服務
docker stack ps demo ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS lot0ukm6cqqo demo_admin.1 jre8:4.0-arm64 docker-desktop Running Running 6 minutes ago jnb7wfovocfw demo_app.1 jre8:4.0-arm64 docker-desktop Running Running 6 minutes ago n5xixujzuidd demo_app.2 jre8:4.0-arm64 docker-desktop Running Running 6 minutes ago
查看運行 task
docker stack ps demo ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS lot0ukm6cqqo demo_admin.1 jre8:4.0-arm64 docker-desktop Running Running 6 minutes ago jnb7wfovocfw demo_app.1 jre8:4.0-arm64 docker-desktop Running Running 6 minutes ago n5xixujzuidd demo_app.2 jre8:4.0-arm64 docker-desktop Running Running 6 minutes ago
參考
[1] Networks top-level element
[2] Services top-level element
[3] Volumes top-level element
[4] HEALTHCHECK
到此這篇關于Docker Stack部署Java Web項目的實現(xiàn)的文章就介紹到這了,更多相關Docker Stack部署Java Web內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Docker容器中Mysql數(shù)據(jù)的導入/導出詳解
服務器在使用了 Docker 后,對于備份和恢復數(shù)據(jù)庫的事情做下記錄,下面這篇文章主要給大家介紹了Docker容器中Mysql數(shù)據(jù)導入/導出的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2018-09-09docker容器中登陸并操作postgresql的實現(xiàn)
本文主要介紹了docker容器中登陸并操作postgresql的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-02-02