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

如何正确连接Laravel Sail与MongoDB?解决连接超时问题

解决Laravel Sail与MongoDB连接超时问题

问题根源分析

出现Failed to resolve 'mongo'错误,核心原因是容器网络隔离和认证配置不匹配:

  • MongoDB容器未加入Sail默认的sail网络,导致Laravel容器无法通过服务名mongo解析到MongoDB实例
  • Laravel的数据库配置未使用MongoDB容器初始化的root账号密码,认证逻辑不匹配
  • mongo-express的连接地址错误,无法正常连接MongoDB

修复步骤

1. 修正docker-compose.yml中MongoDB的网络与健康检查配置

给mongo和mongo-express服务添加sail网络,同时修正mongo-express的连接URL,并添加健康检查确保容器就绪:

mongo:
    image: mongo
    restart: always
    environment:
        MONGO_INITDB_ROOT_USERNAME: root
        MONGO_INITDB_ROOT_PASSWORD: example
    networks:
        - sail  # 加入sail网络,实现容器间通信
    healthcheck:
        test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
        interval: 5s
        timeout: 5s
        retries: 3

mongo-express:
    image: mongo-express
    restart: always
    ports:
        - 8081:8081
    environment:
        ME_CONFIG_MONGODB_ADMINUSERNAME: root
        ME_CONFIG_MONGODB_ADMINPASSWORD: example
        ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/  # 使用服务名mongo而非localhost
    networks:
        - sail  # 加入sail网络
    depends_on:
        mongo:
            condition: service_healthy  # 等待MongoDB容器就绪后启动

2. 更新Laravel环境变量配置

在.env文件中填入MongoDB容器初始化的root账号密码:

DB_CONNECTION=mongodb
DB_HOST=mongo
DB_PORT=27017
DB_DATABASE=example
DB_USERNAME=root  # 对应mongo容器的MONGO_INITDB_ROOT_USERNAME
DB_PASSWORD=example  # 对应mongo容器的MONGO_INITDB_ROOT_PASSWORD

3. 重启Sail容器

执行命令重建并重启所有容器:

sail down -v
sail up -d

4. 验证连接

执行迁移命令测试MongoDB连接是否正常:

sail artisan migrate

额外说明

  • Docker容器间通信必须处于同一网络,Sail默认使用sail网络,所有需要互相访问的服务都需加入该网络
  • 配置depends_on配合service_healthy可避免Laravel容器在MongoDB未完全启动时发起连接请求
  • 你的config/database.php中MongoDB的认证数据库配置已正确指向admin,无需修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:31:04