如何正确连接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
相关产品推荐
相关产品推荐

