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

Symfony 5.4+Doctrine+Docker为何需配置两个数据库连接?

问题原因

本质是Docker环境中宿主机与容器网络隔离导致的连接目标差异:

  • 连接串mysql://root:root@127.0.0.1:55000/...是给宿主机本地使用的:Ddev会把数据库容器的3306端口映射到宿主机的55000端口,所以你在自己电脑上用本地工具(如Navicat)或直接跑命令时,能通过这个地址访问到容器内的数据库。
  • 连接串mysql://root:root@db:3306/...是给容器内部的Symfony应用使用的:Docker内部容器之间通过专属网络通信,db是Ddev默认的数据库容器服务名,容器内部直接用这个服务名就能解析到数据库容器,且使用容器内部的3306端口。如果在容器内的Symfony用127.0.0.1,它会指向web容器自身,而非宿主机的数据库映射端口,自然会触发SQLSTATE[HY000] [2002]连接拒绝错误。

你遇到的“创建/插入用第一个连接”,应该是在宿主机本地执行的操作(比如手动用本地工具建库,或在宿主机跑doctrine命令),而“检索用第二个连接”是Symfony应用在容器内运行时的正常需求。

解决方案

1. 统一使用容器内部连接配置

把.env或.env.local里的DATABASE_URL固定为容器内部的连接串:

DATABASE_URL="mysql://root:root@db:3306/symfonyproject?serverVersion=mariadb-10.4.11&charset=utf8mb4"

2. 用Ddev命令在容器内执行数据库操作

如果需要执行建库、迁移等命令,不要在宿主机本地跑,而是用ddev exec让命令在web容器内部执行,自动使用内部连接配置:

# 创建数据库
ddev exec php bin/console doctrine:database:create
# 执行迁移
ddev exec php bin/console doctrine:migrations:migrate
# 生成实体
ddev exec php bin/console make:entity

3. 宿主机本地访问数据库的补充(可选)

如果一定要在宿主机本地用工具或命令访问数据库,无需修改DATABASE_URL,直接用127.0.0.1:55000的地址即可,这和容器内的配置互不冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:15:36