Docker Swarm 部署SpringBoot微服务方案
作者:都叫我大帅哥
本文详细介绍使用Docker Swarm和Docker Compose部署SpringBoot微服务,涵盖MySQL、PostgreSQL、Redis等数据库配置,以及Nacos配置中心集成,通过完整的配置文件示例和部署步骤,帮助您快速实现服务编排、数据持久化和水平扩展,轻松管理微服务架构
目录结构准备
mkdir -p swarm-deploy
cd swarm-deploy
mkdir -p {mysql,postgres,redis,hugegraph,nacos,app}/{data,logs,conf}docker-compose.yml
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)
[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)
listen_addresses = '*' max_connections = 100 shared_buffers = 256MB logging_collector = on log_directory = '/var/log/postgresql'
3. Redis 配置文件 (redis/conf/redis.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)
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
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(如果尚未初始化)
# 在主节点上初始化 Swarm docker swarm init # 在工作节点上加入 Swarm docker swarm join --token <token> <manager-ip>:2377
2. 创建网络和卷(如果需要独立的数据卷)
# 创建 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 应用镜像
# 构建应用镜像 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. 部署应用栈
# 部署整个应用栈 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. 常用管理命令
# 扩展应用实例 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 文件 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 中引用:
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}部署时使用:
docker stack deploy --compose-file docker-compose.yml app-stack
监控和日志收集
建议添加监控服务:
# 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
这个配置方案提供了:
- 完整的数据持久化配置
- 服务间的网络通信
- 配置文件外部化管理
- 日志文件映射
- 服务依赖和启动顺序管理
- 水平扩展能力
根据你的具体需求调整资源配置、端口和版本号。
到此这篇关于Docker Swarm 部署方案使用小结的文章就介绍到这了,更多相关Docker Swarm 部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
