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

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. 生产环境优化建议

  1. 使用 .env 文件管理环境变量
  2. 配置日志轮转
  3. 设置资源限制
  4. 配置健康检查
  5. 使用 Docker Swarm 或 Kubernetes 进行集群部署
  6. 配置监控和告警
  7. 定期备份数据

这样就完成了微服务项目的 Docker 部署。根据自己的实际网络环境和配置,可能还需要调整一些参数。

相关推荐
橄榄熊2 小时前
Docker MySQL 使用全流程
mysql·docker·容器
郑州光合科技余经理3 小时前
微服务架构:基于Spring Cloud ,构建同城生活服务平台
java·spring cloud·微服务·小程序·架构·uni-app
邂逅星河浪漫4 小时前
【DockerFile+Nginx+DockerCompose】前后端分离式项目部署(docker容器化方式)
nginx·docker·centos·部署·docker-compose·dockerfile·容器化部署
野熊佩骑4 小时前
CentOS二进制安装包方式部署K8S集群之系统初始化
运维·docker·微服务·云原生·容器·kubernetes·centos
小闫BI设源码4 小时前
Kubernetes 集群高可用
云原生·容器·kubernetes·滚动更新·operator模式·helm包管理·ci/cd集成
晨港飞燕4 小时前
Websocket+Redis实现微服务消息实时同步
redis·websocket·微服务
xuhe24 小时前
告别 LaTeX 配置地狱:我的 Overleaf (ShareLaTeX-CE) 完整版私有化部署方案
linux·docker·overleaf
柳贯一(逆流河版)5 小时前
Gateway 集成 JWT 身份认证:微服务统一认证的实战指南
微服务·架构·gateway
Shyllin7 小时前
Trino On K8S (DockerHub)
云原生·容器·kubernetes