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
:
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:
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
:
yaml
version: '3.8'
services:
# MySQL 数据库
mysql:
image: mysql:8.0
container_name: xiaoxoj-mysql
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: xiaoxoj
MYSQL_USER: xiaoxoj
MYSQL_PASSWORD: xiaoxoj123
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- xiaoxoj-network
restart: unless-stopped
# Redis 缓存
redis:
image: redis:7-alpine
container_name: xiaoxoj-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- xiaoxoj-network
restart: unless-stopped
# RabbitMQ 消息队列
rabbitmq:
image: rabbitmq:3-management
container_name: xiaoxoj-rabbitmq
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin123
ports:
- "5672:5672"
- "15672:15672"
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- xiaoxoj-network
restart: unless-stopped
# Nacos 服务发现
nacos:
image: nacos/nacos-server:2.0.3
container_name: xiaoxoj-nacos
environment:
MODE: standalone
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: mysql
MYSQL_SERVICE_DB_NAME: nacos
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: rootpassword
ports:
- "8848:8848"
volumes:
- nacos_data:/home/nacos/data
depends_on:
- mysql
networks:
- xiaoxoj-network
restart: unless-stopped
# 用户服务
user-service:
build:
context: ./xiaoxoj-backend-user-service
dockerfile: Dockerfile
container_name: xiaoxoj-user-service
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/xiaoxoj?useUnicode=true&characterEncoding=utf-8&useSSL=false
SPRING_REDIS_HOST: redis
ports:
- "8101:8101"
depends_on:
- mysql
- redis
- nacos
networks:
- xiaoxoj-network
restart: unless-stopped
# 题目服务
question-service:
build:
context: ./xiaoxoj-backend-question-service
dockerfile: Dockerfile
container_name: xiaoxoj-question-service
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/xiaoxoj?useUnicode=true&characterEncoding=utf-8&useSSL=false
SPRING_REDIS_HOST: redis
SPRING_RABBITMQ_HOST: rabbitmq
ports:
- "8104:8104"
depends_on:
- mysql
- redis
- rabbitmq
- nacos
networks:
- xiaoxoj-network
restart: unless-stopped
# 判题服务
judge-service:
build:
context: ./xiaoxoj-backend-judge-service
dockerfile: Dockerfile
container_name: xiaoxoj-judge-service
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848
SPRING_RABBITMQ_HOST: rabbitmq
ports:
- "8105:8105"
depends_on:
- rabbitmq
- nacos
networks:
- xiaoxoj-network
restart: unless-stopped
# API 网关
gateway:
build:
context: ./xiaoxoj-backend-gateway
dockerfile: Dockerfile
container_name: xiaoxoj-gateway
environment:
SPRING_PROFILES_ACTIVE: prod
SPRING_CLOUD_NACOS_SERVER-ADDR: nacos:8848
ports:
- "8100:8100"
depends_on:
- user-service
- question-service
- judge-service
- nacos
networks:
- xiaoxoj-network
restart: unless-stopped
# Nginx 反向代理
nginx:
image: nginx:alpine
container_name: xiaoxoj-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./docker/nginx/ssl:/etc/nginx/ssl
depends_on:
- gateway
networks:
- xiaoxoj-network
restart: unless-stopped
volumes:
mysql_data:
redis_data:
rabbitmq_data:
nacos_data:
networks:
xiaoxoj-network:
driver: bridge
4. 创建 Nginx 配置
创建 docker/nginx/nginx.conf
:
nginx
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
:
yaml
spring:
datasource:
url: jdbc:mysql://mysql:3306/xiaoxoj?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: rootpassword
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: redis
port: 6379
database: 0
rabbitmq:
host: rabbitmq
port: 5672
username: admin
password: admin123
virtual-host: /
cloud:
nacos:
discovery:
server-addr: nacos:8848
config:
server-addr: nacos:8848
file-extension: yaml
6. 构建和部署脚本
创建部署脚本 deploy.sh
:
bash
#!/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 -DskipTests
cd ..
# 构建Docker镜像
echo "构建Docker镜像..."
docker-compose build
# 启动服务
echo "启动服务..."
docker-compose up -d
echo "部署完成!"
7. 数据库初始化
创建数据库初始化脚本 init-database.sql
:
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:准备环境
bash
# 安装 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:构建和启动
bash
# 给脚本执行权限
chmod +x deploy.sh
# 执行部署
./deploy.sh
# 或者手动执行
mvn clean package -DskipTests
docker-compose up -d --build
步骤4:检查服务状态
bash
# 查看容器状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 检查特定服务日志
docker-compose logs user-service
步骤5:验证部署
bash
# 检查服务健康状态
curl http://localhost:8101/actuator/health
curl http://localhost:8104/actuator/health
# 检查Nacos注册中心
curl http://localhost:8848/nacos/v1/ns/service/list
9. 常用管理命令
bash
# 启动所有服务
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 部署。根据自己的实际网络环境和配置,可能还需要调整一些参数。