目录结构准备
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
这个配置方案提供了:
- 完整的数据持久化配置
- 服务间的网络通信
- 配置文件外部化管理
- 日志文件映射
- 服务依赖和启动顺序管理
- 水平扩展能力
根据你的具体需求调整资源配置、端口和版本号。