You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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配置参考片段:
    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: true
    
    第二个Laravel应用的部署结构完全一致,只需要把服务名改成laravel2-nginx、替换成自己的代码和镜像即可,同样接入公共web-gateway网络。
  • 连通性校验
    Docker内置的DNS会自动解析共享网络内的容器服务名,网关收到请求后根据域名匹配规则,把流量转发到对应应用的Nginx容器,再由应用自身的Nginx把动态请求转发给自己的PHP容器处理,全程不同应用的资源完全隔离,不会产生耦合。

可选优化项

  • 如果选择Traefik作为网关,连手动维护网关转发配置都不需要:每个应用在自己的compose配置里给Nginx容器加上对应域名的标签,Traefik会自动感知服务上下线、自动生成转发规则,新增应用时完全不需要操作网关,对多应用持续部署场景更友好。
  • HTTPS证书、静态资源缓存、WAF等通用逻辑可以统一放在网关层处理,也可以每个应用单独配置,按需选择即可,不会强制产生依赖。
  • 不同应用可以使用完全不同的PHP版本、Nginx配置、PHP扩展,不会出现版本冲突问题。

内容的提问来源于stack exchange,提问作者osama Abdullah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:09:11