docker-composeでRails5.2開発環境 に続き、PHPの開発環境もdocker-composeで構築してみました。本当はPHP5系の検証環境が欲しかったのですが、5.4のイメージを使うとコンテナ間の通信がどうしてもうまくいかずに断念しました。当初の目的には使えませんでしたが、7系では問題なく動いたので備忘のための投稿しています。
必要なのは以下の2つのファイルです。
Dockerfile
FROM php:7.3-apache
RUN docker-php-ext-install pdo_mysql
docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
volumes:
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=secret
php:
build: .
volumes:
- ./html:/var/www/html
ports:
- 8080:80
depends_on:
- db
ファイルを設置後、以下のコマンドを実行します。
docker-compose build
docker-compose up
別のターミナルからデータベースの作成コマンドを実行します。
docker-compose exec db mysql -e "create database mydb default charset utf8" -p
今回は、以下のようなプログラムで動作確認しています。htmlフォルダ下に置いてください。
index.php
<p>
<?php echo "Hello PHP on Docker!"; ?>
</p>
<p>
<?php
// docker-compose exec db mysql -e "create database mydb default charset utf8" -p
$pdo = new PDO("mysql:host=db;dbname=mydb","root","secret");
$pdo->exec("create table if not exists t (v varchar(255))");
$pdo->exec("insert into t values ('Hello MySQL on Docker!')");
foreach ($pdo->query("select * from t") as $row) {
echo $row['v'] . "<br/>";
}
?>
</p>
ブラウザで http://localhost:8080 にアクセスすると以下のようなページが表示されます。
ハマりどころ
- phpのイメージで
apt-get
は動作しませんでした、代わりにdocker-php-ext-install
でモジュールを追加します。 - volumesで永続化した領域を意識しましょう。例えば、一度でも起動した後から、MYSQL_ROOT_PASSWORDを変更しても効きません。環境構築中であれば、少しでもおかしくなったなと思ったら躊躇なく削除してやり直すのが早いと思います。
- docker-compose.ymlから何でもやろうとすると、細かいところで詰まります。今回だとデータベースのエンコード設定などです。
docker-compose exec
なんかも組み合わせる必要がどうしてもあるような気がします。