こんにちは、ちゃりおです。
最近、PHPの本を写経しています。
本の環境はxamppだったのですが、なんとなくDockerでやってみたくなりました。
Dockerで環境構築したら途中でPDOでデータベースに接続できず、ハマったので解決策をまとめてみます。
完成形
最終的にはこうなりました。
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どちらも勉強したくなりました。