Docker 多应用统一网关部署架构
一、 架构背景
在单台服务器上使用 Docker 部署多个 Web 应用时,通常会遇到端口冲突的问题。由于主机的 80 和 443 端口只能被一个容器监听,若想部署新应用,传统做法通常有两种:
- 变更端口:让新应用使用其他端口(如
8081、8082),但这对用户极其不友好。 - 修改原应用配置:强行将新应用的路由写入原应用的 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 证书配置、全局日志收集、限流防火墙等工作全部收拢在网关层,避免了在每个应用中重复配置。
这套架构非常适合中小型企业在单台或少量服务器上,进行多项目、多环境的敏捷开发与生产部署。
