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. 下準備
今回は下記のようなファイル構成にして
/html フォルダを Web サーバコンテナ(PHP 7.4 + Apache) と共有します。
/path/to/your-dir/
├ docker/
│ ├ docker-compose.yml
│ └ Dockerfile (必要に応じて)
└ html/
└ index.php
動作確認用の PHP スクリプトとデータベースは以下の通りです。
articles.sql はコンテナ作成後に phpMyAdmin でインポートします。
<?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>';
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」のように検索してみてください。
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 .
- Usage (Dockerfile reference | Docker Documentation)
- https://docs.docker.com/engine/reference/builder/#usage
Dockerfile については下記公式ドキュメントと日本語訳サイトが参考になると思います。
- Dockerfile reference | Docker Documentation
- https://docs.docker.com/engine/reference/builder/
- Dockerfile リファレンス — Docker-docs-ja 17.06 ドキュメント
- https://docs.docker.jp/engine/reference/builder.html
ベースとした php:7.4-apache イメージは Docker hub で検索して Official Image を選びました。
- php Tags - Docker Hub
- https://hub.docker.com/_/php?tab=tags&name=7.4-apache
上記 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 共有」などで検索すると、みつかると思います。
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 ファイルの書き方については、下記ドキュメントが参考になると思います。
- Compose file version 3 reference | Docker Documentation
- https://docs.docker.com/compose/compose-file/
- Compose ファイル・リファレンス — Docker-docs-ja 17.06 ドキュメント
- https://docs.docker.jp/compose/compose-file.html
また Docker イメージの mariadb と phpmyadmin は Docker Hub で検索してみつけました。
- mariadb Tags - Docker Hub
- https://hub.docker.com/_/mariadb?tab=tags&name=10.5.4
- phpmyadmin/phpmyadmin Tags - Docker Hub
- https://hub.docker.com/r/phpmyadmin/phpmyadmin/tags?name=latest
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 が便利なのでオススメです。
- Installation (Container tools extension for Visual Studio Code)
- https://code.visualstudio.com/docs/containers/overview#_installation