Docker 部署微服务项目详细步骤
Docker 部署微服务项目详细步骤
1. 项目结构准备
首先项目结构合理,建议如下:
xiaoxoj-backend-microservice-2.0/
├── docker/
│ ├── docker-compose.yml
│ └── nginx/
│ └── nginx.conf
├── xiaoxoj-backend-user-service/
│ ├── Dockerfile
│ └── ...
├── xiaoxoj-backend-question-service/
│ ├── Dockerfile
│ └── ...
├── xiaoxoj-backend-judge-service/
│ ├── Dockerfile
│ └── ...
└── xiaoxoj-backend-gateway/├── Dockerfile└── ...
2. 为每个服务创建 Dockerfile
通用 Spring Boot Dockerfile
在每个服务的根目录创建 Dockerfile
:
# 基础镜像
FROM openjdk:17-jdk-alpine# 维护者信息
LABEL maintainer="your-email@example.com"# 设置工作目录
WORKDIR /app# 复制jar包到容器中
COPY target/*.jar app.jar# 暴露端口
EXPOSE 8101# 设置JVM参数
ENV JAVA_OPTS="-Xmx512m -Xms256m"# 启动命令
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar"]
修改每个服务的 Dockerfile(根据实际端口)
例如用户服务的 Dockerfile:
FROM openjdk:17-jdk-alpine
WORKDIR /app
COPY target/xiaoxoj-backend-user-service-*.jar app.jar
EXPOSE 8101
ENTRYPOINT ["java", "-jar", "app.jar"]
3. 创建 Docker Compose 文件
在项目根目录创建 docker-compose.yml
:
version: '3.8'services:# MySQL 数据库mysql:image: mysql:8.0container_name: xiaoxoj-mysqlenvironment:MYSQL_ROOT_PASSWORD: rootpasswordMYSQL_DATABASE: xiaoxojMYSQL_USER: xiaoxojMYSQL_PASSWORD: xiaoxoj123ports:- "3306:3306"volumes:- mysql_data:/var/lib/mysqlnetworks:- xiaoxoj-networkrestart: unless-stopped# Redis 缓存redis:image: redis:7-alpinecontainer_name: xiaoxoj-redisports:- "6379:6379"volumes:- redis_data:/datanetworks:- xiaoxoj-networkrestart: unless-stopped# RabbitMQ 消息队列rabbitmq:image: rabbitmq:3-managementcontainer_name: xiaoxoj-rabbitmqenvironment:RABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: admin123ports:- "5672:5672"- "15672:15672"volumes:- rabbitmq_data:/var/lib/rabbitmqnetworks:- xiaoxoj-networkrestart: unless-stopped# Nacos 服务发现nacos:image: nacos/nacos-server:2.0.3container_name: xiaoxoj-nacosenvironment:MODE: standaloneSPRING_DATASOURCE_PLATFORM: mysqlMYSQL_SERVICE_HOST: mysqlMYSQL_SERVICE_DB_NAME: nacosMYSQL_SERVICE_USER: rootMYSQL_SERVICE_PASSWORD: rootpasswordports:- "8848:8848"volumes:- nacos_data:/home/nacos/datadepends_on:- mysqlnetworks:- xiaoxoj-networkrestart: unless-stopped# 用户服务user-service:build:context: ./xiaoxoj-backend-user-servicedockerfile: Dockerfilecontainer_name: xiaoxoj-user-serviceenvironment:SPRING_PROFILES_ACTIVE: prodSPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/xiaoxoj?useUnicode=true&characterEncoding=utf-8&useSSL=falseSPRING_REDIS_HOST: redisports:- "8101:8101"depends_on:- mysql- redis- nacosnetworks:- xiaoxoj-networkrestart: unless-stopped# 题目服务question-service:build:context: ./xiaoxoj-backend-question-servicedockerfile: Dockerfilecontainer_name: xiaoxoj-question-serviceenvironment:SPRING_PROFILES_ACTIVE: prodSPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/xiaoxoj?useUnicode=true&characterEncoding=utf-8&useSSL=falseSPRING_REDIS_HOST: redisSPRING_RABBITMQ_HOST: rabbitmqports:- "8104:8104"depends_on:- mysql- redis- rabbitmq- nacosnetworks:- xiaoxoj-networkrestart: unless-stopped# 判题服务judge-service:build:context: ./xiaoxoj-backend-judge-servicedockerfile: Dockerfilecontainer_name: xiaoxoj-judge-serviceenvironment:SPRING_PROFILES_ACTIVE: prodSPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848SPRING_RABBITMQ_HOST: rabbitmqports:- "8105:8105"depends_on:- rabbitmq- nacosnetworks:- xiaoxoj-networkrestart: unless-stopped# API 网关gateway:build:context: ./xiaoxoj-backend-gatewaydockerfile: Dockerfilecontainer_name: xiaoxoj-gatewayenvironment:SPRING_PROFILES_ACTIVE: prodSPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848ports:- "8100:8100"depends_on:- user-service- question-service- judge-service- nacosnetworks:- xiaoxoj-networkrestart: unless-stopped# Nginx 反向代理nginx:image: nginx:alpinecontainer_name: xiaoxoj-nginxports:- "80:80"- "443:443"volumes:- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf- ./docker/nginx/ssl:/etc/nginx/ssldepends_on:- gatewaynetworks:- xiaoxoj-networkrestart: unless-stoppedvolumes:mysql_data:redis_data:rabbitmq_data:nacos_data:networks:xiaoxoj-network:driver: bridge
4. 创建 Nginx 配置
创建 docker/nginx/nginx.conf
:
worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;# 上游服务配置upstream gateway {server gateway:8100;}server {listen 80;server_name localhost;# 静态资源location / {root /usr/share/nginx/html;index index.html index.htm;}# API 路由location /api/ {proxy_pass http://gateway;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}# WebSocket 支持location /ws/ {proxy_pass http://gateway;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;}}
}
5. 修改应用配置
修改每个服务的 application-prod.yml
:
spring:datasource:url: jdbc:mysql://mysql:3306/xiaoxoj?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: rootpassworddriver-class-name: com.mysql.cj.jdbc.Driverredis:host: redisport: 6379database: 0rabbitmq:host: rabbitmqport: 5672username: adminpassword: admin123virtual-host: /cloud:nacos:discovery:server-addr: nacos:8848config:server-addr: nacos:8848file-extension: yaml
6. 构建和部署脚本
创建部署脚本 deploy.sh
:
#!/bin/bash# 构建脚本
echo "开始构建微服务项目..."# 构建各个服务
cd xiaoxoj-backend-user-service && mvn clean package -DskipTests
cd ../xiaoxoj-backend-question-service && mvn clean package -DskipTests
cd ../xiaoxoj-backend-judge-service && mvn clean package -DskipTests
cd ../xiaoxoj-backend-gateway && mvn clean package -DskipTestscd ..# 构建Docker镜像
echo "构建Docker镜像..."
docker-compose build# 启动服务
echo "启动服务..."
docker-compose up -decho "部署完成!"
7. 数据库初始化
创建数据库初始化脚本 init-database.sql
:
CREATE DATABASE IF NOT EXISTS xiaoxoj CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE IF NOT EXISTS nacos CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 创建用户并授权
CREATE USER 'xiaoxoj'@'%' IDENTIFIED BY 'xiaoxoj123';
GRANT ALL PRIVILEGES ON xiaoxoj.* TO 'xiaoxoj'@'%';
GRANT ALL PRIVILEGES ON nacos.* TO 'root'@'%';
FLUSH PRIVILEGES;
8. 部署操作步骤
步骤1:准备环境
# 安装 Docker 和 Docker Compose
sudo apt-get update
sudo apt-get install docker.io docker-compose# 克隆项目
git clone <your-repo-url>
cd xiaoxoj-backend-microservice-2.0
步骤2:修改配置
根据您的实际环境修改:
- Docker Compose 文件中的密码
- 应用配置文件中的数据库连接信息
- Nginx 配置中的域名和SSL证书
步骤3:构建和启动
# 给脚本执行权限
chmod +x deploy.sh# 执行部署
./deploy.sh# 或者手动执行
mvn clean package -DskipTests
docker-compose up -d --build
步骤4:检查服务状态
# 查看容器状态
docker-compose ps# 查看日志
docker-compose logs -f# 检查特定服务日志
docker-compose logs user-service
步骤5:验证部署
# 检查服务健康状态
curl http://localhost:8101/actuator/health
curl http://localhost:8104/actuator/health# 检查Nacos注册中心
curl http://localhost:8848/nacos/v1/ns/service/list
9. 常用管理命令
# 启动所有服务
docker-compose up -d# 停止所有服务
docker-compose down# 重启特定服务
docker-compose restart user-service# 查看实时日志
docker-compose logs -f question-service# 进入容器
docker-compose exec user-service sh# 缩放服务实例
docker-compose up -d --scale user-service=2
10. 生产环境优化建议
- 使用 .env 文件管理环境变量
- 配置日志轮转
- 设置资源限制
- 配置健康检查
- 使用 Docker Swarm 或 Kubernetes 进行集群部署
- 配置监控和告警
- 定期备份数据
这样就完成了微服务项目的 Docker 部署。根据自己的实际网络环境和配置,可能还需要调整一些参数。