Docker Stack部署Java Web项目的实现

 更新时间:2023年06月13日 09:26:43   作者:WEIII  
本文主要介绍了Docker Stack部署Java Web项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

本篇主要记录 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,端口协议(tcpudp),未指定则意味着任何协议。
  • 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,用于定义检查容器健康状态的命令。为字符串或列表形式。若为列表形式,第一个元素必须为NONECMDCMD-SHELL其一;如果为字符串则等效于CMD-SHELLCMD-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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • CentOS7虚拟机安装并配置docker套件

    CentOS7虚拟机安装并配置docker套件

    这篇文章主要介绍了CentOS7虚拟机安装并配置docker套件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Docker同时安装MySQL和MariaDB的方法步骤

    Docker同时安装MySQL和MariaDB的方法步骤

    这篇文章主要介绍了Docker同时安装MySQL和MariaDB的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Docker一行命令完成FTP服务搭建的实现

    Docker一行命令完成FTP服务搭建的实现

    这篇文章主要介绍了Docker一行命令完成FTP服务搭建的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • docker run容器运行的方法实现

    docker run容器运行的方法实现

    本文主要介绍了docker run容器运行的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Docker mongoDB 4.2.1 安装并收集springboot日志的步骤详解

    Docker mongoDB 4.2.1 安装并收集springboot日志的步骤详解

    这篇文章主要介绍了Docker mongoDB 4.2.1 安装并收集springboot日志,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 使用 docker部署tomcat并接入skywalking的使用

    使用 docker部署tomcat并接入skywalking的使用

    这里主要介绍了使用 docker 部署 tomact 并接入 skywalking 的使用,因为在网上并没有查到太多相关的信息,所以这里记录下来,需要对有需求的小伙伴提供一些帮助
    2021-04-04
  • 详解Docker退出容器不关闭容器的方法

    详解Docker退出容器不关闭容器的方法

    进入docker容器后如果退出容器,容器就会变成Exited的状态,那么如何退出容器让容器不关闭呢?现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Docker部署MySQL并实现客户端连接

    Docker部署MySQL并实现客户端连接

    这篇文章介绍了Docker部署MySQL并实现客户端连接的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • Docker如何使用nginx搭建tomcat集群(图文详解)

    Docker如何使用nginx搭建tomcat集群(图文详解)

    这篇文章主要介绍了Docker使用nginx搭建tomcat集群的教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • docker私有仓库harbor搭建过程

    docker私有仓库harbor搭建过程

    这篇文章主要介绍了docker私有仓库harbor搭建过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论