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

CADS系统 Docker+K8s 完整部署实战教程

一、项目环境说明

本教程基于Windows开发机 + Linux K8s虚拟机架构,实现CADS前后端项目容器化部署,适配企业级轻量化容器部署场景。

环境架构

  • 开发环境:Windows

  • 部署环境:Linux虚拟机(Kubernetes集群)

  • 数据库:Windows宿主机 MySQL(192.168.86.1:3306)

  • 容器技术:Docker、Nginx

  • 编排工具:Kubernetes

项目结构

  • cads-backend:SpringBoot后端项目

  • cads-frontend:Vue/静态页面前端项目

二、部署前置准备(Windows端)

1. 环境依赖安装

提前安装并配置环境变量:JDK22、Maven3.6+、Node.js20+、Docker Desktop

2. 前端项目编译构建

进入前端项目目录,打包生成静态资源文件

cd C:\cad-system\cads\cads-frontend npm run build

作用:生成dist目录,包含编译完成的HTML、JS、CSS静态文件,为Nginx部署提供资源。

3. 后端项目Maven打包

进入后端项目目录,清理并打包Jar包

cd C:\cad-system\cads\cads-backend mvn clean package

作用:清理旧编译文件,编译生成可执行文件cads-backend-1.0.0.jar,用于后端容器镜像构建。

三、Docker镜像构建与推送(Windows端)

前后端均采用Docker容器化打包,构建标准化镜像,推送至镜像仓库供K8s集群拉取部署。

1. 后端镜像构建

(1)后端Dockerfile

路径:cads-backend/Dockerfile

FROM openjdk:22-jre-slim WORKDIR /app COPY cads-backend-1.0.0.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
(2)构建&推送命令
cd C:\cad-system\cads\cads-backend docker build -t 项目镜像仓库/cads:v1 . docker push 项目镜像仓库/cads:v1

2. 前端镜像构建(Nginx多阶段构建)

(1)前端Dockerfile

路径:cads-frontend/Dockerfile,采用多阶段构建,精简镜像体积

FROM node:20-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build ​ FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/templates/default.conf.template EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
(2)前端Nginx核心配置

路径:cads-frontend/nginx.conf,处理前端路由转发、后端API反向代理

server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html; ​ # 前端路由适配(解决SPA刷新404) location / { try_files $uri $uri/ /index.html; } ​ # 后端API反向代理 location /cads/api/ { proxy_pass http://cads:8080; 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; } }
(3)构建&推送命令
cd C:\cad-system\cads\cads-frontend docker build -t 项目镜像仓库/cads-frontend:v1 . docker push 项目镜像仓库/cads-frontend:v1

四、Kubernetes集群部署(Linux虚拟机端)

所有操作均在K8s集群节点执行,依次部署后端、前端服务,配置端口映射、数据库环境变量与网络策略。

1. 后端服务部署

(1)创建Deployment工作负载
kubectl create deployment cads --image=项目镜像仓库/cads:v1
(2)创建NodePort类型Service(外部访问)
kubectl expose deployment cads --type=NodePort --port=8080 --target-port=8080 --name=cads
(3)配置数据库连接环境变量
# 数据库连接地址、账号密码 kubectl set env deployment/cads SPRING_DATASOURCE_URL="jdbc:mysql://192.168.86.1:3306/cads_db?useSSL=false&allowPublicKeyRetrieval=true" kubectl set env deployment/cads SPRING_DATASOURCE_USERNAME=root kubectl set env deployment/cads SPRING_DATASOURCE_PASSWORD=123456
(4)解决宿主机数据库网络访问问题

开启Pod主机网络,规避Calico网络隔离导致的数据库连接超时、拒绝连接问题

kubectl patch deployment cads -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'

2. 前端服务部署

(1)创建Deployment工作负载
kubectl create deployment cads-front --image=项目镜像仓库/cads-frontend:v1
(2)创建前端Service并修复端口映射

核心问题:容器监听端口与Service映射端口不匹配,需统一端口配置

# 创建基础Service kubectl expose deployment cads-front --type=NodePort --port=80 --target-port=80 --name=cads-front ​ # 一键修复端口映射(适配容器监听端口) kubectl patch svc cads-front -p '{"spec":{"ports":[{"port":8080,"targetPort":80,"nodePort":32295}]}}'
(3)重启前端服务生效配置
kubectl rollout restart deployment cads-front

五、服务验证与访问测试

1. 查看集群服务与Pod状态

# 查看所有Service端口 kubectl get svc ​ # 查看Pod运行状态 kubectl get pods -o wide ​ # 查看端点关联状态(验证端口映射) kubectl get endpoints

2. 本地访问地址

  • 前端页面:http://192.168.86.130:32295/

  • 后端API接口:http://192.168.86.130:31617/cads/api/

  • 后端容器直连地址:http://192.168.86.130:8080/cads/api/

3. 网络连通性测试

# 虚拟机内部测试 curl http://192.168.86.130:32295/ curl http://192.168.86.130:31617/cads/api/ ​ # 端口连通性检测 nc -zv 192.168.86.130 32295

六、核心问题报错排查与解决方案

1. 数据库连接异常

报错信息:Communications link failure、Connection refused、Connect timed out

根因:K8s Calico网络隔离,Pod无法访问Windows宿主机MySQL服务

解决方案:开启Pod主机网络模式

kubectl patch deployment cads -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'

2. Nginx代理异常(502/404)

报错信息:502 Bad Gateway、404 Not Found

根因:Nginx反向代理路径拼接错误、后端服务域名无法解析

解决方案:固定代理地址,修正Nginx配置

