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

📅 2026/7/29 4:56:34 👁️ 阅读次数 📝 编程学习
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. 镜像轻量化:前端采用多阶段构建,分离编译环境与运行环境,大幅缩减镜像体积,提升部署效率。