如何配置Docker Compose搭建Nginx+Lumen微服务API并实现公网隔离
docker-compose.yml 配置实现方案
核心实现逻辑
通过Docker网络隔离实现访问控制规则:
- 定义两类Docker网桥:对外接入网桥 用于API网关暴露公网端口,纯内部隔离网桥 用于微服务、数据库之间的内部通信,内部网络开启
internal: true属性,完全禁止公网访问 - API网关同时接入两类网络,既能接收公网请求,也能转发请求到内部微服务
- 所有Lumen微服务、数据库仅接入内部隔离网络,不映射任何端口到宿主机,公网无法直接访问
完整docker-compose.yml配置
version: '3.8' services: # Nginx API网关 nginx-gateway: image: nginx:1.25-alpine ports: - "80:80" - "443:443" volumes: # 挂载网关Nginx配置文件 - ./gateway/nginx/conf.d:/etc/nginx/conf.d # 挂载SSL证书 - ./gateway/ssl:/etc/nginx/ssl networks: - public-network - internal-network depends_on: - lumen-user-service - lumen-order-service restart: unless-stopped # Lumen用户微服务示例(其他微服务配置逻辑完全一致) lumen-user-service: build: ./services/user # 不需要配置ports端口映射,仅内部网络可访问 volumes: - ./services/user:/var/www/html networks: - internal-network depends_on: - mysql restart: unless-stopped # Lumen订单微服务示例 lumen-order-service: build: ./services/order volumes: - ./services/order:/var/www/html networks: - internal-network depends_on: - mysql restart: unless-stopped # MySQL数据库 mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: your_secure_root_password MYSQL_DATABASE: app_db MYSQL_USER: app_user MYSQL_PASSWORD: your_secure_user_password # 不需要配置ports端口映射,仅内部网络可访问 volumes: - mysql-data:/var/lib/mysql networks: - internal-network restart: unless-stopped # 数据卷配置,持久化数据库数据 volumes: mysql-data: # 网络配置 networks: # 对外网络,仅网关接入 public-network: driver: bridge # 内部隔离网络,所有微服务、数据库接入 internal-network: driver: bridge # 核心配置:标记为内部网络,禁止公网进出访问 internal: true
配置注意事项
- Nginx网关的反向代理配置直接使用微服务的服务名作为域名即可,Docker内置DNS会自动解析到对应容器的内部IP,示例配置:
proxy_pass http://lumen-user-service:9000; - 所有内部服务严禁添加
ports配置项,避免端口映射到宿主机导致公网可访问 - 微服务之间的内部调用也可直接通过内部网络的服务名调用,不需要绕API网关
内容的提问来源于stack exchange,提问作者Donny Akhmad Septa Utama
相关产品推荐
相关产品推荐

