Docker ComposeはLAMP環境も手軽に作ることができます。今回はApache、MySQL、PHPでLAMP環境を作ります。
はじめに
以前にDocker Composeを使ってWordPressが動作する環境を作る記事を掲載しました。
その環境もWordPressが動作するので広く見るとLAMP環境となりますが、WordPressの公式イメージがPHPとApacheの動作環境も含んでいるため、個別にイメージを設定する必要はありませんでした。
コンテナを起動すると同時にWordPress環境も作成されるので、WordPressを個別にインストールする必要もないし、WordPressに必要なPHPの環境も同時に作成されます。
利点としてはApacheやPHPを個別にイメージ設定する必要がないのもそうですが、WordPressの公式イメージが動作に必要なPHP環境を含んでいるため、別途で必要なPHPライブラリのインストールなども必要ありませんでした。
今回は、WordPressの公式イメージを使わない純粋なLAMP環境を作成します。
そして、PHPの公式イメージはすべての拡張ライブラリを含んではいないので、必要に応じてインストールしなければなりません。
この場合の利点は、このLAMP環境ではいくらでもWordPressをインストールしたり、WordPress以外のLAMP環境で動作するWebアプリをいくらでも作成できることです。
作成するLAMP環境
今回はApache、MySQL、PHPの動作するLAMP環境を作ります。
それぞれのバージョンは以下です。
- Apache2.4
- MySQL5.7
- PHP7.3
この環境が動作するのに使用するサブフォルダを(ここでは”docker-lamp”とします)作ります。
そして、そこにdocker-compose.ymlファイルを保存します。
他にはPHPの設定ファイル(php.ini)とPHPの拡張ライブラリをいくつかインストールするので、イメージをビルドするためのDockerfileをこのフォルダ配下に保存します。
全体のフォルダ構成は以下となります。
docker-lamp ├── docker-compose.yml ├── htdocs └── php ├── Dockerfile └── php.ini
- docker-lamp ⇒ Docker Composeで起動時の作業フォルダ
この作業フォルダ配下にdocker-compose.ymlファイル、htdocsフォルダ、phpフォルダを格納
- htdocs ⇒ Webページを表示する先頭のフォルダ
- php ⇒ PHPのビルド情報と設定が格納されているフォルダ
docker-compose.ymlの内容は以下です。
version: '3.7'
services:
mysql:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 'password'
phpmyadmin:
depends_on:
- mysql
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: mysql
restart: always
ports:
- "8080:80"
php-apache:
build: ./php
volumes:
- ./htdocs:/var/www/html
restart: always
ports:
- "80:80"
depends_on:
- mysql
volumes:
db_data: {}
MySQLは5.7のイメージをダウンロードし、”db_data”としてデータを永続化しています。phpMyAdminを使ってDBを操作できるようにしています。
PHPは拡張ライブラリをインストールするためと、php.iniの設定を変更するためにDockerfileを使ってイメージをビルドしています。
mysqlサービス
image:mysql:5.7
5.7のイメージをダウンロードしてコンテナを実行します。
volumes:
- db_data:/var/lib/mysql
データベースの内容を”db_data”にマウントします。
restart: always
ホスト(マシン)を再起動してもDocker for Mac/Windowsやデーモンを再起動したときでもコンテナを自動的に再起動します。
environment:
MYSQL_ROOT_PASSWORD: 'password'
rootのパスワードを設定します。
phpmyadminサービス
depends_on:
- mysql
mysqlサービスと依存関係を設定します。こうすることでmysqlが起動したあとでphpMyAdminサービスが起動します。
image: phpmyadmin/phpmyadmin
phpMyAdminの公式イメージをダウンロードして起動します。
environment:
PMA_HOST: mysql
使用するデータベースをサービス名で設定します。ここでは”mysql”となります。
restart: always
ホスト(マシン)を再起動してもDocker for Mac/Windowsやデーモンを再起動したときでもコンテナを自動的に再起動します。
ports:
- "8080:80"
ホスト側のポートとコンテナ側のポートをマッピングします。この場合はホスト側ブラウザで8080ポートでアクセスできるようにマッピングしています。
php-apacheサービス
build: ./php
phpフォルダ配下にあるDockerfileを読み込みその内容に従ってイメージをビルドします。
Dockerfileの内容
FROM php:7.3-apache
COPY ./php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
&& docker-php-ext-install pdo_mysql mysqli mbstring gd iconv
PHPの公式イメージ”7.3-apache”を使ってビルドします。
起動時にホスト側のphp.iniをコンテナにコピーして使用します。
また、”docker-php-ext-install”コマンドを実行して、”pdo_mysql mysqli mbstring gd iconv”のライブラリをインストールします。
“gd”ライブラリは、”libfreetype6-dev libjpeg62-turbo-dev libpng-dev”をインストールしておかないとエラーとなるため先にインストールしています。
拡張ライブラリはそれぞれ以下です。
- pdo_mysql ⇒ MySQLにPDO接続する
- mysqli ⇒ 機能拡張ライブラリ
- mbstring ⇒ 日本語処理
- gd ⇒ 画像処理
- iconv ⇒ 文字セット変換
LAMP環境にWordPressをインストールすることを想定するとこれだけあればいいかと思います。
volumes:
- ./htdocs:/var/www/html
ホスト側の”htdocs”ディレクトリとコンテナ側のApacheのWebページ先頭ディレクトリをマウントしています。これでWebページのファイルをhtdocsフォルダに作成すればブラウザで表示できます。
restart: always
ホスト(マシン)を再起動してもDocker for Mac/Windowsやデーモンを再起動したときでもコンテナを自動的に再起動します。
ports:
- "80:80"
ホスト側のポートとコンテナ側のポートをマッピングします。この場合はホスト側ブラウザでポート番号を指定せずアクセスできるようにマッピングしています。
depends_on:
- mysql
mysqlサービスと依存関係を設定します。こうすることでmysqlが起動したあとでphp-apacheサービスが起動します。
トップレベル記述のvolumes設定
volumes:
db_data: {}
mysqlでマウントしているdb_dataをこの設定で永続化しています。こうすることで、コンテナを停止してもデータベースの内容を保持することができます。
起動
docker-compose.ymlファイルが作成できたらdocker-lampフォルダに移動し、Dockerイメージのビルドを行います。
$ cd docker-lamp
$ docker-compose build
Dockerイメージができたかどうかを確認します。
$ docker images
確認できたらコンテナを起動します。
$ docker-compose up -d
DockerイメージをビルドしたあとにDockerFileを変更したりした場合は再びビルドする必要があるので、コンテナ起動時にビルドオプションを指定します。
$ docker-compose up -d --build
起動できたら以下のコマンドで状態を見てみましょう。
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------
docker-lamp_mysql_1 docker-entrypoint.sh Up 3306/tcp, 33060/tcp
mysqld
docker-lamp_php- docker-php-entrypoint Up 0.0.0.0:80->80/tcp
apache_1 apac ...
docker- /docker-entrypoint.sh Up 0.0.0.0:8080->80/tcp
lamp_phpmyadmin_1 apac ...
Stateが「Up」になっていれば起動しています。
起動できたら、それぞれのコンテナが動作しているか確認してみましょう。
- Apache
- PHP
- MySQL
の動作確認となります。
まずはApacheの動作確認です。
docker-lampフォルダ配下のhtdocsフォルダに表示確認用のHTMLファイルを作成します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
</head>
<body>
<p>Hello World!!</p>
</body>
</html>
ファイル名をindex.htmlで保存したら、ブラウザで「http://localhost/index.html」にアクセスしてみましょう。(index.htmlなのでhttp://localhostでも表示します)
「Hello World!!」が表示されればApacheは動作しています。
次にPHPが動作しているか確認しましょう。
以下の内容を「info.php」ファイル名でhtdocsフォルダに保存します。
<?php
phpinfo();
?>
ブラウザで「http://localhost/info.php」にアクセスします。
このようなPHPの情報が表示できればPHPは動作しています。
次にMySQLが動作しているか確認しましょう。
まずはmysqlのコンテナでbashを実行します。
$ docker exec -it docker-lamp_mysql_1 bash
コンテナの名前は特に指定してなければ自動で割り当てられるため、「docker-compose ps」コマンドでMySQLのコンテナ名を確認してコマンドを入力します。
実行するとコマンドプロンプトが「#」に変わるので、そこで以下のコマンドを入力してmysqlへログインします。
# mysql -u root -p
パスワードの入力が求められるので、docker-compose.ymlファイルに設定したrootのパスワードを入力してください。
ログインできるとmysqlのプロンプトが表示されます。
mysql>
バージョンを表示させてみましょう。
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.27 |
+-----------+
1 row in set (0.00 sec)
終了は以下のコマンドです。
mysql> quit
# exit
最後にphpMyAdminが動作しているか確認しましょう。
ブラウザで「http://localhost:8080」でアクセスしてください。
phpMyAdminのログイン画面が表示されれば動作しています。
rootでログインできるか確認してください。
パスワードは先程と同じくdocker-compose.ymlファイルに設定したパスワードを入力してください。
ログインできればすべての動作確認は終了です。
MySQLコンテナはデフォルトのポート番号は3306になっています。
そこでSQLクライアントからMySQLにアクセスしようと「Host: localhost, Port: 3306」で接続しようとしてもできません。
「Host: 127.0.0.1, Port: 3306」で接続する必要があります。
また、アプリケーションからMySQLに接続する場合は、これでも接続エラーとなります。
例えば、WordPressを使う際にwp-config.phpに設定するデータベースのホスト名にlocalhostや127.0.0.1を設定してもエラーとなります。
この場合はDocker起動時のサービス名もしくはコンテナ名で接続します。
例えば、Dockerで起動するMySQLのサービス名/コンテナ名が”mysql”とした場合だと、ホスト名には”mysql”を設定します。
停止・終了
起動しているコンテナを停止するには以下のコマンドを実行します。
$ docker-compose stop
この場合はコンテナは停止しますが残っています。
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------
docker-lamp_mysql_1 docker-entrypoint.sh mysqld Exit 0
docker-lamp_php-apache_1 docker-php-entrypoint apac ... Exit 0
docker-lamp_phpmyadmin_1 /docker-entrypoint.sh apac ... Exit 0
コンテナを削除する場合は以下のコマンドを実行します。
$ docker-compose down
このコマンドでコンテナを削除しても作成・編集したデータベースは「volumes」で永続化しているので削除されません。
もしデータベースも含めて削除したい場合は以下のコマンドを実行します。
$ docker-compose down --volumes
またダウンロードしたイメージを削除する場合は、コンテナの削除後に以下のコマンドを実行します。
$ docker rmi <[イメージ名] or [イメージID]>
最後に
DockerでLAMP環境を用意すると、WordPressだけではなくLAMP環境で動作するその他のWebアプリを開発する環境として使うことができます。
また、以前の記事でWordPressを複数設定する例を記載しましたが、あの場合だとそれぞれ違うポート番号を割り当てる必要がありました。
作ったLAMP環境にWordPressをインストール方法だとフォルダを作成するだけでいくつでもWordPressをインストールできます。
複数のWordPressを同時に扱いた時はこのほうがおすすめです。