错误描述
- dnmp(docker+nginx+mysql+php+redis)搭建开发环境
- 在命令行使用命令docker run启动一个PHP容器,PHP会连接docker compose启动的容器MySQL。
php_dq() {
tty=
tty -s && tty=--tty
docker run \
$tty \
--name php_dq \
-p 10000:10000 \
--network default \
--interactive \
--rm \
--volume $PWD:/www/$(basename $PWD):rw \
--workdir /www/$(basename $PWD) \
dnmp_php php "$@"
}
但是连接过程中抛出异常,
php_network_getaddresses:
getaddrinfo failed: Name does not resolve
PHP通过网络访问地址时失败,所以报错。
首先定位错误位置
$dbms = 'mysql'; //数据库类型
$host = DqConf::$db['host']; //数据库主机名
$port = DqConf::$db['port'];
$dbName = DqConf::$db['database']; //使用的数据库
$user = DqConf::$db['user']; //数据库连接用户名
$pass = DqConf::$db['password']; //对应的密码
$dsn = "$dbms:host=$host;dbname=$dbName;port=$port;";
try {
// 下面这行抛出错误
$dbh = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true, PDO::ATTR_TIMEOUT => 3)); //初始化一个PDO对象
self::$objMysql = $dbh;
$time = time();
return $dbh;
} catch (PDOException $e) {
return $e->getMessage();
}
PHP连接MySQL容器,建立TCP连接的时候报错
尝试解决
那为什么访问不了MySQL容器呢?
docker container 之间相互访问失败,具体这里是 PHP容器访问不了MySQL容器,
1. 确认PHP中配置的MySQL host没错
/**
* 数据库配置
*/
static $db=array(
'host'=>'mysql',
'port'=>'3306',
'user'=>'root',
'password'=>'123456',
'database'=>'dq',
);
2. 连接到同一个network
在这里,host是mysql容器的name,前提是他们都使用bridge模式,并连接到同一个network
> docker network ls
NETWORK ID NAME DRIVER SCOPE
c3b8f1f1c898 bridge bridge local
ce8ddff993be dnmp_default bridge local
224556dfacff host host local
5b614532c01e none null local
这里的dnmp_default就是我们的network的名字。
查看dnmp_default下有几个容器在运行
> docker network inspect dnmp_default
Containers 下并没有我们要找的容器。
检查启动命令,修改参数--network dnmp_default \
, 重启,解决