Skip to content
Docker多项目部署架构:一台服务器部署多个应用的实践方案
教程方案2026年7月10日
# 服务器 # Docker

Docker 多应用统一网关部署架构

一、 架构背景

在单台服务器上使用 Docker 部署多个 Web 应用时,通常会遇到端口冲突的问题。由于主机的 80443 端口只能被一个容器监听,若想部署新应用,传统做法通常有两种:

  1. 变更端口:让新应用使用其他端口(如 80818082),但这对用户极其不友好。
  2. 修改原应用配置:强行将新应用的路由写入原应用的 Nginx 配置文件中,但这破坏了应用之间的独立性与解耦原则

为了解决这一痛点,我们可以借鉴微服务(如 Spring Cloud Gateway)的网关思想:将 Nginx 从各个应用中抽离出来,作为统一的流量分发网关。 每个业务应用则保持完全独立,作为一个个“单体服务”运行。这种架构不仅完美解决了端口共用问题,还为后续的应用横向扩展奠定了基础。


二、 方案说明

2.1 目录结构推荐

为了兼顾“统一管理”与“解耦维护”,推荐采用以下目录结构。将统一网关与各子系统平铺在同级目录下,通过一个总的 docker-compose.yml 或各自独立的配置进行编排。

text
└─docker-env/
    ├─nginx/                    # 统一网关服务
    │  ├─conf.d/
    │  │  ├─system1.conf        # 应用 1 的路由配置
    │  │  └─system2.conf        # 应用 2 的路由配置
    │  └─nginx.conf
    ├─system-1/                 # 业务应用 1(如:前端+后端)
    │  └─... 
    ├─system-2/                 # 业务应用 2
    │  └─...
    └─docker-compose.yml        # 统一编排文件(或各目录下独立编排)

2.2 方案架构

本架构的核心在于构建一个统一的 Docker 内部网络(Network)。Nginx 网关与所有业务容器都加入到该网络中,网关通过容器名(Container Name)直接反向代理流量,而无需将业务容器的端口暴露给宿主机。

  • 流量入口:外部域名的 80/443 流量统一进入宿主机,由唯一暴露端口的 Nginx 网关容器接收。
  • 内部路由:Nginx 根据请求的域名(或 location 路径),通过 Docker 内部网络将请求转发给对应的业务容器。

2.3 示例配置

以下展示基于单个 docker-compose.yml 实现的高效部署示例:

yaml
version: '3.8'

networks:
  app-network:
    driver: bridge

services:
  # 统一 Nginx 网关
  gateway-nginx:
    image: nginx:stable-alpine
    container_name: gateway-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - app-network
    depends_on:
      - system-1-app
      - system-2-app

  # 业务应用 1
  system-1-app:
    image: node:18-alpine
    container_name: system-1-service
    # 注意:这里不需要显式 ports 映射到宿主机
    networks:
      - app-network

  # 业务应用 2
  system-2-app:
    image: openjdk:17-slim
    container_name: system-2-service
    networks:
      - app-network

网关反向代理配置示例 (nginx/conf.d/system1.conf)

nginx
server {
    listen 80;
    server_name system1.example.com; # 对应应用 1 的域名

    location / {
        # 直接使用 docker-compose 中定义的容器名与内部端口
        proxy_pass http://system-1-service:3000; 
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

三、 结论

通过将 Nginx 独立为统一网关层的架构设计,我们不仅优雅地解决了单机多应用共用 80/443 端口的问题,还带来了以下显著优势:

  • 高解耦性:新增或修改某个业务应用,只需在网关的 conf.d 下增加一个 .conf 文件并重启网关即可,完全不影响其他现有业务。
  • 高安全性:各业务容器无需向外暴露任何端口,所有外部流量必须经过网关清洗与分发,降低了整体系统的受攻击面。
  • 易维护性:SSL 证书配置、全局日志收集、限流防火墙等工作全部收拢在网关层,避免了在每个应用中重复配置。

这套架构非常适合中小型企业在单台或少量服务器上,进行多项目、多环境的敏捷开发与生产部署。


网站运行 ,站长活了: