You need to enable JavaScript to run this app. Docker环境下Laravel运行artisan migrate出现MongoDB连接超时问题
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下Laravel运行artisan migrate出现MongoDB连接超时问题

排查步骤
  • 确认网络配置一致性:Docker Compose下的主机名解析仅在同自定义桥接网络内生效。检查mongodb服务、artisan临时执行服务的networks配置,确认两者绑定到完全相同的网络。如果artisan服务未在compose文件中显式声明网络,会触发跨网络访问导致的主机名解析失败。
  • 验证解析连通性:执行docker-compose exec php nslookup mongodb,查询mongodb服务的内网解析结果。如果返回解析不存在的报错,即可确认是网络隔离问题。
  • 检查数据库连接参数:确认MongoDB连接的主机配置没有拼接端口,即DB_HOST=mongodb而非DB_HOST=mongodb:27017,避免将带端口的字符串作为主机名触发解析失败。
  • 检查服务启动就绪状态:docker-compose的depends_on配置仅能等待容器进程启动,无法等待MongoDB服务端口完全可用。临时run启动的artisan容器如果在MongoDB未完成初始化时就执行迁移,会触发连接超时。

之前调整端口、主机等配置无效的核心原因是,问题不属于应用层连接参数错误,而是容器网络层的主机名解析完全不通,应用层的配置调整对网络隔离场景无效果

可落地解决方案
  • 统一所有服务的网络配置:在docker-compose.yml根层级定义自定义桥接网络,为所有关联服务(mongodb、php、artisan、nginx)显式绑定同一网络,示例配置:
    # 根层级网络定义
    networks:
      laravel_bridge:
        driver: bridge
    
    services:
      mongodb:
        # 原有端口、镜像、卷配置
        networks:
          - laravel_bridge
      artisan:
        # 原有镜像、entrypoint配置
        networks:
          - laravel_bridge
    
  • 修正环境变量配置:确保.env文件中MongoDB连接参数配置为:
    DB_CONNECTION=mongodb
    DB_HOST=mongodb
    DB_PORT=27017
    DB_DATABASE=你的业务库名
    DB_USERNAME=你的数据库账号
    DB_PASSWORD=你的数据库密码
    
    禁止将端口值拼接到DB_HOST的配置项中。
  • 增加MongoDB服务健康检查:解决服务未就绪触发的连接超时问题,在mongodb服务配置中添加健康检查规则,示例:
    mongodb:
      # 原有配置
      healthcheck:
        test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet
        interval: 5s
        timeout: 5s
        retries: 5
    
    同步调整artisan服务的依赖触发条件,等待MongoDB服务完全就绪后再执行迁移命令:
    artisan:
      depends_on:
        mongodb:
          condition: service_healthy
    
  • 快速定位验证:如果需要快速确认问题原因,可进入php容器内部执行php artisan migrate,如果容器内执行无报错,即可100%确认是临时docker-compose run启动的artisan容器未加入对应网络导致的解析故障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 15:45:03