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. 水平扩展能力

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

相关推荐
都叫我大帅哥2 小时前
在Swarm中部署Nacos并配置外部MySQL
后端
想摆烂的不会研究的研究生9 小时前
每日八股——Redis(1)
数据库·经验分享·redis·后端·缓存
毕设源码-郭学长9 小时前
【开题答辩全过程】以 基于SpringBoot技术的美妆销售系统为例,包含答辩的问题和答案
java·spring boot·后端
追逐时光者10 小时前
精选 10 款 .NET 开源免费、功能强大的 Windows 效率软件
后端·.net
追逐时光者10 小时前
一款开源、免费的 WPF 自定义控件集
后端·.net
S***q37710 小时前
Spring Boot管理用户数据
java·spring boot·后端
毕设源码-郭学长11 小时前
【开题答辩全过程】以 基于SpringBoot框架的民俗文化交流与交易平台的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
l***217811 小时前
SpringBoot Maven快速上手
spring boot·后端·maven
f***147711 小时前
SpringBoot实战:高效实现API限流策略
java·spring boot·后端