当前位置: 首页 > news >正文

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端口,无其他服务占用。
http://www.jsqmd.com/news/565353/

相关文章:

  • Jetson Orin Nano Super之onnxruntime与TensorRT兼容性优化实战
  • 2026年分析来图定制防火风管品牌,鲁海暖通靠谱吗 - 工业品牌热点
  • 3大核心优势重构火箭设计流程:OpenRocket全栈技术指南
  • TradingAgents-CN:多智能体协作驱动的金融分析平台全攻略
  • 从CRAG到Plan-and-Execute:用LangGraph StateGraph重构你的RAG工作流,告别‘一次性’检索
  • LFM2.5-1.2B-Thinking-GGUF开源生态初探:与Ollama等工具的对比与集成
  • 工业机器人国产化率首次突破50%:埃斯顿、汇川技术如何逆袭四大家族?
  • 2026年防火风管专业厂家排名,正规厂家产品特色大揭秘 - 工业推荐榜
  • 缠论量化新纪元:chan.py框架的技术突破与实战应用
  • 告别单调旁白:用RT-Voice PRO为你的Unity游戏角色注入‘灵魂’(多音色/情绪/打断播放实战)
  • YOLO12案例集:不同光照条件下交通标志识别准确率实测报告
  • Mermaid Live Editor:代码驱动图表的可视化革命
  • Phi-3-mini-4k-instruct-gguf开源可部署:模型权重+Web服务+运维脚本一体化交付
  • 2026有专业健康管理服务退休俱乐部,保障老人健康费用多少 - myqiye
  • 快速部署MinerU镜像:开箱即用的PDF提取方案,告别繁琐配置
  • APK-Installer:Windows系统运行安卓应用的跨平台解决方案
  • 华沿机器人港股上市:市值100亿港元 超额认购逾5000倍
  • 解锁消息永恒:探索Windows平台微信QQ防撤回的终极方案
  • Hypack老版本升级到2024版实战教程:保留数据不丢失的完整步骤
  • Z-Image-Turbo-辉夜巫女惊艳效果:神社鸟居背景+巫女舞动姿态动态构图
  • 从Nginx到Redis:拆解Libevent的设计哲学,如何用它写出高性能网络服务
  • 佛山批发密胺餐具,贝莱恩密胺餐具作为靠谱厂家费用多少 - mypinpai
  • 低成本GPU部署方案:实时手机检测-通用在RTX3060上的实测性能报告
  • 蒲公英X1异地组网实战:手把手教你搭建家庭NAS远程访问(含手机/电脑双端配置)
  • PKSM宝可梦存档管理器:从第一世代到第八世代的终极存档管理方案
  • Ostrakon-VL-8B一键部署教程:基于Ubuntu的餐饮AI分析平台搭建
  • 3个实战场景解锁Trilium:从笔记工具到知识中枢的蜕变
  • OpCore-Simplify:从黑苹果配置三天到三小时的自动化革命
  • QT 基于qcustomplot实现热力图(四):动态数据流与交互优化实战
  • PaddleOCR-VL-WEB案例展示:109种语言OCR识别效果集锦