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

Symfony 6(Docker Compose部署)数据库连接报错:无法解析mariadb_db主机

Docker Compose下Symfony 6数据库连接错误解决办法

我通过Docker Compose运行Symfony 6,在.env文件中配置了数据库连接地址:

DATABASE_URL="mysql://root:password@mariadb_db:3306/jwt-auth-app?serverVersion=mariadb-10.5.8"

容器外的数据库客户端可以正常连接数据库,所有容器服务也运行正常,但用Postman请求接口时出现以下错误:

An exception occurred in the driver: SQLSTATE[HY000] [2002]
php_network_getaddresses: getaddrinfo for mariadb_db failed: No such
host is known.

我的security.yaml配置如下:

# config/packages/security.yaml
security:
    enable_authenticator_manager: true
    # 用户密码哈希配置
    password_hashers:
        Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
    # 用户提供者配置
    providers:
        app_user_provider:
            entity:
                class: App\Entity\User
                property: email

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        login:
            pattern: ^/api/login
            stateless: true
            json_login:
                check_path: /api/login
                success_handler: lexik_jwt_authentication.handler.authentication_success
                failure_handler: lexik_jwt_authentication.handler.authentication_failure
        api:
            pattern: ^/api
            stateless: true
            entry_point: jwt
            jwt: ~

        main:
            lazy: true
            provider: app_user_provider

    # 访问控制规则
    access_control:
        - { path: ^/api/users, roles: IS_AUTHENTICATED_FULLY }
        - { path: ^/api/login, roles: PUBLIC_ACCESS }

错误原因及解决步骤

1. 检查Docker Compose网络配置

这个错误的核心是Symfony容器无法解析mariadb_db主机名,大概率是因为两个容器不在同一个Docker网络中。确保你的docker-compose.yml里Symfony服务和MariaDB服务加入了同一个自定义网络:

version: '3.8'
services:
  symfony_app: # 你的Symfony服务名称
    build: .
    ports:
      - "8000:80"
    networks:
      - app_network
    depends_on:
      - mariadb_db # 依赖MariaDB服务,确保启动顺序
  mariadb_db:
    image: mariadb:10.5.8
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: jwt-auth-app
    ports:
      - "3306:3306"
    networks:
      - app_network
networks:
  app_network:
    driver: bridge

Docker自定义网络内的容器可以通过服务名直接通信,默认桥接网络可能不支持服务名解析,所以必须用自定义网络。

2. 验证容器内的DATABASE_URL配置

进入Symfony容器,检查环境变量是否正确加载:

# 替换成你的Symfony容器名称
docker exec -it <symfony-container-name> /bin/bash
# 查看DATABASE_URL
echo $DATABASE_URL

如果输出和本地.env文件不一致,说明容器没有正确挂载.env文件,或者Docker Compose的environment字段覆盖了该配置。确保docker-compose.yml里Symfony服务挂载了.env:

symfony_app:
  # ...其他配置
  volumes:
    - .:/var/www/html # 挂载项目目录,确保.env被包含

3. 确认MariaDB服务名称匹配

确保docker-compose.yml里MariaDB的服务名完全等于DATABASE_URL中的主机名(mariadb_db),Docker服务名大小写敏感,不能有拼写错误。

4. 清除Symfony缓存

容器内的缓存可能保留了旧的连接配置,执行缓存清除命令:

# 开发环境
php bin/console cache:clear
# 生产环境
php bin/console cache:clear --env=prod

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:16:30