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

Docker跨容器数据库连接失败:Laravel论坛无法访问网站数据库

解决Docker容器间Laravel跨数据库连接拒绝问题

核心问题分析

容器间无法通信大概率是网络隔离导致的,Docker默认每个容器如果不指定网桥,会用默认的bridge网桥,但如果你的两个容器是分开启动(比如两个独立docker-compose),可能不在同一网络;另外localhost/127.0.0.1在容器内仅指向自身,无法访问其他容器。

分步解决方法

  • 第一步:确认容器网络归属
    先查所有容器的网络模式:

    # 查看所有Docker网桥
    docker network ls
    # 查看主站数据库容器的网络
    docker inspect site-db | grep -A5 Networks
    # 查看论坛容器的网络
    docker inspect <论坛容器名> | grep -A5 Networks
    

    如果两个容器不在同一网桥,要么把论坛容器加入主站的网桥,要么新建一个共享网桥:

    # 新建共享网桥
    docker network create shared-network
    # 将主站数据库容器加入网桥
    docker network connect shared-network site-db
    # 将论坛容器加入网桥
    docker network connect shared-network <论坛容器名>
    
  • 第二步:正确配置.env参数
    加入同一网桥后,直接用容器名作为数据库主机,这是Docker最稳定的方式(IP可能随重启变化,容器名不会):

    SECOND_DB_CONNECTION=mysql
    SECOND_DB_HOST=site-db
    SECOND_DB_PORT=3306
    SECOND_DB_DATABASE=<主站数据库名>
    SECOND_DB_USERNAME=<主站数据库用户名>
    SECOND_DB_PASSWORD=<主站数据库密码>
    

    注意:绝对不要用localhost/127.0.0.1,容器内的localhost只指向自身容器,无法访问其他容器。

  • 第三步:排查数据库权限与配置
    就算网络通了,数据库可能限制了外部访问:

    1. 进入主站数据库容器,检查用户权限:
      docker exec -it site-db mysql -u root -p
      # 授予用户从任意IP访问的权限(替换成你的用户名和密码)
      GRANT ALL PRIVILEGES ON <主站数据库名>.* TO '<用户名>'@'%' IDENTIFIED BY '<密码>';
      FLUSH PRIVILEGES;
      
    2. 检查MySQL配置文件(比如/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),确认bind-address设置为0.0.0.0(允许所有IP访问),而不是127.0.0.1。
  • 第四步:测试连通性(排错)
    进入论坛容器,先测试域名解析和端口连通:

    # 进入论坛容器
    docker exec -it <论坛容器名> bash
    # 测试容器名解析
    ping site-db
    # 测试端口是否开放
    telnet site-db 3306
    # 或者用nc(如果容器里有)
    nc -zv site-db 3306
    

    如果ping不通,说明网络没配置对;如果ping通但端口连不上,检查数据库的端口暴露、权限或配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:05:00