Docker部署SpringBoot+Vue+MySQL 📅 2026/7/1 14:36:39 TodoList Docker 部署文档适用环境阿里云 ECS全新服务器 Docker Compose架构Nginx(80) → 静态前端 /api代理 → Spring Boot(8080) → MySQL(3306)更新时间2026-06-30一、前置信息项目值部署目录/opt/todolist/MySQL 密码12345678数据库名todo_db后端端口8080内部前端端口80对外Java 版本17Spring Boot3.3.4二、ECS 环境初始化以下所有命令在 ECS 上以root身份执行。2.1 连接 ECSsshroot你的ECS公网IP2.2 安装 Docker# 官方一键脚本使用阿里云镜像加速curl-fsSLhttps://get.docker.com|bash-sdocker--mirrorAliyun# 启动并设置开机自启systemctlenabledockersystemctl startdocker# 验证版本docker--versiondockercompose version预期输出Docker 26.xDocker Compose v2.x2.3 配置 Docker 镜像加速可选但建议mkdir-p/etc/dockercat/etc/docker/daemon.jsonEOF { registry-mirrors: [ https://mirror.ccs.tencentyun.com, https://docker.m.daocloud.io ], log-driver: json-file, log-opts: { max-size: 50m, max-file: 3 } } EOFsystemctl daemon-reload systemctl restartdocker2.4 关闭防火墙/SELinuxECS 默认已关闭确认即可systemctl status firewalld# 应该是 inactivesestatus# 应该是 Disabled三、上传部署包方式一压缩上传推荐在本地 Windows 桌面打开终端进入部署文件夹后打包上传# 进入桌面部署文件夹cdC:/Users/ASUS/Desktop/TodoList-Deploy# 打包为 tar.gztar-czftodolist-deploy.tar.gz *# 上传到 ECSscptodolist-deploy.tar.gz rootECS公网IP:/opt/然后在ECS上解压mkdir-p/opt/todolistcd/opt/todolisttar-xzf/opt/todolist-deploy.tar.gzrm/opt/todolist-deploy.tar.gz方式二直接 scp 整个文件夹scp-rC:/Users/ASUS/Desktop/TodoList-Deploy/* rootECS公网IP:/opt/todolist/四、开始部署4.1 给脚本执行权限cd/opt/todolistchmodx deploy.sh4.2 构建并启动二选一自动部署./deploy.sh手动部署cd/opt/todolist# 1. 构建后端镜像dockercompose build# 2. 启动所有服务后台运行dockercompose up-d# 3. 查看启动状态dockercomposeps# 4. 查看日志CtrlC 退出dockercompose logs-f4.3 启动顺序说明MySQL 启动约15秒 ↓ 健康检查通过 后端启动约30秒-60秒首次需等 MySQL 建表 ↓ 容器启动 Nginx 启动 ↓ 全栈可用 ✅五、配置阿里云安全组关键步骤否则外网无法访问。登录 阿里云控制台进入ECS → 实例 → 点击你的实例 → 安全组点击配置规则 → 入方向 → 手动添加优先级协议类型端口范围授权对象说明1TCP800.0.0.0/0HTTP 前端页面1TCP220.0.0.0/0SSH 远程管理⚠️不要开放3306、8080、8081这些端口仅在 Docker 内网通信。六、验证部署6.1 浏览器访问http://ECS公网IP应能看到 TodoList 登录/注册页面。6.2 命令行测试 API# 测试 Nginx 可达curlhttp://localhost/# 测试 API 代理curlhttp://localhost/api/dict/priorities# 预期返回 JSON 格式的优先级字典6.3 检查容器状态dockercomposeps预期输出 3 个容器均为Up或Up (healthy)容器名状态todo-mysqlUp (healthy)todo-backendUp (healthy)todo-nginxUp6.4 检查后端日志dockercompose logs backend|tail-50看到Started TodoBackendApplication in X.XXX seconds即启动成功。七、文件结构/opt/todolist/ ├── deploy.sh # 一键部署脚本 ├── docker-compose.yml # 服务编排配置 ├── Dockerfile.backend # 后端镜像构建文件 ├── .dockerignore # 构建排除 ├── backend/ │ └── target/ │ └── todo-backend.jar # Spring Boot JAR29MB ├── frontend/ │ └── dist/ # Vue 前端构建产物 │ ├── index.html │ └── assets/ ├── nginx/ │ └── nginx.conf # Nginx 反向代理 静态文件配置 └── mysql/ └── init/ └── 01-init.sql # 数据库建表 预置字典数据八、常用运维命令# 查看所有容器状态dockercomposeps# 查看实时日志dockercompose logs-f# 只查看某个服务日志dockercompose logs-fbackenddockercompose logs-fnginx# 重启某个服务dockercompose restart backend# 重新构建并启动代码更新后dockercompose up-d--build# 停止所有服务dockercompose down# 停止 删除数据库数据⚠️ 会清空所有用户数据dockercompose down-v# 进入容器调试dockercomposeexecbackendshdockercomposeexecmysql1 mysql-uroot-p12345678todo_db九、更新部署当本地代码修改后重新部署的流程# 1. 本地重新打包# 后端cd backend ./mvnw clean package -DskipTests# 前端cd frontend npm run build# 2. 上传更新文件scpbackend/target/todo-backend.jar rootIP:/opt/todolist/backend/target/scp-rfrontend/dist/* rootIP:/opt/todolist/frontend/dist/# 3. ECS 上重新构建后端 重启sshrootIPcd /opt/todolist docker compose up -d --build只改前端只需上传frontend/dist/Nginx 无需重启文件挂载实时生效。只改后端上传 JAR 后执行docker compose up -d --build backend。改了 nginx 配置上传nginx/nginx.conf后执行docker compose restart nginx。十、故障排查10.1 浏览器访问不了确认安全组80 端口是否已开放入方向确认服务运行中docker compose ps查看状态确认 Nginx 监听docker compose exec nginx netstat -tlnp | grep 8010.2 后端启动失败# 查看详细日志dockercompose logs backend# 常见原因# 1. MySQL 还没就绪 → 等 MySQL healty 后 docker compose restart backend# 2. 数据库表不存在 → 检查 mysql/init/01-init.sql 是否正确执行# 3. 端口被占用 → lsof -i :808010.3 MySQL 连接失败# 进入 MySQL 检查dockercomposeexecmysql1 mysql-uroot-p12345678# 查看数据库SHOW DATABASES;USE todo_db;SHOW TABLES;10.4 API 返回 502# 检查后端是否在运行dockercomposepsbackend# 检查 Nginx 能否连通后端dockercomposeexecnginxwget-qO- http://backend:8080/api/actuator/health21||echo后端不可达10.5 端口冲突如果 ECS 上已有 Nginx/Apache 占用 80 端口# 查看是谁占用lsof-i:80# 如果不需要就停掉systemctl stop nginx# 或 httpd / apache2systemctl disable nginx十一、安全加固建议修改 JWT 密钥生成随机密钥替换docker-compose.yml中的JWT_SECRETopenssl rand -base64 32更换 API Key将AI_DEEPSEEK_API_KEY换成你自己的 DeepSeek Key修改 MySQL 密码使用强密码同步修改MYSQL_ROOT_PASSWORD和SPRING_DATASOURCE_PASSWORD配置 HTTPS使用acme.sh 阿里云 DNS API 申请免费 SSL 证书最小化安全组SSH 端口限制只允许你的 IP 访问Spring Boot 生产模式确认app.debug: falseTOC