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

在Windows上进行Docker 部署速成指南(SpringBoot + Vue + MySQL + Redis)

适用场景:前后端分离项目,一键容器化部署,本地开发 / 测试环境通用。


零、前置下载

网上已经有很多教程了,这里楼主推荐一篇感觉讲的很详细的:Docker,ubuntu下载

一、整体架构

浏览器 → Nginx容器(80端口) → 静态页面 ↘ /api → SpringBoot容器(内部端口) → MySQL容器 ↘ Redis容器

核心流程

  • 所有容器加入同一个自定义网络,通过容器名互相访问,不用记 IP
  • 数据卷持久化,删容器不丢数据
  • Nginx 统一对外入口,托管前端 + 反向代理后端

二、前置准备

1. 创建自定义网络

dockernetwork create app-network

app-network:自定义网络名,这里建议自己设置

2. 创建项目目录结构

mkdir-p~/deploy/{mysql,redis,backend,frontend/dist}

注:这里建议在deploy/后加一层项目名文件夹,如果改的话下面的命令里地址也要注意多加一层

三、部署 MySQL

dockerrun-d\--namemysql\--networkapp-network\-p3307:3306\-v~/deploy/mysql:/var/lib/mysql\-eMYSQL_ROOT_PASSWORD=你的数据库密码\-eMYSQL_DATABASE=你的数据库名\-eTZ=Asia/Shanghai\mysql:8.0\--character-set-server=utf8mb4\--collation-server=utf8mb4_unicode_ci

注:3307是你的windows端口号,选一个不冲突的即可
导入 SQL 脚本

dockerexec-imysql mysql-uroot-p你的密码 你的库名<~/mnt/你的数据库文件绝对地址(全小写)

四、部署 Redis

dockerrun-d\--nameredis\--networkapp-network\-p6379:6379\-v~/deploy/redis:/data\-eTZ=Asia/Shanghai\redis:7\--appendonlyyes

后端配置对应:

spring:redis:host:redisport:6379

五、部署 SpringBoot 后端

1. 修改项目配置(重点)

数据库和 Redis 地址写容器名,不要写 localhost

spring:datasource:url:jdbc:mysql://mysql:3306/你的数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=falseusername:rootpassword:你的数据库密码redis:host:redisport:6379

2. 打包 Jar 包

mvn clean package-DskipTests

target/xxx.jar上传到~/deploy/backend/目录。

cp/mnt/你的jar包绝对位置(全小写) ~/deploy/backend/

3. 启动后端容器

dockerrun-d\--namebackend\--networkapp-network\-p8099:8080\-v~/deploy/backend:/app\-eTZ=Asia/Shanghai\eclipse-temurin:17-jdk-alpine\java-jar/app/你的jar包名.jar

JDK8 项目换成openjdk:8-jdk-slim

4. 关键注意

  • 端口映射格式:-p 宿主机端口:容器内部端口
  • 容器内部端口看启动日志:Tomcat started on port(s): xxxx
  • 容器间通信用容器名 + 内部端口,不用宿主机端口

5. 验证

dockerlogs-fbackend# 看到 Started xxxApplication 即为成功

六、部署 Vue 前端(Nginx)

如果你还没有下nginx,先运行:

dockerpull nginx


像图片这样就好辣
然后配置nginx:

nano~/deploy/你的项目名,之前没设置不管/frontend/nginx.conf

在打开的文件里粘贴:

