Docker 反向代理部署方案

Docker 反向代理部署方案

完全贴合你的需求:用Docker的Nginx容器做反向代理 ,托管前端静态文件+转发后端接口,摒弃冗余的frontend独立容器,配置更简洁、生产环境更通用,全程基于/docker目录、后端8085端口,无Redis、适配你的现有MySQL。

核心逻辑

删除单独的frontend容器,用Nginx容器一站式实现

  1. 挂载前端打包的dist文件夹,直接托管前端静态页面;
  2. 配置反向代理规则,将前端的接口请求转发到后端8085端口;
  3. 所有服务通过Docker网络互通,无需暴露多余端口,更安全。

一、服务器目录结构(严格对应,一键创建)

全程基于/docker目录,可根据需求将docker-compose.yml放到/docker/ai-agent目录,执行以下命令一键创建所有目录,无需手动建:

|------------------------------------------------------------|
| Bash mkdir -p /docker/{ai-agent/backend,nginx/{html,conf}} |

最终目录结构(两种可选,均不影响部署):

可选结构1(原结构:docker-compose.yml在/docker目录)

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Plain Text /docker ├─ docker-compose.yml # 主配置(核心,管理后端+Nginx+MySQL+Portainer) ├─ 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核2G:

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Dockerfile FROM eclipse-temurin:17-jre-alpine WORKDIR /app # 复制后端jar包(本地打包后上传到该目录,任意名称均可) COPY *.jar app.jar # 限制JVM内存,避免占满服务器资源 ENTRYPOINT "java","-Xms256m","-Xmx512m","-jar","app.jar" |

