Docker Stack部署Java Web項(xiàng)目的實(shí)現(xiàn)
前言
本篇主要記錄 Docker Stack 部署編排中部分鍵或元素的疑難點(diǎn),例如網(wǎng)絡(luò)和數(shù)據(jù)卷的配置區(qū)別用法。之后再演示一個(gè)Java Web項(xiàng)目如何應(yīng)用到 Docker Stack 中。
部分鍵/元素用法
Networks
定義頂級鍵networks可以創(chuàng)建網(wǎng)絡(luò),在services中定義次級network可以讓服務(wù)加入網(wǎng)絡(luò)。
如下示例中,創(chuàng)建了一個(gè)網(wǎng)絡(luò)wei,且將服務(wù)wei-app連接到這個(gè)網(wǎng)絡(luò)中。
services:
wei-app:
image: jre8:4.0
networks:
- wei
networks:
wei:Services Ports
ports可用于暴露容器的端口。注意端口映射在network_mode: host網(wǎng)絡(luò)模式下無法使用,否則會(huì)報(bào)錯(cuò)。
- target,容器端口。
- published,對外開放的服務(wù)端口??梢栽O(shè)置一個(gè)范圍內(nèi)端口(形如:
start-end),因此這是用字符串表示的。 - host_ip,主機(jī) IP 映射,未指定則意味著所有網(wǎng)絡(luò)接口(
0.0.0.0)。 - protocol,端口協(xié)議(
tcp或udp),未指定則意味著任何協(xié)議。 - mode,
host則開放每個(gè)節(jié)點(diǎn)上的主機(jī)端口,ingress則對端口實(shí)現(xiàn)負(fù)載均衡。
services:
wei-app:
image: jre8:4.0
ports:
- published: "80"
target: 8080
mode: ingressVolumes
volumes可以是要掛載的主機(jī)路徑或者指定的命名數(shù)據(jù)卷。
如果說掛載的是主機(jī)路徑,且只被一個(gè)服務(wù)使用,那么基本上只需在services內(nèi)定義次級volumes,而不用定義頂級volumes;如果是想要 volume 是多個(gè)服務(wù)間復(fù)用的,那么必須在頂級volumes聲明命名數(shù)據(jù)卷。
頂級鍵volumes之下的值可以是空的,這時(shí)是用的 Docker 中默認(rèn)的配置來創(chuàng)建數(shù)據(jù)卷。
以下示例中,定義了命名數(shù)據(jù)卷db-data,并且在backend服務(wù)中使用了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
用于配置檢查服務(wù)容器是否為healthy狀態(tài)。
- test,用于定義檢查容器健康狀態(tài)的命令。為字符串或列表形式。若為列表形式,第一個(gè)元素必須為
NONE、CMD或CMD-SHELL其一;如果為字符串則等效于CMD-SHELL。CMD-SHELL會(huì)運(yùn)行字符串形式的命令,它使用的是容器中默認(rèn)的 shell(在 Linux 中是/bin/sh)。NONE則禁用健康檢查,可以用于禁用鏡像中已配置的健康檢查。 - interval,健康檢查命令執(zhí)行的間隔時(shí)間。
- timeout,超時(shí),如果檢查時(shí)間超過時(shí)間則認(rèn)為檢查失敗。
- retries,重試次數(shù),連續(xù)多次重試健康檢查失敗則認(rèn)為容器處于
unhealthy狀態(tài)。 - start_period,用于緩沖容器啟動(dòng)的時(shí)間。如果在此期間健康檢查失敗則不計(jì)入重試次數(shù)。
示例一:
# Hit the local web app test: ["CMD", "curl", "-f", "http://localhost"]
示例二:
### 這兩個(gè)是等效的 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項(xiàng)目的應(yīng)用
通過對 Docker Swarm 以及 Docker Stack 的相關(guān)了解后,就可以在實(shí)際的項(xiàng)目中快速部署一個(gè)完整的應(yīng)用程序棧。
項(xiàng)目架構(gòu)示意圖
本例是以 Docker Desktop for Mac 為平臺(tái)的,將演示項(xiàng)目以單集群形式部署,項(xiàng)目包含兩個(gè) Java Web 應(yīng)用服務(wù):demo-admin 和 demo-app,并且分別運(yùn)行2個(gè)實(shí)例。