server{listen80;server_name localhost;# Vue静态资源location /{root /usr/share/nginx/html;index index.html;try_files$uri$uri/ /index.html;}# 拦截/api请求,转发给后端容器location /api/{proxy_pass http://backend:8082/;proxy_set_header Host$host;proxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;}}

1. 修改前端接口地址

打开.env.production不要写死 IP+端口

VITE_BASE_URL=/api

Vue2 项目变量名一般是VUE_APP_BASE_API

2. 打包前端

npmrun build

dist目录所有文件上传到~/deploy/frontend/dist/

3. 创建 Nginx 配置

nano~/deploy/frontend/nginx.conf
server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://backend:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

Ctrl+o,回车保存
Ctrl+x退出

proxy_pass里的端口是后端容器内部端口,不是宿主机端口。

4. 启动 Nginx 容器

dockerrun-d\--namefrontend\--networkapp-network\-p80:80\-v~/deploy/frontend/dist:/usr/share/nginx/html\-v~/deploy/frontend/nginx.conf:/etc/nginx/conf.d/default.conf\-eTZ=Asia/Shanghai\nginx

七、常用运维命令

# 查看状态dockerpsdockerps-a# 查看日志dockerlogs 容器名dockerlogs-f容器名dockerlogs--tail200容器名# 启停重启dockerstart 容器名dockerstop 容器名dockerrestart 容器名dockerrm-f容器名# 进入容器dockerexec-it容器名sh# 整套服务一键启停dockerstop mysql redis backend frontenddockerstart mysql redis backend frontend

八、常见问题排查

1. 后端连接重置(Connection reset)

  1. 看容器是否运行:docker ps
  2. 看启动日志:docker logs backend
  3. 确认内部端口:日志里Tomcat started on port(s): xxxx
  4. 端口映射是否匹配

2. 数据库连接失败

  • MySQL 容器是否启动
  • 地址是否写的容器名mysql:3306(不是 localhost)
  • 两个容器是否在同一个 network

3. 前端页面能打开但接口报错

  • 前端打包环境变量是否是/api
  • Nginxproxy_pass地址端口是否正确
  • 后端容器是否正常运行

4. WSL2 端口映射异常

Windows PowerShell 执行:

wsl--shutdown

5. JDK 版本不兼容

  • JDK8 →openjdk:8-jdk-slim
  • JDK17 →eclipse-temurin:17-jdk-alpine

九、部署 Checklist

  • 创建自定义 Docker 网络
  • MySQL 容器启动正常
  • Redis 容器启动正常
  • 后端配置数据库/Redis 地址改为容器名
  • 后端 Jar 包打包上传
  • 后端容器启动成功,日志无报错
  • 前端生产环境接口地址改为/api
  • 前端打包 dist 上传
  • Nginx 配置反向代理地址正确
  • 浏览器访问页面 + 接口均正常
http://www.jsqmd.com/news/1079139/

相关文章:

  • AI新闻发布:出海品牌构建长期传播资产的内容路径
  • 2026 年高效的 ai 做网站系统有哪些,新手建站工具整理
  • “中标公示”与“合同公告”同日发布,真的违法吗?
  • 从信息收集到权限提升:一次完整的Linux服务器渗透测试实战复盘
  • Rademacher公式在pod2(n)精确计算中的应用与实现
  • 057、Zephyr RTOS内核基础:工作队列与延迟工作
  • 2026 长期命理趋势怎么分析?玄易AI工具测评
  • 跨境电商进入中东:客服做不好,你连第一单都接不到
  • LLaMA Factory:100+大模型统一微调平台
  • 我想认真做一件小事:让孩子和家长更好地互动
  • 布局谷歌GEO前,值得了解的几点思路
  • 浏览器页面渲染流程
  • 文档下载终极解决方案:如何绕过30+平台限制获取任意可见内容
  • Obsidian Excel转Markdown表格插件:3分钟解决表格粘贴难题
  • 人工智能参与工业化精密加工的物理效率
  • 自我介绍与未来展望
  • 区域PACS源码,java云PACS源码,影像归档系统源码,自主产品,适合二开
  • 2026 年广州网站开发公司前十,综合实力榜单出炉
  • HarmonyOS技术精讲-UI开发调试调优:内存泄漏与组件复用实战
  • 33-静态源码入库与异步落库:为什么静态结构要先缓存再落仓
  • Webug4.0文件上传漏洞实战:从JS绕过到.htaccess攻击全解析
  • 国产信创环境Codex适配实战指南
  • VS Code + Continue 接入 Claude API 完整配置教程(含排障)
  • 2026年GEO优化系统源码实战指南:格子GEO如何提升网站收录与排名?
  • JMeter代理服务器配置与脚本录制实战指南
  • 网络安全深度预警实战推演:从漏洞爆发到纵深防御体系构建
  • SQL创建表简单示例:手把手教你写出第一行CREATE TABLE代码
  • 卡梅德生物技术快报|人源 scFv 抗体蛋白噬菌体文库搭建全流程实操与数据复盘
  • 玄通数据,专业用户行为数据分析 SaaS 系统正式入驻企业应用市场
  • 线弹性有限元计算机床自重,并添加切削力负载