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端口,无其他服务占用。
相关推荐
小陈工2 小时前
Python Web开发入门(一):虚拟环境与依赖管理,从零搭建纯净开发环境
开发语言·前端·数据库·git·python·docker·开源
CDN3602 小时前
CDN 报错 403/502/504 怎么解决?源站与防护策略排查
运维·网络安全
国医中兴2 小时前
边缘计算中的存储挑战与解决方案
微服务·云原生·容器·kubernetes·k8s
重生的黑客2 小时前
Linux初识
linux·运维·服务器
李子焱2 小时前
第二节:n8n私有化部署全攻略(基于 Docker)
运维·docker·容器
evo-master2 小时前
linux环境准备和理解
linux·运维·服务器
Zhao136824553912 小时前
DP108B完全替代兼容进口的CM108B,USB 音频单芯片
linux·运维·音视频
云草桑2 小时前
Odoo 19.0 Docker Desktop快速部署 和Ubuntu24上安装1panel面板
运维·docker·容器·odoo
吉普赛的歌3 小时前
【服务器】IIS, http自动跳转https
运维·服务器