当前位置: 首页 > news >正文

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

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

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

http://www.dtcms.com/a/419460.html

相关文章:

  • 后端_本地缓存:零抖动的极速缓冲层
  • 【笔试强训Day02】1. ⽜⽜的快递(模拟)
  • 建设网站找哪家简洁页面心情网站
  • 广州站有高铁吗域名不变 网站改版
  • 防爬虫逆向日志爆炸,精简追踪不崩浏览器控制台
  • DevExpress WinForms v25.2新功能预览 - 即将升级富文本编辑器控件功能
  • C#知识学习-015(修饰符_4)
  • 有做分期海淘的网站吗苏州建设网站找网络公司
  • 全缓冲和行缓冲
  • 【C++语法】C++11——右值引用
  • 如何给网站做app平台网站建设 厦门
  • 鞍山网站建设工作室北京交易中心网站
  • 现代C++ Lambda表达式:最佳实践、深入理解和资源推荐
  • CUDA 内核中计算全局线程索引的标准方法
  • 刚做网站做多用户还是单用户企业建站的作用是什么
  • CUDA 13.0深度解析:统一ARM生态、UVM增强与GPU共享的革命
  • 佛山外贸网站建设咨询php网站上做微信支付功能
  • 公司网站中新闻中心怎样做优化网页设计图片怎么居中
  • 网站运营经验山东查询网站备案
  • 巴塘网站建设网站开发的论文课题
  • GuavaCache
  • 免费空间如何放网站搜索引擎优化培训免费咨询
  • LeetCode 53 最大子数字和(动态规划)
  • 如何为100Tops机器人“退烧”?世强芯片热管理方案,释放100%算力!
  • 【NodeJS】使用 NVM 安装 Node.js 22 并配置国内镜像加速
  • 边缘计算与AI:移动端设计软件的实时性能突破
  • 芜湖有没有网站建设公司吗wordpress邮件分析插件
  • 网上做外贸都有哪些网站组织架构及营销网络怎么填写
  • 网站建设费开票税收代码模板网站好还是自助建站好
  • 苏州网站建设数据网络wordpress添加广告插件