# 进入Pod修改配置并重启Nginx kubectl exec -it [前端Pod名称] -- sed -i 's|错误代理路径|proxy_pass http://cads:8080;|' /etc/nginx/conf.d/default.conf kubectl exec -it [前端Pod名称] -- nginx -s reload

3. Service端口映射不匹配

报错信息:Empty reply from server、Connection refused

根因:Service targetPort 与容器实际监听端口不一致

解决方案:通过patch命令一键修正端口映射

kubectl patch svc cads-front -p '{"spec":{"ports":[{"port":8080,"targetPort":80,"nodePort":32295}]}}'

4. Pod CrashLoopBackOff崩溃重启

根因:数据库配置错误、端口冲突、配置文件异常

排错方案:优先查看日志定位问题,修复后重启服务

# 查看Pod运行日志 kubectl logs [Pod名称] --tail=100 ​ # 重启工作负载 kubectl rollout restart deployment cads kubectl rollout restart deployment cads-front

5. Docker镜像构建报错

报错信息:invalid reference format、no such file or directory

根因:镜像标签含非法字符、Dockerfile路径错误

解决方案:使用简洁合法镜像标签,确保构建目录存在Dockerfile

6. 网络代理超时错误

根因:Linux虚拟机残留无效代理配置,阻断网络请求

解决方案:清空所有代理环境变量

unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY unset all_proxy ALL_PROXY no_proxy NO_PROXY

七、K8s常用排查命令汇总

# 查看资源状态 kubectl get pods -o wide kubectl get svc kubectl get all ​ # 查看详细报错信息 kubectl describe pod [Pod名称] kubectl describe deployment [部署名称] ​ # 日志排查 kubectl logs [Pod名称] --tail=100 kubectl logs [Pod名称] --previous ​ # 进入Pod内部调试 kubectl exec -it [Pod名称] -- bash ​ # 重启/更新服务 kubectl rollout restart deployment [部署名称] kubectl set image deployment/[部署名称] [容器名]=[新镜像地址]

八、项目部署经验总结

  1. 网络优先级最高:容器访问宿主机服务优先开启hostNetwork,规避集群网络隔离问题,本项目80%连接报错均由网络隔离导致。

  2. 端口必须双向统一:容器监听端口、Service targetPort、NodePort 三者必须匹配,是外部访问服务的核心关键。

  3. Nginx配置标准化:前端SPA项目必须配置try_files解决刷新404问题,API代理禁止随意拼接后缀,避免路径404/502报错。

  4. 排错优先看日志:Pod崩溃、服务访问异常,优先通过kubectl logs定位根源,而非盲目重启服务。

  5. 镜像轻量化:前端采用多阶段构建,分离编译环境与运行环境,大幅缩减镜像体积,提升部署效率。

http://www.jsqmd.com/news/1285072/

相关文章:

  • 2026年7月十堰空调移机/十堰搬家正规公司推荐_十堰顺发搬家有限公司 - 品牌宣传支持者
  • 2026 年新消息:南靖口碑好的植草格加工厂格局重塑与选型新思路,踩破地砖的网红停车场,竟靠这玩意儿省出半万维护费?-梦航工程材料 - 鉴选官
  • 2026年7月广东会议音响设备/政企会议音响行业厂家推荐_广东得胜电声有限公司 - 品牌宣传支持者
  • GNURadio中USRP组件核心原理与实战配置指南
  • STM32与LTE Cat-1模块实现物联网全球连接方案
  • 2026年7月压力试验机/力学设备厂家优选推荐_山西晋仪科技有限公司 - 行业平台推荐
  • AI赋能智慧城市:3年验证的5类刚需场景落地公式(附可复用技术架构图)
  • C++/QT实现与MATLAB一致的短时傅里叶变换(STFT)时频分析
  • WinSock C++网络编程实战:从TCP/UDP基础到高性能服务器开发
  • AI如何革新学术写作:智能助手的技术架构与应用
  • 零基础用豆包AI、即梦和剪映,几分钟做出胖橘猫动画
  • 云原生弹性伸缩与混部技术实战解析
  • 配资平台规范发展持续推进核心内容公开
  • UniApp微信小程序分享功能全解析:从原理到实战避坑指南
  • 2026年7月耐高温不锈钢丝/化工设备专用耐腐蚀不锈钢丝公司精选推荐_泰州市凯威不锈钢制品有限公司 - 品牌宣传支持者
  • C++指针详解:从基础到智能指针实战
  • 安徽区域包装纸盒行业优质厂商分析分析报告,抽纸/食品打包盒/包装盒/手提袋/药店抽纸/商用纸巾,包装盒厂家哪家靠谱 - 品牌推荐师
  • Maixduino SD卡读取失败排查指南:从硬件连接到软件配置
  • Windows DNS缓存查看与管理:原理、命令与实战排查指南
  • 2026年7月青岛辣椒加工设备/辣椒振动筛公司推荐榜单_青岛鑫久辉食品机械有限公司 - 品牌宣传支持者
  • Python打包EXE后路径获取:原理、方案与跨平台实践
  • RTL8211千兆以太网PHY芯片硬件设计与软件调试实战指南
  • 口播新手必看:从设备到脚本搭建专业录制场景
  • 从聊天机器人到智能体的技术演进与实战开发
  • 2026年7月浙江冲边切边机/油压切边机厂家推荐精选_宁波北仑新台鸿机械制造有限公司 - 行业平台推荐
  • ssm298汽车租赁系统+jsp(文档+源码)_kaic
  • SpringBoot+Vue3实现制造业质量管理系统全栈开发
  • 模拟与高精度算法在竞赛编程中的核心应用
  • ESP32-S3 Arduino开发环境搭建全攻略:从零到点灯避坑指南
  • MyBatis动态SQL安全实践:${}与#{}的深度解析与SQL注入防御