PHP容器无法连接同网络MySQL容器:数据源名称无效问题求助
解决Docker环境下PHP连接MySQL报“invalid data source name”的问题
先给你吃个定心丸:MySQL日志里的mbind: Operation not permitted和你的连接失败完全没关系,那只是容器环境下的一个非致命警告——MySQL想绑定内存到特定CPU核心,但容器默认没给CAP_SYS_NICE权限,不影响数据库功能,嫌碍眼的话启动MySQL容器时加个--cap-add SYS_NICE参数就能消掉这个日志。
接下来是导致你报错的两个核心问题,一个个解决:
1. 容器内的主机地址写错了
在Docker同一个自定义网络(你这里是backend)里,每个容器的127.0.0.1都是指向自己的,不是MySQL容器。你得把PDO连接串里的host=127.0.0.1改成host=mysql——Docker的内置DNS会自动把容器名解析成对应的容器IP,这样PHP容器才能找到MySQL容器。
2. 类成员变量的作用域没搞对
你的connect()方法里直接用了$dsn、$dbUsername、$dbPassword,但这些是类的私有成员变量,必须用$this->来访问!不然PHP会把它们当成未定义的局部变量,导致DSN为空,直接触发“invalid data source name”错误。
修正后的dbTest.php代码
<?php class DBConnect { private $dsn = "mysql:dbname=demo;host=mysql;port=3306;"; private $dbUsername = "root"; private $dbPassword = "root"; private $conn; public function connect() { try { echo 'Attempt Connection. '; // 必须用$this->访问类的私有属性 $this->conn = new PDO($this->dsn, $this->dbUsername, $this->dbPassword); echo 'Connected successfully. '; } catch (PDOException $exception) { echo 'Connection failed: ' . $exception->getMessage(); } return $this->conn; } } $co = new DBConnect(); $co->connect(); ?>
最后提个小优化:你启动容器时用的--link参数在Docker的自定义网络模式下已经过时了,同网络的容器本来就可以互相访问,删掉这些--link参数也不会有问题,配置会更干净。
内容的提问来源于stack exchange,提问作者dpfdg dfsg
相关产品推荐
相关产品推荐

