适用场景前后端分离项目一键容器化部署本地开发 / 测试环境通用。零、前置下载网上已经有很多教程了这里楼主推荐一篇感觉讲的很详细的Dockerubuntu下载一、整体架构浏览器 → Nginx容器80端口 → 静态页面 ↘ /api → SpringBoot容器内部端口 → MySQL容器 ↘ Redis容器核心流程所有容器加入同一个自定义网络通过容器名互相访问不用记 IP数据卷持久化删容器不丢数据Nginx 统一对外入口托管前端 反向代理后端二、前置准备1. 创建自定义网络dockernetwork create app-networkapp-network自定义网络名这里建议自己设置2. 创建项目目录结构mkdir-p~/deploy/{mysql,redis,backend,frontend/dist}注这里建议在deploy/后加一层项目名文件夹如果改的话下面的命令里地址也要注意多加一层三、部署 MySQLdockerrun-d\--namemysql\--networkapp-network\-p3307:3306\-v~/deploy/mysql:/var/lib/mysql\-eMYSQL_ROOT_PASSWORD你的数据库密码\-eMYSQL_DATABASE你的数据库名\-eTZAsia/Shanghai\mysql:8.0\--character-set-serverutf8mb4\--collation-serverutf8mb4_unicode_ci注3307是你的windows端口号选一个不冲突的即可导入 SQL 脚本dockerexec-imysql mysql-uroot-p你的密码 你的库名~/mnt/你的数据库文件绝对地址全小写四、部署 Redisdockerrun-d\--nameredis\--networkapp-network\-p6379:6379\-v~/deploy/redis:/data\-eTZAsia/Shanghai\redis:7\--appendonlyyes后端配置对应spring:redis:host:redisport:6379五、部署 SpringBoot 后端1. 修改项目配置重点数据库和 Redis 地址写容器名不要写 localhostspring:datasource:url:jdbc:mysql://mysql:3306/你的数据库名?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseusername:rootpassword:你的数据库密码redis:host:redisport:63792. 打包 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\-eTZAsia/Shanghai\eclipse-temurin:17-jdk-alpine\java-jar/app/你的jar包名.jarJDK8 项目换成openjdk:8-jdk-slim4. 关键注意端口映射格式-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/apiVue2 项目变量名一般是VUE_APP_BASE_API2. 打包前端npmrun build将dist目录所有文件上传到~/deploy/frontend/dist/。3. 创建 Nginx 配置nano~/deploy/frontend/nginx.confserver { 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; } }Ctrlo,回车保存Ctrlx退出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\-eTZAsia/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看容器是否运行docker ps看启动日志docker logs backend确认内部端口日志里Tomcat started on port(s): xxxx端口映射是否匹配2. 数据库连接失败MySQL 容器是否启动地址是否写的容器名mysql:3306不是 localhost两个容器是否在同一个 network3. 前端页面能打开但接口报错前端打包环境变量是否是/apiNginxproxy_pass地址端口是否正确后端容器是否正常运行4. WSL2 端口映射异常Windows PowerShell 执行wsl--shutdown5. JDK 版本不兼容JDK8 →openjdk:8-jdk-slimJDK17 →eclipse-temurin:17-jdk-alpine九、部署 Checklist创建自定义 Docker 网络MySQL 容器启动正常Redis 容器启动正常后端配置数据库/Redis 地址改为容器名后端 Jar 包打包上传后端容器启动成功日志无报错前端生产环境接口地址改为/api前端打包 dist 上传Nginx 配置反向代理地址正确浏览器访问页面 接口均正常
在Windows上进行Docker 部署速成指南(SpringBoot + Vue + MySQL + Redis)
发布时间:2026/6/26 4:19:03
适用场景前后端分离项目一键容器化部署本地开发 / 测试环境通用。零、前置下载网上已经有很多教程了这里楼主推荐一篇感觉讲的很详细的Dockerubuntu下载一、整体架构浏览器 → Nginx容器80端口 → 静态页面 ↘ /api → SpringBoot容器内部端口 → MySQL容器 ↘ Redis容器核心流程所有容器加入同一个自定义网络通过容器名互相访问不用记 IP数据卷持久化删容器不丢数据Nginx 统一对外入口托管前端 反向代理后端二、前置准备1. 创建自定义网络dockernetwork create app-networkapp-network自定义网络名这里建议自己设置2. 创建项目目录结构mkdir-p~/deploy/{mysql,redis,backend,frontend/dist}注这里建议在deploy/后加一层项目名文件夹如果改的话下面的命令里地址也要注意多加一层三、部署 MySQLdockerrun-d\--namemysql\--networkapp-network\-p3307:3306\-v~/deploy/mysql:/var/lib/mysql\-eMYSQL_ROOT_PASSWORD你的数据库密码\-eMYSQL_DATABASE你的数据库名\-eTZAsia/Shanghai\mysql:8.0\--character-set-serverutf8mb4\--collation-serverutf8mb4_unicode_ci注3307是你的windows端口号选一个不冲突的即可导入 SQL 脚本dockerexec-imysql mysql-uroot-p你的密码 你的库名~/mnt/你的数据库文件绝对地址全小写四、部署 Redisdockerrun-d\--nameredis\--networkapp-network\-p6379:6379\-v~/deploy/redis:/data\-eTZAsia/Shanghai\redis:7\--appendonlyyes后端配置对应spring:redis:host:redisport:6379五、部署 SpringBoot 后端1. 修改项目配置重点数据库和 Redis 地址写容器名不要写 localhostspring:datasource:url:jdbc:mysql://mysql:3306/你的数据库名?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseusername:rootpassword:你的数据库密码redis:host:redisport:63792. 打包 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\-eTZAsia/Shanghai\eclipse-temurin:17-jdk-alpine\java-jar/app/你的jar包名.jarJDK8 项目换成openjdk:8-jdk-slim4. 关键注意端口映射格式-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/apiVue2 项目变量名一般是VUE_APP_BASE_API2. 打包前端npmrun build将dist目录所有文件上传到~/deploy/frontend/dist/。3. 创建 Nginx 配置nano~/deploy/frontend/nginx.confserver { 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; } }Ctrlo,回车保存Ctrlx退出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\-eTZAsia/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看容器是否运行docker ps看启动日志docker logs backend确认内部端口日志里Tomcat started on port(s): xxxx端口映射是否匹配2. 数据库连接失败MySQL 容器是否启动地址是否写的容器名mysql:3306不是 localhost两个容器是否在同一个 network3. 前端页面能打开但接口报错前端打包环境变量是否是/apiNginxproxy_pass地址端口是否正确后端容器是否正常运行4. WSL2 端口映射异常Windows PowerShell 执行wsl--shutdown5. JDK 版本不兼容JDK8 →openjdk:8-jdk-slimJDK17 →eclipse-temurin:17-jdk-alpine九、部署 Checklist创建自定义 Docker 网络MySQL 容器启动正常Redis 容器启动正常后端配置数据库/Redis 地址改为容器名后端 Jar 包打包上传后端容器启动成功日志无报错前端生产环境接口地址改为/api前端打包 dist 上传Nginx 配置反向代理地址正确浏览器访问页面 接口均正常