LoginSignup
5

More than 3 years have passed since last update.

posted at

docker-composeでPHP開発環境

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 にアクセスすると以下のようなページが表示されます。

Screen Shot 2020-02-21 at 9.15.17.png

ハマりどころ

  • phpのイメージでapt-getは動作しませんでした、代わりにdocker-php-ext-installでモジュールを追加します。
  • volumesで永続化した領域を意識しましょう。例えば、一度でも起動した後から、MYSQL_ROOT_PASSWORDを変更しても効きません。環境構築中であれば、少しでもおかしくなったなと思ったら躊躇なく削除してやり直すのが早いと思います。
  • docker-compose.ymlから何でもやろうとすると、細かいところで詰まります。今回だとデータベースのエンコード設定などです。docker-compose execなんかも組み合わせる必要がどうしてもあるような気がします。

参考URL

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5