Java Web 項(xiàng)目
本例的 Java Web 應(yīng)用程序以 Spring Boot 為框架,并且特別地集成了 Spring Boot Actuator。
Spring Boot Actuator,可以用于對應(yīng)用程序的監(jiān)控和管理,它本身提供了一些 Http 端點(diǎn)方便我們查看應(yīng)用的狀態(tài),包括 Health 健康信息、Info 應(yīng)用信息、HTTP Request 跟蹤信息、Metrics 信息等。
那么集成 Spring Boot Actuator 的用處是什么?舉例一個(gè)簡單的場景,假設(shè)要判斷 Java 服務(wù)部署后是否可用,那么可以怎么做。最簡單的我們可以手動(dòng)向服務(wù)發(fā)起一次請求,根據(jù)請求的響應(yīng)即可判斷。而 Spring Boot Actuator 正好可以幫忙做這樣的事。而更好的使用場景是,與 Docker 的 healthcheck 機(jī)制一同使用,可以更好地做到服務(wù)回滾與滾動(dòng)更新,且在單集群單實(shí)例部署情況下十分有用。
引入 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本地啟動(dòng)應(yīng)用并測試端點(diǎn)
curl localhost:8080/actuator/health
### 服務(wù)未啟動(dòng)/啟動(dòng)中時(shí)返回
curl: (7) Failed to connect to localhost port 8080: Connection refused
### 服務(wù)已啟動(dòng)時(shí)返回
{"status":"UP"}項(xiàng)目的棧編排
網(wǎng)絡(luò)配置
棧的編排中,創(chuàng)建了一個(gè)overlay驅(qū)動(dòng)類型的demo網(wǎng)絡(luò),這可以讓服務(wù)間通過服務(wù)名通信。
服務(wù)編排
以demo-admin服務(wù)為說明:其對外開放的服務(wù)端口是8080,容器內(nèi)的 Java Web 應(yīng)用進(jìn)程監(jiān)聽8080端口,服務(wù)連接到demo網(wǎng)絡(luò),并使用ingress路由組網(wǎng)實(shí)現(xiàn)端口負(fù)載均衡。demo-app服務(wù)與demo-admin服務(wù)的部署區(qū)別在于,demo-app服務(wù)啟動(dòng)兩個(gè)實(shí)例,而demo-admin服務(wù)只啟動(dòng)一個(gè)實(shí)例,因此demo-admin服務(wù)以start-first方式保證更新時(shí)的服務(wù)可用性。
健康檢查
healthcheck健康檢查中,通過wget -q -O- localhost:8080/actuator/health | grep UP || exit 1命令判斷服務(wù)是否可用來決定容器是否為健康狀態(tài)。
當(dāng)wget -q -O- localhost:8080/actuator/health | grep UP的結(jié)果不是UP時(shí)則exit 1退出狀態(tài)碼為1,表示服務(wù)不可用。
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部署項(xiàng)目
部署命令
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
查看服務(wù)
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
查看運(yùn)行 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
到此這篇關(guān)于Docker Stack部署Java Web項(xiàng)目的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Docker Stack部署Java Web內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker容器中Mysql數(shù)據(jù)的導(dǎo)入/導(dǎo)出詳解
服務(wù)器在使用了 Docker 后,對于備份和恢復(fù)數(shù)據(jù)庫的事情做下記錄,下面這篇文章主要給大家介紹了Docker容器中Mysql數(shù)據(jù)導(dǎo)入/導(dǎo)出的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09
docker容器中登陸并操作postgresql的實(shí)現(xiàn)
本文主要介紹了docker容器中登陸并操作postgresql的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02

