Docker Swarm 部署方案

目录结构准备

bash 复制代码
mkdir -p swarm-deploy
cd swarm-deploy
mkdir -p {mysql,postgres,redis,hugegraph,nacos,app}/{data,logs,conf}

docker-compose.yml

yaml 复制代码
version: '3.8'

services:
  # MySQL 服务
  mysql:
    image: mysql:8.0
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: nacos
      MYSQL_USER: nacos
      MYSQL_PASSWORD: nacospassword
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/logs:/var/log/mysql
    networks:
      - app-network
    ports:
      - "3306:3306"

  # PostgreSQL 服务
  postgres:
    image: postgres:15
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    environment:
      POSTGRES_DB: hugegraph
      POSTGRES_USER: hugegraph
      POSTGRES_PASSWORD: hugegraphpassword
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
      - ./postgres/conf:/etc/postgresql
      - ./postgres/logs:/var/log/postgresql
    networks:
      - app-network
    ports:
      - "5432:5432"

  # Redis 服务
  redis:
    image: redis:7-alpine
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    command: redis-server --appendonly yes --requirepass redispassword
    volumes:
      - ./redis/data:/data
      - ./redis/conf:/usr/local/etc/redis
      - ./redis/logs:/var/log/redis
    networks:
      - app-network
    ports:
      - "6379:6379"

  # Nacos 服务(单机模式)
  nacos:
    image: nacos/nacos-server:latest
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    environment:
      MODE: standalone
      SPRING_DATASOURCE_PLATFORM: mysql
      MYSQL_SERVICE_HOST: mysql
      MYSQL_SERVICE_DB_NAME: nacos
      MYSQL_SERVICE_PORT: 3306
      MYSQL_SERVICE_USER: nacos
      MYSQL_SERVICE_PASSWORD: nacospassword
      NACOS_AUTH_ENABLE: "true"
      NACOS_AUTH_TOKEN: "SecretKey012345678901234567890123456789012345678901234567890123456789"
    volumes:
      - ./nacos/logs:/home/nacos/logs
      - ./nacos/conf:/home/nacos/conf
    networks:
      - app-network
    ports:
      - "8848:8848"
    depends_on:
      - mysql

  # HugeGraph 服务
  hugegraph:
    image: hugegraph/hugegraph:latest
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    environment:
      GREMLIN_SERVER_PORT: 8182
      BACKEND: postgresql
      POSTGRESQL_HOST: postgres
      POSTGRESQL_PORT: 5432
      POSTGRESQL_USERNAME: hugegraph
      POSTGRESQL_PASSWORD: hugegraphpassword
      POSTGRESQL_DATABASE: hugegraph
    volumes:
      - ./hugegraph/logs:/opt/hugegraph/logs
      - ./hugegraph/conf:/opt/hugegraph/conf
      - ./hugegraph/data:/opt/hugegraph/data
    networks:
      - app-network
    ports:
      - "8182:8182"
      - "8080:8080"
    depends_on:
      - postgres

  # Spring Boot 应用
  springboot-app:
    image: your-springboot-app:latest
    deploy:
      replicas: 3  # 根据需求调整副本数
      restart_policy:
        condition: on-failure
      update_config:
        parallelism: 1
        delay: 10s
    environment:
      SPRING_PROFILES_ACTIVE: prod
      SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR: nacos:8848
      SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR: nacos:8848
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/your_database?useSSL=false&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: rootpassword
      SPRING_REDIS_HOST: redis
      SPRING_REDIS_PASSWORD: redispassword
      SPRING_REDIS_PORT: 6379
    volumes:
      - ./app/logs:/app/logs
    networks:
      - app-network
    depends_on:
      - mysql
      - redis
      - nacos
      - hugegraph

networks:
  app-network:
    driver: overlay
    attachable: true

配置文件示例

1. MySQL 配置文件 (mysql/conf/my.cnf)

ini 复制代码
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
max_connections=1000
innodb_buffer_pool_size=1G
log-bin=mysql-bin
server-id=1

[client]
default-character-set=utf8mb4

2. PostgreSQL 配置文件 (postgres/conf/postgresql.conf)

ini 复制代码
listen_addresses = '*'
max_connections = 100
shared_buffers = 256MB
logging_collector = on
log_directory = '/var/log/postgresql'

3. Redis 配置文件 (redis/conf/redis.conf)

conf 复制代码
bind 0.0.0.0
port 6379
requirepass redispassword
appendonly yes
appendfsync everysec
maxmemory 2gb
maxmemory-policy allkeys-lru

