码农日记

薄洪涛的个人博客

docker-swarm部署java项目

技术栈

  • Java 版本: 17

  • Spring Boot 版本: 3.x

  • MyBatis-Plus: 简化 MyBatis 操作的增强工具

  • PostgreSQL: 关系型数据库

  • Redis: 分布式缓存解决方案

  • RabbitMQ: 消息队列

现状

  1. 在jenkins打包项目重启的时候,此时请求会出现502的错误,影响使用

  2. 扩容,缩容,健康检测等很难实现

  3. 自动化滚动升级很难实现

改造

  1. 使用容器部署

  2. 使用docker-swarm作为容器管理调度工具,使用portainer可视化工具管理容器

改造步骤

1. 安装docker
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum -y install docker-ce
sudo systemctl start docker
2. docker-swarm 集群构建
2.1 构建

构建后,会输出令牌token,当前节点为管理主节点,其他节点想要加入需要使用

docker swarm init
2.2 查看令牌
docker swarm join-token manager
docker swarm join-token worker
2.3 加入集群
docker swarm join --token SWMTKN-1-2kqe46td148u22yale6e6mqfd1w2jvtt51frny4r399fskko5m-ct1ixb6627voy3niwjl227d3y 172.29.214.124:2377
2.4 查看节点
docker node ls
3. 网络搭建

在 Swarm 中创建一个 Overlay 网络,使各个服务能够跨节点通信:

docker network create -d overlay nhis-service-network
4. 创建docker镜像
4.1 编写dockerfile
FROM openjdk:17-jdk-slim

LABEL authors="boht"

WORKDIR /app

RUN mkdir -p /app/logs

RUN mkdir -p /app/config

COPY ./nhis-service.jar /app/nhis-service.jar

ENTRYPOINT ["java", "-jar", "-Xmx1024M", "-Xms256M", "/app/nhis-service.jar"]
4.2 构建镜像
docker build -t myregistry.com/nhis-service:latest .
4.3 推送镜像到私有仓库 (非必须)

如果是单机器的话,只需要在本地就可以,给每个镜像一个唯一的tag

docker push myregistry.com/nhis-service:latest
5. 配置docker compose

创建docker-compose.yml

version: '3.8'
services:
  springboot-app:
    image: nhis-service
    deploy:
      replicas: 2 # 部署容器数量
      update_config:
        parallelism: 1  # 每次更新一个容器
        delay: 5s     # 每个容器更新间隔10秒
        order: start-first # 滚动升级时先把新容器启动后,再干掉旧容器
      restart_policy:
        condition: on-failure
    # 健康检测相关
    healthcheck:
      # 需要提供一个健康检测接口,只需要httpcode返回200即可
      test: curl -f http://localhost:12555/nhapi/healthcheck/ping || exit 0
      interval: 10s # 失败后延迟多久重试
      timeout: 3s 	# 一次请求等待时间
      retries: 3 		# 重试次数,超过后容器标识为unhealthy
    ports:
      - "12555:12555"
    volumes:
      - ./logs:/app/logs
      - ./config:/app/config
    networks:
      -  nhis-service-network
networks:
  nhis-service-network:
    external: true
6. 部署Docker Stack
6.1 部署Stack

在主节点上,执行

docker stack deploy -c docker-compose.yml nhis-service-stack
6.2 检查服务状态
docker service ls
7. 滚动升级

执行后,会按照docker-compose.yml里面指定的规则滚动升级,不会中断服务

docker service update --image nhis-service:$VERSION nhis-service-stack_springboot-app
8. 常用命令

大部分可以直接在portainer操作

8.1 查看服务日志
docker service logs nhis-service-stack_springboot-app
8.2 扩展或缩减副本数
docker service scale nhis-service-stack_springboot-app=5  # 将副本数调整为 5
8.3 删除 Stack

如需删除 Stack,运行:

docker stack rm nhis-service-stack
8.4 清理操作
清除未使用image
Docker images purne
docker container prune
9. jenkins部署脚本示例
#!/bin/bash

APP_NAME="nhis-service"

DEPLOY_DIR="/home/zrapi/nhis-service"
 
GIT_COMMIT_HASH="$GIT_COMMIT"

VERSION="${GIT_COMMIT_HASH}"

cd  $DEPLOY_DIR

echo "deploy gitCommitHash: $GIT_COMMIT_HASH"

echo "docker build..."

docker build -t "$APP_NAME:$VERSION" .

echo "docer-swarm deploy..."

rm nhis-service.jar

docker service update --image nhis-service:$VERSION nhis-service-stack_springboot-app

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权所有 | 转载请标明出处