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
相关产品推荐
相关产品推荐

