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只指向自身容器,无法访问其他容器。
第三步:排查数据库权限与配置
就算网络通了,数据库可能限制了外部访问:- 进入主站数据库容器,检查用户权限:
docker exec -it site-db mysql -u root -p # 授予用户从任意IP访问的权限(替换成你的用户名和密码) GRANT ALL PRIVILEGES ON <主站数据库名>.* TO '<用户名>'@'%' IDENTIFIED BY '<密码>'; FLUSH PRIVILEGES; - 检查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
相关产品推荐
相关产品推荐

