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服务配置中添加健康检查规则,示例:
同步调整artisan服务的依赖触发条件,等待MongoDB服务完全就绪后再执行迁移命令:mongodb: # 原有配置 healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet interval: 5s timeout: 5s retries: 5artisan: depends_on: mongodb: condition: service_healthy - 快速定位验证:如果需要快速确认问题原因,可进入php容器内部执行
php artisan migrate,如果容器内执行无报错,即可100%确认是临时docker-compose run启动的artisan容器未加入对应网络导致的解析故障。
内容的提问来源于stack exchange,提问作者paraplouis
相关产品推荐
相关产品推荐