4. Nacos 配置 (可选配置 nacos/conf/application.properties)

properties 复制代码
server.servlet.contextPath=/nacos
server.port=8848

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://mysql:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos
db.password=nacospassword

5. Spring Boot 应用的 Dockerfile

dockerfile 复制代码
FROM openjdk:17-jdk-slim

WORKDIR /app

# 复制应用jar包
COPY target/your-app.jar app.jar

# 创建日志目录
RUN mkdir -p /app/logs

# 暴露端口
EXPOSE 8080

# 启动应用
ENTRYPOINT ["java", "-jar", "app.jar", \
            "--spring.profiles.active=prod", \
            "--logging.file.path=/app/logs", \
            "--logging.file.name=/app/logs/application.log"]

部署步骤

1. 初始化 Swarm(如果尚未初始化)

bash 复制代码
# 在主节点上初始化 Swarm
docker swarm init

# 在工作节点上加入 Swarm
docker swarm join --token <token> <manager-ip>:2377

2. 创建网络和卷(如果需要独立的数据卷)

bash 复制代码
# 创建 overlay 网络
docker network create -d overlay app-network

# 创建数据卷(可选,如果使用本地目录映射则不需要)
docker volume create mysql-data
docker volume create postgres-data
docker volume create redis-data

3. 构建和推送 Spring Boot 应用镜像

bash 复制代码
# 构建应用镜像
docker build -t your-springboot-app:latest .

# 推送到 Docker Registry(如果是多节点部署)
docker tag your-springboot-app:latest your-registry/your-springboot-app:latest
docker push your-registry/your-springboot-app:latest

4. 部署应用栈

bash 复制代码
# 部署整个应用栈
docker stack deploy -c docker-compose.yml app-stack

# 查看服务状态
docker stack services app-stack

# 查看所有容器状态
docker stack ps app-stack

# 查看日志
docker service logs app-stack_springboot-app

5. 常用管理命令

bash 复制代码
# 扩展应用实例
docker service scale app-stack_springboot-app=5

# 更新应用
docker service update --image your-springboot-app:new-version app-stack_springboot-app

# 回滚到之前的版本
docker service update --rollback app-stack_springboot-app

# 停止整个应用栈
docker stack rm app-stack

# 查看网络
docker network ls

# 查看服务详情
docker service inspect app-stack_springboot-app

环境变量配置建议

创建一个 .env 文件来管理敏感信息:

env 复制代码
# .env 文件
MYSQL_ROOT_PASSWORD=your_secure_password
NACOS_AUTH_TOKEN=your_secret_token
REDIS_PASSWORD=your_redis_password
POSTGRES_PASSWORD=your_postgres_password

然后在 docker-compose.yml 中引用:

yaml 复制代码
environment:
  MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

部署时使用:

bash 复制代码
docker stack deploy --compose-file docker-compose.yml app-stack

监控和日志收集

建议添加监控服务:

yaml 复制代码
  # Prometheus 监控
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    networks:
      - app-network
    ports:
      - "9090:9090"

  # Grafana 可视化
  grafana:
    image: grafana/grafana:latest
    volumes:
      - grafana-data:/var/lib/grafana
    networks:
      - app-network
    ports:
      - "3000:3000"

  # ELK 日志收集(可选)
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
    environment:
      - discovery.type=single-node
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data
    networks:
      - app-network

这个配置方案提供了:

  1. 完整的数据持久化配置
  2. 服务间的网络通信
  3. 配置文件外部化管理
  4. 日志文件映射
  5. 服务依赖和启动顺序管理
  6. 水平扩展能力

根据你的具体需求调整资源配置、端口和版本号。

相关推荐
Victor3562 小时前
MongoDB(52)如何配置分片?
后端
Victor3562 小时前
MongoDB(53)什么是分片键?
后端
薛定谔的悦8 小时前
MQTT通信协议业务层实现的完整开发流程
java·后端·mqtt·struts
enjoy嚣士9 小时前
springboot之Exel工具类
java·spring boot·后端·easyexcel·excel工具类
无限大69 小时前
职场逻辑03:3步搞定高效汇报,让领导看到你的价值
后端
盐水冰10 小时前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
紫丁香10 小时前
AutoGen详解一
后端·python·flask
小涛不学习10 小时前
Spring Boot 详解(从入门到原理)
java·spring boot·后端
Victor35612 小时前
MongoDB(51)什么是分片?
后端
Victor35612 小时前
MongoDB(50)副本集中的角色有哪些?
后端