プログラミング

DockerでLAMP環境を作ったら、PDO接続できなくてハマった件

こんにちは、ちゃりおです。
最近、PHPの本を写経しています。
本の環境はxamppだったのですが、なんとなくDockerでやってみたくなりました。

Dockerで環境構築したら途中でPDOでデータベースに接続できず、ハマったので解決策をまとめてみます。

ちゃりお
ちゃりお
PDO接続できずハマった話です

Contents

完成形

最終的にはこうなりました。
https://github.com/msato0731/lamp-docker

バージョン

  • php: 7.2
  • apache: 2.4
  • mysql: 5.7

フォルダ構成

.
├── README.md
├── docker
│ ├── mysql
│ │ ├── Dockerfile
│ │ ├── conf.d
│ │ │ └── my.cnf
│ │ └── data
│ └── php
│ ├── Dockerfile
│ └── php.ini
└── docker-compose.yml

PDOはまったポイント

初歩的な部分ですが、ハマってしまいました。。

  • PDOがインストールされていなかった
  • 接続先がミスってた

PDOがインストールされていなかった

公式のPHPのdockerイメージには、PDOがインストールされていません。
Dockerファイルに下記のように、PDOをインストールする処理を書く必要があります。

  • docker/php/Dockerfile

接続先がミスってた

「PDOインストールできた!これでいける!」と思い、
以下のコードでPDOへの接続確認をしました。

  • pdo.php

エラー出ました。

ERROR:SQLSTATE[HY000] [2002] No such file or directory

なにやら接続できていないらしい。
ググってみると、「’DB_HOST’」をコンテナ内のIPアドレスにする必要がありそうです。

IPアドレスにすると、コンテナを作り直すたびにPDOの接続先を変える必要があります。
面倒だったので、コンテナ名にしました。(コンテナ内で名前解決してくれるため)

変更:define(‘DB_HOST’, ‘localhost’); → define(‘DB_HOST’, ‘db’);

  • pdo.php

ホストからだと、

mysql -u root localhost -P 13306 -p

で接続できるので、てっきりdocker内でもlocalhostで大丈夫かと思っていました。
よくよく考えるとDocker内の通信ですもんね。

まとめ

今回は、DockerでLAMP環境作ってみました。
PDOという思わぬところでハマったので、PHP・Dockerどちらも勉強したくなりました。

php映画検索
PHP初心者が映画WebAPI TMDbを使って映画を検索してみたこんにちは、ちゃりおです。 最近PHPを勉強していて、映画関係のサービス作りたいなーと思ってました。 映画の情報をとってくるWeb A...
[割引情報あり]PHPを1ヶ月で学習するにはTechAcademyがおすすめこんにちは、ちゃりおです。 退職に伴い1ヶ月有給が取れたので、プログラミングスクールを受講してみました。 今回、受講したのはTechA...

AmazonでDockerの本をみてみる!

AmazonでPHPの本をみてみる!