从宝塔反向代理到 Docker 直连:新手进阶与企业架构思考

6 阅读5分钟

从宝塔反向代理到 Docker 直连:新手进阶与企业架构思考

(附多项目多域名场景下的 Docker 方案解析)


一、背景与现状

我之前一直用「Docker + 宝塔反向代理」部署项目:

  • Docker 容器跑在 8081 端口,项目本身运行正常(IP:8081 可访问)
  • 宝塔 Nginx 做反向代理,把域名请求转发到 127.0.0.1:8081
  • 一旦停掉宝塔 Nginx,域名就无法访问,本质是「公网入口」的桥断了

现在我想尝试进阶方案:让 Docker Nginx 直接监听 80 端口,摆脱对宝塔反向代理的依赖,同时也好奇:

  1. 这种方案下域名该如何绑定?
  2. 企业里真的会用「宝塔 → 反向代理 → Docker」这种多层架构吗?
  3. 如果一台服务器要跑多个项目、多个域名,直接解析 IP 的方式还够用吗?

二、核心认知:Docker 直连 80 端口的域名绑定逻辑

1. 单项目单域名:域名只需要解析 IP

当 Docker Nginx 映射端口为 80:80 时,它直接接管服务器的 80 端口(HTTP 默认端口),此时域名绑定不需要在 Docker 里做任何配置

  • 只需要把域名的 A 记录解析到服务器公网 IP
  • 浏览器访问域名时,默认请求 80 端口,流量直接进入 Docker Nginx,最终到达项目
  • 流程:用户 → 域名 → 服务器 80 端口 → Docker Nginx → 项目
  • 完全不需要宝塔、不需要反向代理,链路更短、更稳定
2. 企业真实架构:不会用宝塔反向代理

中大型企业的服务器几乎不会安装宝塔面板,也不会用「宝塔 → 反向代理 → Docker」的多层架构,原因很简单:

  • 多层架构 = 多故障点,任何一层出问题都会导致服务不可用
  • Docker 本身就是企业级环境标准化的解决方案,不需要宝塔辅助
  • 标准架构是:用户请求 → Docker Nginx → 项目,干净、高效、易维护

我之前用的「宝塔反向代理 + Docker」本质是新手过渡方案,适合从宝塔转 Docker 的学习阶段,而非生产环境。


三、关键疑问:多项目多域名场景下,Docker 该如何处理?

你问得非常关键:如果一台服务器要跑多个项目、绑定多个域名,直接解析 IP 的方式确实不够用,这时候需要靠「Docker Nginx 虚拟主机」来解决

1. 核心原理:Nginx 虚拟主机(Server Block)

Nginx 支持通过「虚拟主机」功能,在同一个 80/443 端口下,根据请求的域名,转发到不同的 Docker 服务或项目目录:

  • 多个域名 → 都解析到同一台服务器 IP
  • Docker Nginx 监听 80 端口,根据 server_name 匹配不同域名
  • 不同域名的请求,转发到对应的 Docker 容器或静态资源目录
2. 示例配置(Nginx 虚拟主机)

假设服务器要跑两个项目:

  • 项目 A:域名 project-a.com,对应 Docker 容器 project-a-nginx(内部端口 80)
  • 项目 B:域名 project-b.com,对应 Docker 容器 project-b-nginx(内部端口 80)

在 Docker Nginx 的配置文件中,添加两个 server 块:

nginx

# 项目 A:处理 project-a.com 请求
server {
    listen 80;
    server_name project-a.com;  # 匹配域名 A

    location / {
        proxy_pass http://project-a-nginx:80;  # 转发到项目 A 的 Docker 容器
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# 项目 B:处理 project-b.com 请求
server {
    listen 80;
    server_name project-b.com;  # 匹配域名 B

    location / {
        proxy_pass http://project-b-nginx:80;  # 转发到项目 B 的 Docker 容器
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
3. 多项目多域名的完整流程
  1. 所有域名(project-a.comproject-b.com)都解析到服务器公网 IP
  2. 启动多个 Docker 服务(每个项目一个 Nginx 容器),容器间通过 Docker 网络互通
  3. 主 Docker Nginx 监听 80 端口,加载上面的虚拟主机配置
  4. 用户访问不同域名时,Nginx 根据 server_name 自动转发到对应项目的容器
  5. 实现「一台服务器、多个项目、多个域名」同时运行,互不干扰

四、两种方案对比:新手过渡 vs 企业标准

表格

方案架构优点缺点适用场景
宝塔反向代理 + Docker域名 → 宝塔 Nginx → Docker上手简单、保留宝塔操作习惯多层架构、故障点多、依赖宝塔个人学习、新手过渡
Docker 直连 80 + 虚拟主机域名 → Docker Nginx → 各项目容器链路短、稳定、企业标准、支持多域名需要学习 Nginx 配置生产环境、企业开发

五、总结与后续学习建议

  1. 单项目场景:直接用 Docker 映射 80:80,域名解析到服务器 IP 即可,完全摆脱宝塔
  2. 多项目场景:通过 Docker Nginx 虚拟主机,实现多域名多项目共存,这是企业级开发的标准方案
  3. 认知升级:「宝塔反向代理」是过渡手段,Docker + Nginx 虚拟主机才是真正的生产级架构,也是后续学习的重点

六、后记

从依赖宝塔的「傻瓜式部署」,到理解 Docker 直连、虚拟主机的「工程化部署」,本质是从「会用工具」到「懂架构」的进阶。多项目多域名的场景看似复杂,核心就是 Nginx 虚拟主机的应用,掌握这一点,就能应对绝大多数企业级部署需求。