Docker 反向代理部署方案完全贴合你的需求用Docker的Nginx容器做反向代理托管前端静态文件转发后端接口摒弃冗余的frontend独立容器配置更简洁、生产环境更通用全程基于/docker目录、后端8085端口无Redis、适配你的现有MySQL。核心逻辑删除单独的frontend容器用Nginx容器一站式实现挂载前端打包的dist文件夹直接托管前端静态页面配置反向代理规则将前端的接口请求转发到后端8085端口所有服务通过Docker网络互通无需暴露多余端口更安全。一、服务器目录结构严格对应一键创建全程基于/docker目录可根据需求将docker-compose.yml放到/docker/ai-agent目录执行以下命令一键创建所有目录无需手动建Bashmkdir -p /docker/{ai-agent/backend,nginx/{html,conf}}最终目录结构两种可选均不影响部署可选结构1原结构docker-compose.yml在/docker目录Plain Text/docker├─ docker-compose.yml # 主配置核心管理后端NginxMySQLPortainer├─ ai-agent/│ └─ backend/ # 后端目录│ ├─ Dockerfile # 后端构建文件│ └─ xxx.jar # 后端打包的jar包本地mvn package生成└─ nginx/ # Nginx反向代理目录├─ html/ # 存放前端dist打包文件└─ conf/ # 存放Nginx反向代理配置文件可选结构2你需求的结构docker-compose.yml在/docker/ai-agent目录Plain Text/docker├─ ai-agent/│ ├─ docker-compose.yml # 主配置放到ai-agent目录│ └─ backend/ # 后端目录│ ├─ Dockerfile # 后端构建文件│ └─ xxx.jar # 后端打包的jar包└─ nginx/ # Nginx反向代理目录├─ html/ # 存放前端dist打包文件└─ conf/ # 存放Nginx反向代理配置文件二、所有配置文件直接复制无冗余1. 后端Dockerfile/docker/ai-agent/backend/Dockerfile无后缀文件名就是Dockerfile轻量适配2核2GDockerfileFROM eclipse-temurin:17-jre-alpineWORKDIR /app# 复制后端jar包本地打包后上传到该目录任意名称均可COPY *.jar app.jar# 限制JVM内存避免占满服务器资源ENTRYPOINT [java,-Xms256m,-Xmx512m,-jar,app.jar]2. Nginx反向代理配置/docker/nginx/conf/ai-proxy.conf手动新建该文件核心实现「前端托管接口转发」已适配后端8085端口Nginxserver {listen 80;server_name _; # 匹配所有域名/公网IP直接访问即可# 托管前端静态页面指向挂载的dist目录Vue/React打包后直接放这里location / {root /usr/share/nginx/html;index index.html index.htm;# 适配Vue/React的History路由模式刷新页面不404try_files $uri $uri/ /index.html;}# 反向代理后端接口前端请求/api/* 自动转发到后端8085端口location /api/ {# 利用Docker网络直接访问backend服务无需写IP自动互通proxy_pass http://backend:8085/;# 保留客户端真实IP和请求头避免后端获取不到IPproxy_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. 主配置docker-compose.yml两种路径适配二选一核心说明docker-compose.yml可以放到/docker/ai-agent目录下仅需修改配置中的build路径适配目录位置两种路径的配置分别如下按需选择适配路径1docker-compose.yml在/docker目录原配置无需修改YAMLversion: 3.8# 统一Docker网络所有服务互通后端/Nginx/MySQL/Portainernetworks:app-network:driver: bridgeservices:# 1. 后端服务你的SpringBoot项目端口8085backend:build: /docker/ai-agent/backend # 绝对路径适配docker-compose在/docker目录restart: always # 开机自启故障自动重启networks:- app-network # 加入统一网络# 2核2G服务器专属资源限制避免占满内存mem_limit: 512mcpus: 0.5# 无需暴露端口到宿主机Nginx通过Docker网络访问更安全# ports: - 8085:8085# 2. Nginx反向代理核心托管前端转发接口唯一暴露80端口nginx:image: nginx:stable-alpine # 轻量版Nginx省内存container_name: nginxrestart: alwaysports:- 80:80 # 唯一暴露的前端访问端口volumes:- /docker/nginx/html:/usr/share/nginx/html # 挂载前端dist- /docker/nginx/conf:/etc/nginx/conf.d # 挂载反向代理配置networks:- app-network# 资源限制mem_limit: 256mcpus: 0.2# 3. 你的现有MySQL保留你的原配置密码/挂载/版本不变mysql:image: mysql:8.0.12container_name: mysqlrestart: alwaysports:- 3306:3306environment:MYSQL_ROOT_PASSWORD: cyj652183 # 你的原密码无需修改TZ: Asia/Shanghaivolumes:- /docker/mysql/conf:/etc/mysql/conf.d- /docker/mysql/data:/var/lib/mysqlnetworks:- app-network# 资源限制核心服务优先分配mem_limit: 1024mcpus: 0.8# 4. PortainerDocker图形化管理保留你的原配置可选portainer:image: portainer/portainer-ce:latestcontainer_name: portainerrestart: alwaysports:- 9000:9000volumes:- /docker/portainer:/data- /var/run/docker.sock:/var/run/docker.socknetworks:- app-networkmem_limit: 256mcpus: 0.2适配路径2docker-compose.yml在/docker/ai-agent目录你的需求修改1处即可YAMLversion: 3.8# 统一Docker网络所有服务互通后端/Nginx/MySQL/Portainernetworks:app-network:driver: bridgeservices:# 1. 后端服务你的SpringBoot项目端口8085backend:build: ./backend # 关键修改相对路径./代表docker-compose.yml所在目录即/docker/ai-agentrestart: always # 开机自启故障自动重启networks:- app-network # 加入统一网络# 2核2G服务器专属资源限制避免占满内存mem_limit: 512mcpus: 0.5# 无需暴露端口到宿主机Nginx通过Docker网络访问更安全# ports: - 8085:8085# 2. Nginx反向代理核心托管前端转发接口唯一暴露80端口nginx:image: nginx:stable-alpine # 轻量版Nginx省内存container_name: nginxrestart: alwaysports:- 80:80 # 唯一暴露的前端访问端口volumes:- /docker/nginx/html:/usr/share/nginx/html # 挂载前端dist仍用绝对路径不受影响- /docker/nginx/conf:/etc/nginx/conf.d # 挂载反向代理配置networks:- app-network# 资源限制mem_limit: 256mcpus: 0.2# 3. 你的现有MySQL保留你的原配置密码/挂载/版本不变mysql:image: mysql:8.0.12container_name: mysqlrestart: alwaysports:- 3306:3306environment:MYSQL_ROOT_PASSWORD: cyj652183 # 你的原密码无需修改TZ: Asia/Shanghaivolumes:- /docker/mysql/conf:/etc/mysql/conf.d- /docker/mysql/data:/var/lib/mysqlnetworks:- app-network# 资源限制核心服务优先分配mem_limit: 1024mcpus: 0.8# 4. PortainerDocker图形化管理保留你的原配置可选portainer:image: portainer/portainer-ce:latestcontainer_name: portainerrestart: alwaysports:- 9000:9000volumes:- /docker/portainer:/data- /var/run/docker.sock:/var/run/docker.socknetworks:- app-networkmem_limit: 256mcpus: 0.2关键优化点后端不暴露8085端口到宿主机仅通过Docker网络给Nginx访问避免外网直接访问后端更安全Nginx用alpine轻量版比原版省50%内存适配2核2G保留你所有现有服务MySQL/Portainer配置完全不变无缝衔接docker-compose.yml放到/docker/ai-agent目录时仅需将backend的build路径改为./backend相对路径其余配置完全不变。三、本地打包2步生成部署文件1. 后端打包生成jar包进入本地后端SpringBoot项目根目录执行Maven命令生成的jar包在target目录下Bashmvn clean package -DskipTests2. 前端打包生成dist文件夹进入本地前端Vue/React项目根目录执行npm命令生成的dist文件夹在项目根目录下Bash# 先安装依赖首次/依赖更新时执行npm install# 生产打包核心生成distnpm run build四、服务器文件上传3步精准对应将本地打包的文件上传到服务器对应目录用Xshell/FTP/宝塔均可分两种路径适配适配路径1docker-compose.yml在/docker目录后端target目录下的jar包→ 上传到/docker/ai-agent/backend/前端项目根目录下的dist文件夹→ 完整上传到/docker/nginx/html/直接把dist里的所有文件拖进去或保留dist文件夹均可确认Nginx配置文件ai-proxy.conf已在/docker/nginx/conf/目录将docker-compose.yml上传到/docker/目录。适配路径2docker-compose.yml在/docker/ai-agent目录后端target目录下的jar包→ 上传到/docker/ai-agent/backend/前端项目根目录下的dist文件夹→ 完整上传到/docker/nginx/html/确认Nginx配置文件ai-proxy.conf已在/docker/nginx/conf/目录将docker-compose.yml上传到/docker/ai-agent/目录与backend目录同级。五、后端配置唯一修改必做否则连不上MySQL打开你本地的后端application.properties仅修改MySQL连接地址其他配置完全不变修改后重新打包jar包上传关键容器内不能用127.0.0.1Properties# 原错误配置容器内127.0.0.1指向自身找不到MySQL# spring.datasource.urljdbc:mysql://127.0.0.1:3306/cc?serverTimezoneGMT%2b8useUnicodetruecharacterEncodingutf8# 新正确配置直接写MySQL容器名Docker网络自动解析无需查IPspring.datasource.urljdbc:mysql://mysql:3306/cc?serverTimezoneGMT%2b8useUnicodetruecharacterEncodingutf8超便捷优化不用再查MySQL内网IP直接写容器名mysqlDocker网络会自动做域名解析重启MySQL后IP变了也不用改配置一劳永逸六、一键启动/管理按docker-compose.yml路径执行1. 启动所有服务核心命令分两种路径路径1docker-compose.yml在/docker目录cd /dockerdocker-compose up -d路径2docker-compose.yml在/docker/ai-agent目录cd /docker/ai-agentdocker-compose up -d2. 常用管理命令直接复制路径对应即可Bash# 查看所有服务运行状态确认Up即为正常docker-compose ps# 查看日志排错用按需查看docker-compose logs -f # 查看所有服务日志docker-compose logs -f nginx # 仅查看Nginx日志docker-compose logs -f backend # 仅查看后端日志# 重启单个服务配置修改后用docker-compose restart nginxdocker-compose restart backend# 停止所有服务docker-compose stop# 停止并删除容器重新构建时用docker-compose down七、项目访问唯一端口80启动成功后直接在浏览器访问你的阿里云服务器公网IP无需加任何端口Nginx会自动托管前端并转发接口Plain Texthttp://你的服务器公网IP前端页面直接加载/docker/nginx/html下的dist文件后端接口前端请求/api/xxx会自动转发到后端8085端口无跨域、无端口暴露。八、阿里云安全组仅开放3个端口最小权限前往阿里云服务器控制台→安全组→入方向规则仅开放以下3个端口其余端口全部关闭更安全80/tcp前端访问端口唯一业务端口3306/tcpMySQL端口可选仅本地/开发机访问生产环境建议关闭9000/tcpPortainer图形化管理端口可选仅自己访问。九、核心优势贴合生产环境配置极简删除冗余frontend容器Nginx一站式搞定前端代理少一个容器少一份资源占用安全可控后端仅通过Docker网络对内提供服务不暴露外网端口避免恶意请求维护便捷前端更新只需替换/docker/nginx/html下的dist文件重启Nginx即可无需重构容器资源适配所有服务均做内存/CPU限制完美适配2核2G阿里云服务器不卡死无缝衔接保留你所有现有配置MySQL密码/Portainer/目录结构无需重新配置原有服务目录灵活docker-compose.yml可自由选择放到/docker或/docker/ai-agent目录仅需简单修改路径即可适配。十、常见排错启动失败快速解决1. 前端访问404检查/docker/nginx/html下是否有前端dist文件确认index.html存在检查Nginx配置文件ai-proxy.conf是否在/docker/nginx/conf目录重启Nginxdocker-compose restart nginx。2. 前端页面正常接口请求502/503检查后端jar包是否上传到/docker/ai-agent/backend目录检查后端是否启动docker-compose ps backend若未启动查看日志docker-compose logs -f backend确认后端配置中MySQL地址是mysql容器名不是127.0.0.1若docker-compose.yml在/docker/ai-agent目录检查backend的build路径是否为./backend避免路径错误导致后端无法构建。3. 后端启动失败日志报MySQL连接失败检查MySQL容器是否正常启动docker-compose ps mysql检查后端配置中的MySQL密码是否和docker-compose.yml中的一致cyj652183进入MySQL容器确认数据库cc存在账号root有访问权限。4. 端口占用若80端口被占用停止原有占用进程lsof -i:80 | grep -v grep | awk {print $2} | xargs kill -9确保你的docker-compose.yml中只有Nginx暴露80端口无其他服务占用。