如何使用Docker在同服务器同端口独立部署两个Laravel应用?
同服务器同端口基于域名独立部署多Docker化Laravel应用方案
完全可以实现,核心是把公网入口层和业务应用层彻底拆分解耦,不需要把多个应用的代码塞进同一个Nginx容器,各应用可以做到完全独立,不干扰现有CI/CD流程。
核心架构逻辑
不要让单个业务的Nginx直接对外暴露80/443端口,单独部署一层无业务逻辑的公共反向代理网关作为唯一公网入口;每个Laravel应用独立维护自己的Nginx、PHP及配套依赖容器组,彼此资源、代码、配置完全隔离;反向代理根据请求携带的域名,把流量转发到对应应用的内部Nginx容器即可。
具体落地步骤
- 部署公共反向代理网关
选择Nginx或者Traefik作为网关都可以,这个网关本身不存放任何业务代码,只做流量转发。先创建一个共享的Docker桥接网络,比如命名为web-gateway,将网关容器接入这个网络,同时把网关容器的80、443端口映射到宿主机,作为唯一的对外访问入口。
以Nginx网关为例,只需要提前配置好按域名匹配的转发规则即可,参考配置如下:# 匹配第一个域名a.com,转发到1号应用的Nginx容器 server { listen 80; server_name a.com; location / { proxy_pass http://laravel1-nginx:80; 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; } } # 匹配第二个域名b.com,转发到2号应用的Nginx容器 server { listen 80; server_name b.com; location / { proxy_pass http://laravel2-nginx:80; 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; } } - 独立部署每个Laravel应用
每个应用单独维护自己的部署配置,和其他应用完全无关:每个应用有自己独立的Nginx容器、PHP容器、数据库/Redis等依赖容器,应用代码只需要构建或挂载到自己的Nginx、PHP容器内即可。
部署时只需要额外把当前应用的Nginx容器接入之前创建的公共web-gateway网络,不需要给应用Nginx映射任何公网端口。每个应用的CI/CD流程可以独立跑构建、发布、回滚,不需要修改其他应用或者网关的配置。
单应用的docker-compose配置参考片段:
第二个Laravel应用的部署结构完全一致,只需要把服务名改成services: # 服务名和网关转发规则里的域名对应即可 laravel1-nginx: image: 你的私有镜像仓库地址/laravel1-nginx:对应版本号 networks: - web-gateway - laravel1-private laravel1-php: image: 你的私有镜像仓库地址/laravel1-php:对应版本号 networks: - laravel1-private volumes: # 仅挂载当前应用的代码,和其他应用完全隔离 - ./app-code:/var/www/html networks: web-gateway: external: true # 应用私有网络,只给当前应用的内部容器通信用,不对外暴露 laravel1-private: internal: truelaravel2-nginx、替换成自己的代码和镜像即可,同样接入公共web-gateway网络。 - 连通性校验
Docker内置的DNS会自动解析共享网络内的容器服务名,网关收到请求后根据域名匹配规则,把流量转发到对应应用的Nginx容器,再由应用自身的Nginx把动态请求转发给自己的PHP容器处理,全程不同应用的资源完全隔离,不会产生耦合。
可选优化项
- 如果选择Traefik作为网关,连手动维护网关转发配置都不需要:每个应用在自己的compose配置里给Nginx容器加上对应域名的标签,Traefik会自动感知服务上下线、自动生成转发规则,新增应用时完全不需要操作网关,对多应用持续部署场景更友好。
- HTTPS证书、静态资源缓存、WAF等通用逻辑可以统一放在网关层处理,也可以每个应用单独配置,按需选择即可,不会强制产生依赖。
- 不同应用可以使用完全不同的PHP版本、Nginx配置、PHP扩展,不会出现版本冲突问题。
内容的提问来源于stack exchange,提问作者osama Abdullah
相关产品推荐
相关产品推荐

