Docker Composeを使ってLAMP環境を作る

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を同時に扱いた時はこのほうがおすすめです。