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


零、前置下载

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

一、整体架构

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

核心流程

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

二、前置准备

1. 创建自定义网络

docker network create app-network

app-network:自定义网络名,这里建议自己设置
在这里插入图片描述

2. 创建项目目录结构

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

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

三、部署 MySQL

docker run -d \
  --name mysql \
  --network app-network \
  -p 3307:3306 \
  -v ~/deploy/mysql:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=你的数据库密码 \
  -e MYSQL_DATABASE=你的数据库名 \
  -e TZ=Asia/Shanghai \
  mysql:8.0 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci

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

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

四、部署 Redis

docker run -d \
  --name redis \
  --network app-network \
  -p 6379:6379 \
  -v ~/deploy/redis:/data \
  -e TZ=Asia/Shanghai \
  redis:7 \
  --appendonly yes

后端配置对应:

spring:
  redis:
    host: redis
    port: 6379

五、部署 SpringBoot 后端

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

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

spring:
  datasource:
    url: jdbc:mysql://mysql:3306/你的数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
    username: root
    password: 你的数据库密码
  redis:
    host: redis
    port: 6379

2. 打包 Jar 包

mvn clean package -DskipTests

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

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

3. 启动后端容器

docker run -d \
  --name backend \
  --network app-network \
  -p 8099:8080 \
  -v ~/deploy/backend:/app \
  -e TZ=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. 验证

docker logs -f backend
# 看到 Started xxxApplication 即为成功

六、部署 Vue 前端(Nginx)

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

docker pull nginx

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

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

在打开的文件里粘贴:

server {
    listen 80;
    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. 打包前端

npm run 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 容器

docker run -d \
  --name frontend \
  --network app-network \
  -p 80:80 \
  -v ~/deploy/frontend/dist:/usr/share/nginx/html \
  -v ~/deploy/frontend/nginx.conf:/etc/nginx/conf.d/default.conf \
  -e TZ=Asia/Shanghai \
  nginx

七、常用运维命令

# 查看状态
docker ps
docker ps -a

# 查看日志
docker logs 容器名
docker logs -f 容器名
docker logs --tail 200 容器名

# 启停重启
docker start 容器名
docker stop 容器名
docker restart 容器名
docker rm -f 容器名

# 进入容器
docker exec -it 容器名 sh

# 整套服务一键启停
docker stop mysql redis backend frontend
docker start 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
  • Nginx proxy_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 配置反向代理地址正确
  • 浏览器访问页面 + 接口均正常

更多推荐