2. Nginx反向代理配置( /docker/nginx/conf/ai-proxy.conf

手动新建该文件,核心实现「前端托管+接口转发」,已适配后端8085端口:

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Nginx server { listen 80; server_name _; # 匹配所有域名/公网IP,直接访问即可 # 托管前端静态页面(指向挂载的dist目录,Vue/React打包后直接放这里) location / { root /usr/share/nginx/html; index index.html index.htm; # 适配Vue/React的History路由模式,刷新页面不404 try_files uri uri/ /index.html; } # 反向代理后端接口:前端请求/api/* 自动转发到后端8085端口 location /api/ { # 利用Docker网络直接访问backend服务,无需写IP,自动互通 proxy_pass http://backend:8085/; # 保留客户端真实IP和请求头,避免后端获取不到IP proxy_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路径(适配目录位置),两种路径的配置分别如下,按需选择:

适配路径1:docker-compose.yml在/docker目录(原配置,无需修改)

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| YAML version: '3.8' # 统一Docker网络:所有服务互通(后端/Nginx/MySQL/Portainer) networks: app-network: driver: bridge services: # 1. 后端服务(你的SpringBoot项目,端口8085) backend: build: /docker/ai-agent/backend # 绝对路径,适配docker-compose在/docker目录 restart: always # 开机自启,故障自动重启 networks: - app-network # 加入统一网络 # 2核2G服务器专属资源限制,避免占满内存 mem_limit: 512m cpus: 0.5 # 无需暴露端口到宿主机(Nginx通过Docker网络访问,更安全) # ports: - "8085:8085" # 2. Nginx反向代理(核心:托管前端+转发接口,唯一暴露80端口) nginx: image: nginx:stable-alpine # 轻量版Nginx,省内存 container_name: nginx restart: always ports: - "80:80" # 唯一暴露的前端访问端口 volumes: - /docker/nginx/html:/usr/share/nginx/html # 挂载前端dist - /docker/nginx/conf:/etc/nginx/conf.d # 挂载反向代理配置 networks: - app-network # 资源限制 mem_limit: 256m cpus: 0.2 # 3. 你的现有MySQL(保留你的原配置,密码/挂载/版本不变) mysql: image: mysql:8.0.12 container_name: mysql restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: cyj652183 # 你的原密码,无需修改 TZ: Asia/Shanghai volumes: - /docker/mysql/conf:/etc/mysql/conf.d - /docker/mysql/data:/var/lib/mysql networks: - app-network # 资源限制,核心服务优先分配 mem_limit: 1024m cpus: 0.8 # 4. Portainer(Docker图形化管理,保留你的原配置,可选) portainer: image: portainer/portainer-ce:latest container_name: portainer restart: always ports: - "9000:9000" volumes: - /docker/portainer:/data - /var/run/docker.sock:/var/run/docker.sock networks: - app-network mem_limit: 256m cpus: 0.2 |

适配路径2:docker-compose.yml在/docker/ai-agent目录(你的需求,修改1处即可)

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| YAML version: '3.8' # 统一Docker网络:所有服务互通(后端/Nginx/MySQL/Portainer) networks: app-network: driver: bridge services: # 1. 后端服务(你的SpringBoot项目,端口8085) backend: build: ./backend # 关键修改:相对路径(./代表docker-compose.yml所在目录,即/docker/ai-agent) restart: always # 开机自启,故障自动重启 networks: - app-network # 加入统一网络 # 2核2G服务器专属资源限制,避免占满内存 mem_limit: 512m cpus: 0.5 # 无需暴露端口到宿主机(Nginx通过Docker网络访问,更安全) # ports: - "8085:8085" # 2. Nginx反向代理(核心:托管前端+转发接口,唯一暴露80端口) nginx: image: nginx:stable-alpine # 轻量版Nginx,省内存 container_name: nginx restart: always ports: - "80:80" # 唯一暴露的前端访问端口 volumes: - /docker/nginx/html:/usr/share/nginx/html # 挂载前端dist(仍用绝对路径,不受影响) - /docker/nginx/conf:/etc/nginx/conf.d # 挂载反向代理配置 networks: - app-network # 资源限制 mem_limit: 256m cpus: 0.2 # 3. 你的现有MySQL(保留你的原配置,密码/挂载/版本不变) mysql: image: mysql:8.0.12 container_name: mysql restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: cyj652183 # 你的原密码,无需修改 TZ: Asia/Shanghai volumes: - /docker/mysql/conf:/etc/mysql/conf.d - /docker/mysql/data:/var/lib/mysql networks: - app-network # 资源限制,核心服务优先分配 mem_limit: 1024m cpus: 0.8 # 4. Portainer(Docker图形化管理,保留你的原配置,可选) portainer: image: portainer/portainer-ce:latest container_name: portainer restart: always ports: - "9000:9000" volumes: - /docker/portainer:/data - /var/run/docker.sock:/var/run/docker.sock networks: - app-network mem_limit: 256m cpus: 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目录下:

|------------------------------------|
| Bash mvn clean package -DskipTests |

2. 前端打包(生成dist文件夹)

进入本地前端Vue/React项目根目录,执行npm命令,生成的dist文件夹在项目根目录下:

|----------------------------------------------------------------------|
| Bash # 先安装依赖(首次/依赖更新时执行) npm install # 生产打包(核心,生成dist) npm run build |

四、服务器文件上传(3步,精准对应)

将本地打包的文件上传到服务器对应目录,用Xshell/FTP/宝塔均可,分两种路径适配:

适配路径1:docker-compose.yml在/docker目录

  1. 后端target目录下的jar包 → 上传到 /docker/ai-agent/backend/;
  2. 前端项目根目录下的dist文件夹 → 完整上传到 /docker/nginx/html/(直接把dist里的所有文件拖进去,或保留dist文件夹均可);
  3. 确认Nginx配置文件ai-proxy.conf已在 /docker/nginx/conf/ 目录;
  4. 将docker-compose.yml上传到 /docker/ 目录。

适配路径2:docker-compose.yml在/docker/ai-agent目录

  1. 后端target目录下的jar包 → 上传到 /docker/ai-agent/backend/;
  2. 前端项目根目录下的dist文件夹 → 完整上传到 /docker/nginx/html/;
  3. 确认Nginx配置文件ai-proxy.conf已在 /docker/nginx/conf/ 目录;
  4. 将docker-compose.yml上传到 /docker/ai-agent/ 目录(与backend目录同级)。

五、后端配置唯一修改(必做,否则连不上MySQL)

打开你本地的后端application.properties,仅修改MySQL连接地址,其他配置完全不变,修改后重新打包jar包上传(关键!容器内不能用127.0.0.1):

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Properties # 原错误配置(容器内127.0.0.1指向自身,找不到MySQL) # spring.datasource.url=jdbc:mysql://127.0.0.1:3306/cc?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8 # 新正确配置(直接写MySQL容器名,Docker网络自动解析,无需查IP!) spring.datasource.url=jdbc:mysql://mysql:3306/cc?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8 |

超便捷优化

不用再查MySQL内网IP,直接写容器名mysql,Docker网络会自动做域名解析,重启MySQL后IP变了也不用改配置,一劳永逸!

六、一键启动/管理(按docker-compose.yml路径执行)

1. 启动所有服务(核心命令,分两种路径)

  • 路径1(docker-compose.yml在/docker目录):
    cd /docker
    docker-compose up -d
  • 路径2(docker-compose.yml在/docker/ai-agent目录):
    cd /docker/ai-agent
    docker-compose up -d

2. 常用管理命令(直接复制,路径对应即可)

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Bash # 查看所有服务运行状态(确认Up即为正常) docker-compose ps # 查看日志(排错用,按需查看) docker-compose logs -f # 查看所有服务日志 docker-compose logs -f nginx # 仅查看Nginx日志 docker-compose logs -f backend # 仅查看后端日志 # 重启单个服务(配置修改后用) docker-compose restart nginx docker-compose restart backend # 停止所有服务 docker-compose stop # 停止并删除容器(重新构建时用) docker-compose down |

七、项目访问(唯一端口80)

启动成功后,直接在浏览器访问你的阿里云服务器公网IP,无需加任何端口,Nginx会自动托管前端并转发接口:

|-----------------------------|
| Plain Text http://你的服务器公网IP |

  • 前端页面:直接加载/docker/nginx/html下的dist文件;
  • 后端接口:前端请求/api/xxx会自动转发到后端8085端口,无跨域、无端口暴露。

八、阿里云安全组(仅开放3个端口,最小权限)

前往阿里云服务器控制台→安全组→入方向规则,仅开放以下3个端口,其余端口全部关闭,更安全:

  1. 80/tcp:前端访问端口(唯一业务端口);
  2. 3306/tcp:MySQL端口(可选,仅本地/开发机访问,生产环境建议关闭);
  3. 9000/tcp:Portainer图形化管理端口(可选,仅自己访问)。

九、核心优势(贴合生产环境)

  1. 配置极简:删除冗余frontend容器,Nginx一站式搞定前端+代理,少一个容器少一份资源占用;
  2. 安全可控:后端仅通过Docker网络对内提供服务,不暴露外网端口,避免恶意请求;
  3. 维护便捷 :前端更新只需替换/docker/nginx/html下的dist文件,重启Nginx即可,无需重构容器;
  4. 资源适配:所有服务均做内存/CPU限制,完美适配2核2G阿里云服务器,不卡死;
  5. 无缝衔接:保留你所有现有配置(MySQL密码/Portainer/目录结构),无需重新配置原有服务;
  6. 目录灵活:docker-compose.yml可自由选择放到/docker或/docker/ai-agent目录,仅需简单修改路径即可适配。

十、常见排错(启动失败快速解决)

1. 前端访问404

  • 检查/docker/nginx/html下是否有前端dist文件,确认index.html存在;
  • 检查Nginx配置文件ai-proxy.conf是否在/docker/nginx/conf目录,重启Nginx:docker-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端口,无其他服务占用。
相关推荐
SelectDB12 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
曲幽19 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
武子康3 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn866 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker