Docker で PHP 7.4 と MariaDB 10.5 の LAMP + phpMyAdmin 環境を構築する方法

はじめに

PHP や MySQL などのバージョンアップが頻繁に行われる Web 開発において、プロジェクトごとに動作環境が異なることはよくあります。

そんなとき Docker を使えば、本番に近い開発環境をサクッと構築することができます。

今日は、開発環境向けに Docker で PHP 7.4 と MariaDB 10.5 の LAMP (Linux、Apache、MySQL、PHP) + phpMyAdmin 環境を構築する方法をご紹介します。

Docker
19.03.1
Docker Compose
1.24.1
目次
  1. 下準備
  2. どうして Dockerfile をつくるのか
  3. Dockerfile で 拡張モジュール導入済のイメージ作成
  4. docker-compose.yml を作成
  5. コンテナ作成、動作確認
  6. docker-compose.yml のみで行う
  7. おわりに

1. 下準備

今回は下記のようなファイル構成にして
/html フォルダを Web サーバコンテナ(PHP 7.4 + Apache) と共有します。

/path/to/your-dir/
  ├ docker/
  │  ├ docker-compose.yml
  │  └ Dockerfile (必要に応じて)
  └ html/
      └ index.php

動作確認用の PHP スクリプトとデータベースは以下の通りです。
articles.sql はコンテナ作成後に phpMyAdmin でインポートします。

/html/index.php
<?php
// ユーザー名やパスワードなどは、
// 後ほど紹介する docker-compose と併せて適宜変更してください
$dsn = 'mysql:dbname=sampledb;host=myapp-db';
$db = new PDO($dsn, 'sample-user', 'hi2mi4i6');

$sql = 'SELECT * FROM articles';
echo '<pre>';
foreach ($db->query($sql) as $row) {
  var_dump($row);
}
echo '</pre>';
/articles.sql
CREATE TABLE articles (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  body varchar(255) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO articles (id, body) VALUES
(1, 'テスト1'),
(2, 'テスト2');

2. どうして Dockerfile をつくるのか

Dockerfile を使わずに docker-compose のみで PHP 拡張モジュールをインストールする方法は、「6. docker-compose.yml のみで行う」で紹介します。

今回は PHP(+ Apache)、MariaDB、phpMyAdmin の3つの Docker 公式イメージを使って環境を構築します。

PHP の公式イメージには pdo_mysql や gd、intl などの拡張モジュールがインストールされていないため、必要に応じて追加する必要があります。

Dockerfile にそのコマンドを記載することで、拡張モジュール導入済のイメージを作れるため、コンテナ生成後に拡張モジュールを手動でインストールする必要がありません

チーム開発を行う場合はもちろん、個人プロジェクトでもコンテナを再構築する際に役立つので、Dockerfile は作っておくといいと思います。

3. Dockerfile で 拡張モジュール導入済のイメージを作成

Dockerfile を使って、PHP 7.4 + Apache の公式イメージに PHP 拡張モジュールをインストールした独自のイメージを作ります。

下記の Dockerfile では pdo_mysql をインストールしています。

他の拡張モジュールのインストール方法は割愛しますので、
例えば intl なら「docker-php-ext-install intl」のように検索してみてください。

/docker/Dockerfile
FROM php:7.4-apache

RUN apt-get update && \
  docker-php-ext-install pdo_mysql

ビルドは下記コマンドで行います。
今回は -t オプションを使って、イメージに 「my-php:7.4-apache」というタグをつけています。

最後の「.」を忘れないようにしてください

$ cd /path/to/your-dir/docker
$ docker build -t my-php:7.4-apache .

Dockerfile については下記公式ドキュメントと日本語訳サイトが参考になると思います。

ベースとした php:7.4-apache イメージは Docker hub で検索して Official Image を選びました。

上記 php Tags ページの一覧にある「7.4-apache-buster」の「buster」は、コンテナで用いられている Debian Linux のバージョン(コードネーム)を表しています。

執筆時点では buster が最新版なので 7.4-apache でも同じですが、今後 Debian がバージョンアップした場合には 7.4-apache はそちらが用いられると推測されます。

「buster」が必要な場合には php:7.4-apache-buster を指定してください。

4. docker-compose.yml を作成

下記内容で docker-compose.yml を作ります。

Docker toolbox on windows を使用の場合は、VirtualBox の共有フォルダ設定で
/path/to/your-dir/html を追加する必要がありますのでご注意ください。

設定方法は「docker toolbox windows volumes 共有」などで検索すると、みつかると思います。

/docker/docker-compose.yml
version: '3'
services:
  # PHP + Apache のコンテナ
  myapp-web:
    container_name: myapp-web
    # Dockerfile で作ったイメージを指定
    image: my-php:7.4-apache
    # 80 ポートをコンテナの 80 ポートにマッピング
    # (http://localhost/ などで myapp-web コンテナにアクセス)
    ports:
      - "80:80"
    # ローカルの /path/to/your-dir/html フォルダを
    # コンテナの /var/www/html にマッピング
    volumes:
      - ../html:/var/www/html

  # MariaDB のコンテナ
  myapp-db:
    container_name: myapp-db
    image: mariadb:10.5.4
    environment:
      # ユーザー名やパスワードなどは適宜変更してください
      MYSQL_DATABASE: sampledb
      MYSQL_USER: sample-user
      MYSQL_PASSWORD: hi2mi4i6
      MYSQL_ROOT_PASSWORD: mu7ya9to

  # phpMyAdmin のコンテナ
  myapp-pma:
    container_name: myapp-pma
    image: phpmyadmin/phpmyadmin:latest
    environment:
      PMA_HOST: myapp-db
      # phpMyAdmin でログインするアカウント
      # (省略するとログインフォーム表示)
      PMA_USER: sample-user
      PMA_PASSWORD: hi2mi4i6
    # 8080 ポートをコンテナの 80 ポートにマッピング
    # (http://localhost:8080/ などで myapp-pma コンテナにアクセス)
    ports:
      - "8080:80"

docker-compose について調べると links を使う例がよくみられますが、今回は不要です。
links で指定しなくても各コンテナが1つのネットワークで繋がっていて、myapp-web、myapp-db のようにコンテナ名で接続できます。

docker-compose ファイルの書き方については、下記ドキュメントが参考になると思います。

また Docker イメージの mariadb と phpmyadmin は Docker Hub で検索してみつけました。

mariadb Tags ページの一覧にある「10.5.4-focal」の「focal」は Ubuntu のバージョン(コードネーム)です。

PHP のイメージと同様に「10.5.4」は 今後 Ubuntu のバージョンアップに伴い、そちらが採用される可能性があるので、将来的にも「focal」が必要であれば「10.5.4-focal」を選択してください。

5. コンテナ作成、動作確認

下記コマンドでコンテナを作成し、起動します。

$ cd /path/to/your-dir/docker
$ docker-compose up -d

正常に起動すれば myapp-web と myapp-pma にアクセスできます。

まずは 8080 ポートを使って phpMyAdmin にアクセスしましょう。
URL は Docker machine に割り当てている IP やホスト名になります。
設定によりますが http://localhost:8080/ や http://192.168.99.100:8080/ でしょうか。

phpMyAdmin が開けたら、sampledb に 上記の articles.sql をインポートしてください。

次に 80 ポートでアクセスして、下記のように表示されれば正常に動作しています。
(http://localhost/ など)

array(4) {
  ["id"]=>
  string(1) "1"
  [0]=>
  string(1) "1"
  ["body"]=>
  string(10) "テスト1"
  [1]=>
  string(10) "テスト1"
}
array(4) {
  ["id"]=>
  string(1) "2"
  [0]=>
  string(1) "2"
  ["body"]=>
  string(10) "テスト2"
  [1]=>
  string(10) "テスト2"
}

コンテナの停止、開始、再起動は下記コマンドのように行えます。

$ docker stop myapp-web
$ docker start myapp-web
$ docker restart myapp-web

6. docker-compose.yml のみで行う

Dockerfile を使わずに docker-compose.yml のみで構築する場合には、下記内容でコンテナを作成して起動します。

先に紹介したファイルの myapp-web の image を公式 Docker イメージに変更しただけです。

version: '3'
services:
  # PHP + Apache のコンテナ
  myapp-web:
    container_name: myapp-web
    # 公式 Docker イメージを使用
    image: php:7.4-apache
    # 80 ポートをコンテナの 80 ポートにマッピング
    # (http://localhost/ などで myapp-web コンテナにアクセス)
    ports:
      - "80:80"
    # ローカルの /path/to/your-dir/html フォルダを
    # コンテナの /var/www/html にマッピング
    volumes:
      - ../html:/var/www/html

  # MariaDB のコンテナ
  myapp-db:
    container_name: myapp-db
    image: mariadb:10.5.4
    environment:
      # ユーザー名やパスワードなどは適宜変更してください
      MYSQL_DATABASE: sampledb
      MYSQL_USER: sample-user
      MYSQL_PASSWORD: hi2mi4i6
      MYSQL_ROOT_PASSWORD: mu7ya9to

  # phpMyAdmin のコンテナ
  myapp-pma:
    container_name: myapp-pma
    image: phpmyadmin/phpmyadmin:latest
    environment:
      PMA_HOST: myapp-db
      # phpMyAdmin でログインするアカウント
      # (省略するとログインフォーム表示)
      PMA_USER: sample-user
      PMA_PASSWORD: hi2mi4i6
    # 8080 ポートをコンテナの 80 ポートにマッピング
    # (http://localhost:8080/ などで myapp-pma コンテナにアクセス)
    ports:
      - "8080:80"
$ cd /path/to/your-dir/docker
$ docker-compose up -d

次に docker exec を使って myapp-web にログインして、必要な PHP の拡張モジュールなどをインストールし、コンテナを再起動すれば完了です。

$ docker exec -it myapp-web bash

root@1234567890ab:/var/www/html# apt-get update
root@1234567890ab:/var/www/html# docker-php-ext-install pdo_mysql
root@1234567890ab:/var/www/html# exit

$ docker restart myapp-web

後は上記のように動作確認を行ってください。

7. おわりに

Docker を初めて知ったときには、その機能や概念に感動しました。しかし、公式ドキュメントや書籍のコンテンツ量が多く、慣れない単語は出てくるしで、学習するのが大変でした。

今回は、まだ Docker をよく知らない方向けに学習の足掛かりになればと思い、コメントや参考文献を多めに入れました。何かのお役に立てば幸いです。

最後に余談ですが、Visual Studio Code を使われている場合は Microsoft 製のエクステンション Docker for Visual Studio Code が便利なのでオススメです。