目录
- 前言
- 部分键/元素用法
- Networks
- Services Ports
- Volumes
- Healthcheck
- 项目的应用
- 项目架构示意图
- Java Web 项目
- 引入 Spring Boot Actuator 依赖
- 本地启动应用并测试端点
- 项目的栈编排
- 网络配置
- 服务编排
- 健康检查
- 部署项目
- 部署命令
- 查看服务
- 查看运行 task
- 参考
前言
本篇主要记录 Docker Stack 部署编排中部分键或元素的疑难点,例如网络和数据卷的配置区别用法。之后再演示一个Java Web项目如何应用到 Docker Stack 中。
部分键/元素用法
Networks
定义顶级键networks可以创建网络,在services中定义次级network可以让服务加入网络。如下示例中,创建了一个网络wei,且将服务wei-app连接到这个网络中。
services:
wei-app:
image: jre8:4.0
networks:
– wei
networks:
wei:
Services Ports
ports可用于暴露容器的端口。注意端口映射在network_mode: host网络模式下无法使用,否则会报错。
- target,容器端口。
- published,对外开放的服务端口。可以设置一个范围内端口(形如:start-end),因此这是用字符串表示的。
- host_ip,主机 IP 映射,未指定则意味着所有网络接口(0.0.0.0)。
- protocol,端口协议(tcp或udp),未指定则意味着任何协议。
- mode,host则开放每个节点上的主机端口,ingress则对端口实现负载均衡。
services:
wei-app:
image: jre8:4.0
ports:
– published: \”80\”
target: 8080
mode: ingress
Volumes
volumes可以是要挂载的主机路径或者指定的命名数据卷。
如果说挂载的是主机路径,且只被一个服务使用,那么基本上只需在services内定义次级volumes,而不用定义顶级volumes;如果是想要 volume 是多个服务间复用的,那么必须在顶级volumes声明命名数据卷。
顶级键volumes之下的值可以是空的,这时是用的 Docker 中默认的配置来创建数据卷。
以下示例中,定义了命名数据卷db-data,并且在backend服务中使用了db-data数据卷。
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状态。
- test,用于定义检查容器健康状态的命令。为字符串或列表形式。若为列表形式,第一个元素必须为NONE、CMD或CMD-SHELL其一;如果为字符串则等效于CMD-SHELL。CMD-SHELL会运行字符串形式的命令,它使用的是容器中默认的 shell(在 Linux 中是/bin/sh)。NONE则禁用健康检查,可以用于禁用镜像中已配置的健康检查。
- interval,健康检查命令执行的间隔时间。
- timeout,超时,如果检查时间超过时间则认为检查失败。
- retries,重试次数,连续多次重试健康检查失败则认为容器处于unhealthy状态。
- start_period,用于缓冲容器启动的时间。如果在此期间健康检查失败则不计入重试次数。
示例一:
# 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,可以用于对应用程序的监控和管理,它本身提供了一些 Http 端点方便我们查看应用的状态,包括 Health 健康信息、Info 应用信息、HTTP Request 跟踪信息、Metrics 信息等。
那么集成 Spring Boot Actuator 的用处是什么?举例一个简单的场景,假设要判断 Java 服务部署后是否可用,那么可以怎么做。最简单的我们可以手动向服务发起一次请求,根据请求的响应即可判断。而 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\”}
项目的栈编排
网络配置
栈的编排中,创建了一个overlay驱动类型的demo网络,这可以让服务间通过服务名通信。
服务编排
以demo-admin服务为说明:其对外开放的服务端口是8080,容器内的 Java Web 应用进程监听8080端口,服务连接到demo网络,并使用ingress路由组网实现端口负载均衡。demo-app服务与demo-admin服务的部署区别在于,demo-app服务启动两个实例,而demo-admin服务只启动一个实例,因此demo-admin服务以start-first方式保证更新时的服务可用性。
健康检查
healthcheck健康检查中,通过wget -q -O- localhost:8080/actuator/health | grep UP || exit 1命令判断服务是否可用来决定容器是否为健康状态。
当wget -q -O- localhost:8080/actuator/health | grep UP的结果不是UP时则exit 1退出状态码为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项目的实现的文章就介绍到这了,更多相关Docker Stack部署Java Web内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!