Docker Labs项目实战:使用Swarm模式部署Java应用集群

Docker Labs项目实战:使用Swarm模式部署Java应用集群

labs This is a collection of tutorials for learning how to use Docker with various tools. Contributions welcome. labs 项目地址: https://gitcode.com/gh_mirrors/la/labs

前言

在现代应用开发中,容器化技术已经成为不可或缺的一部分。Docker Swarm作为Docker原生的集群管理工具,为开发者提供了简单高效的容器编排能力。本文将基于Docker Labs项目中的实践案例,详细介绍如何使用Swarm模式部署一个完整的Java EE应用集群。

Swarm模式基础概念

Swarm模式是Docker Engine内置的集群管理功能,它允许用户将多个Docker主机组成一个虚拟的单一系统。在Swarm模式下,我们可以:

  1. 创建和管理服务(Services)
  2. 扩展或缩减服务规模
  3. 管理网络连接
  4. 维护服务高可用性

Swarm集群由两种类型的节点组成:

  • 管理节点(Manager Nodes):负责集群管理和任务调度
  • 工作节点(Worker Nodes):运行容器任务

单节点Swarm初始化

虽然生产环境通常使用多节点集群,但为了演示目的,我们可以先初始化一个单节点Swarm:

docker swarm init

这个命令会输出类似以下内容:

Swarm initialized: current node (p9a1tqcjh58ro9ucgtqxa2wgq) is now a manager.

To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.65.3:2377

通过docker info命令可以查看Swarm集群的详细信息:

docker info

输出中会包含Swarm相关的配置信息,如节点数量、管理状态、Raft配置等。

多容器应用部署

我们将部署一个典型的Java EE应用架构,包含两个核心服务:

  1. MySQL数据库服务:提供数据持久化存储
  2. WildFly应用服务:运行Java EE应用,提供RESTful API

创建应用目录结构

首先创建一个专用目录来管理应用配置:

mkdir webapp
cd webapp

编写Docker Compose文件

创建一个docker-compose.yml文件,定义我们的服务:

version: '3'

services:
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: employees
    ports:
      - "3306:3306"

  web:
    image: arungupta/docker-javaee:dockerconeu17
    depends_on:
      - db
    ports:
      - "8080:8080"
      - "9990:9990"

这个配置定义了两个服务:

  • db服务使用MySQL 8镜像
  • web服务使用预构建的Java EE应用镜像

部署应用到Swarm

使用以下命令将应用部署到Swarm集群:

docker stack deploy --compose-file=docker-compose.yml webapp

部署完成后,系统会创建:

  1. 两个服务(web和db)
  2. 一个覆盖网络(webapp_default)

服务验证与管理

查看服务状态

docker service ls

输出示例:

ID                  NAME                MODE                REPLICAS            IMAGE                                   PORTS
j21lwelj529f        webapp_db           replicated          1/1                 mysql:8                                 *:3306->3306/tcp
m0m44axt35cg        webapp_web          replicated          1/1                 arungupta/docker-javaee:dockerconeu17   *:8080->8080/tcp,*:9990->9990/tcp

检查服务详情

docker service inspect webapp_web

这个命令会返回服务的详细配置信息,包括:

  • 容器规格
  • 网络配置
  • 端口映射
  • 资源限制
  • 重启策略等

查看服务日志

docker service logs -f webapp_web

通过日志可以监控应用启动过程,特别是WildFly服务器的启动日志。

应用访问测试

当服务启动完成后,我们可以测试应用的REST接口:

curl -v http://localhost:8080/resources/employees

预期输出是一个包含员工信息的XML响应:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<collection>
  <employee><id>1</id><name>Penny</name></employee>
  <employee><id>2</id><name>Sheldon</name></employee>
  <employee><id>3</id><name>Amy</name></employee>
  <employee><id>4</id><name>Leonard</name></employee>
  <employee><id>5</id><name>Bernadette</name></employee>
  <employee><id>6</id><name>Raj</name></employee>
  <employee><id>7</id><name>Howard</name></employee>
  <employee><id>8</id><name>Priya</name></employee>
</collection>

应用生命周期管理

临时停止应用

如果需要临时停止应用但保留数据,可以缩放服务实例数为0:

docker service scale webapp_db=0 webapp_web=0

这种方式会保留所有网络和卷配置,方便后续快速恢复。

完全删除应用

要彻底删除应用及其相关资源:

docker stack rm webapp

这个命令会:

  1. 停止所有服务容器
  2. 删除服务定义
  3. 移除相关网络

进阶思考

在实际生产环境中,我们还需要考虑:

  1. 多节点部署:通过docker swarm join添加更多工作节点
  2. 服务扩展:使用docker service scale增加服务副本数
  3. 滚动更新:使用docker service update实现零停机部署
  4. 健康检查:配置服务健康检查策略
  5. 密钥管理:使用Docker secrets管理敏感信息

总结

通过本文的实践,我们完成了:

  1. 单节点Swarm集群的初始化
  2. 多容器Java EE应用的部署
  3. 服务状态监控与管理
  4. 应用接口测试验证
  5. 应用的生命周期管理

Swarm模式为容器化应用提供了简单而强大的编排能力,特别适合中小规模的应用部署场景。通过将复杂的分布式系统抽象为服务定义,开发者可以更专注于业务逻辑的实现。

labs This is a collection of tutorials for learning how to use Docker with various tools. Contributions welcome. labs 项目地址: https://gitcode.com/gh_mirrors/la/labs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

房耿园Hartley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值