錯誤描述
- 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 \
, 重啓,解決