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でLAMP環境を用意すると、WordPressだけではなくLAMP環境で動作するその他のWebアプリを開発する環境として使うことができます。

また、以前の記事でWordPressを複数設定する例を記載しましたが、あの場合だとそれぞれ違うポート番号を割り当てる必要がありました。

作ったLAMP環境にWordPressをインストール方法だとフォルダを作成するだけでいくつでもWordPressをインストールできます。

複数のWordPressを同時に扱いた時はこのほうがおすすめです。