PHPの開発環境が欲しくて色々調べたところ、XAMPPなんて便利なものがあるらしい。
ただここはインフラエンジニアらしくdockerで作ることにした。
ネットに散々ナレッジは落ちてるが、環境が違ったり情報が古かったりと中々動いてくれなかったので、トラシューなども含めてメモしておく。
動作検証環境
- macOS
- Sierra vr10.12.6
- docker
- Docker version 19.03.1
- docker-compose
- docker-compose version 1.24.1
- docker-compose version 1.24.1
いいから早くさわらせろ
コンテナの起動
https://github.com/yuto-miyazawa/Docker-Compose
詳しくはREADMEを参照。
前提としてdocker,docker-composeコマンドは入れておくこと。
1.上記のgitリポジトリをお手元にclone
2.カレントディレクトリを「lamp」移動
3.下記のコマンドでコンテナを起動
docker-compose up -d
コンテナの起動確認
1.ブラウザでhttp://localhost
に接続 -> hello world!が出ればok
2.ブラウザでhttp://localhost:8080
に接続 -> myphpadminの画面に飛べればok
dockerが起動しない場合
portが重複してる
dockerは使用するportをポートフォワーディングしている。
ports:
- 8080:80 // 8080ポートで外部で受け、コンテナ内の80ポートへ流す
この場合、8080ポートがすでに使われている場合、dockerはコンテナを立ち上げることができない。
下記を試すと起動できるようになる可能性がある。
- 他のアプリケーションを停止する(Skypeとかは80を使うらしいので怪しい)
- 8080の箇所を別の使用されていないポートに書き換える
トラブルシューティング
以下構築時にハマった箇所のメモ
mysql-clientがapt-getできない
apt-get install -y zlib1g-dev mysql-client
Debianはあるバージョンから「mysql-client」パッケージがなくなり「default-mysql-client」パッケージにかわったため、こちらをapt-getする
RUN apt-get update \
&& apt-get install -y zlib1g-dev mysql-client \
&& docker-php-ext-install zip pdo_mysql
composer-setup.phpが古い
phpコンテナを立ち上げる際にこのファイルを読み込むのだが、ハッシュ値を確認しているため最新の値にしてやる必要がある。
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
https://getcomposer.org/download/
↑から最新のファイルを取得する
phpからmysqlに接続できない
phpからmysqlに接続しようとすると以下のエラーが出る。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
色々調べた結果、どうやらphpからmysqlコンテナを指定する場合、localhostではなくmysqlのコンテナ名を指定してやる必要があった。
今回の場合だとコンテナ名「mysql」を指定する。
// phpコンテナに入る
$ docker exec -it php /bin/bash
// mysqlに接続
mysql -u root -p -h mysql
.phpでmysqlに接続する場合も同様
$dsn = 'mysql:dbname=shop; host=mysql; charset=utf8';