DockerでPHPエラー「php_network_getaddresses: getaddrinfo failed: Name or service not known」
DockerでPHPエラー「php_network_getaddresses: getaddrinfo failed: Name or service not known」
DockerでLAMP環境を構築し、Laravelをインストールしたところ、タイトルに書いてある「php_network_getaddresses: getaddrinfo failed: Name or service not known」というエラーが発生しました。どうやらDB接続でこけている様子。今回はこのエラーについて調査した結果をまとめます。
エラーの内容調査
エラー内容を読むと「getaddrinfo failed」ということで、アドレス情報取得時のエラーであることが分かります。
似たようなエラーに
- php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known
- php_network_getaddresses: getaddrinfo failed: No such host is known
- php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution
などのエラーが存在していることもわかりました。
ホストの設定が間違っているとか名前解決に失敗していることが原因で発生するエラー達のようです。
.envの確認
今回のエラー「php_network_getaddresses: getaddrinfo failed: Name or service not known」は、
指定しているDBのホスト名の設定がおかしいのではと思い、Laravelの「.env」ファイルを確認してみることにしてみました。
DB_CONNECTION=mysql DB_HOST=【ホスト名】 DB_PORT=3306 DB_DATABASE=test DB_USERNAME=test DB_PASSWORD=test
私は、上記の【ホスト名】のところに、MySQLコンテナに以下のようなコマンドでbashログインしたときに表示されるホスト名を指定していたのですが、
このホスト名(下記のXXXXXXXXXXXX部分)は、dockerのコンテナを作成するたびに変わるので、エラーが発生してしまっているようです。
$ docker exec -it docker_db_1 bash root@XXXXXXXXXXXX:/#
docker-compose.ymlの確認
docker-compose.ymlを確認してみると、
~省略~ services: db: build: ./db volumes: - ./db/mysql_data:/var/lib/mysql - ./db/init:/docker-entrypoint-initdb.d environment: ~省略~
上記のようにMysqlは「db」をservice名に指定しているので、
.envのホスト名を合わせて「db」にしてみたところ、エラーが解消されました。
本エラーはDocker側の問題かLaravel側の問題かが分かりづらかったため、解決に時間がかかってしまいました。
WEBアプリケーション関連 人気連載リンク
基礎からPHPWEBアプリ解発を学ぶなら・・
PHP基礎 連載
より実践的なWEBアプリ開発講座!Bootstrap活用を学ぶなら・・
魁!小野の塾 連載