Docker で Apache + PHP + MySQL 環境構築

はじめに

Docker for Windows のインストール」でDocker環境を準備しました。
続いてWordpressを動作させるために、Apache + PHP + MySQLの環境を構築した試行錯誤の結果を備忘録として残します。
node.jsにしない理由はこのサーバーがApacheだからとかそんな理由です。

ゴール

最終的には下記の3つのコンテナの環境を構築します。
1つのLinuxコンテナにApache, PHP, MySQLすべてを乗せることもできるのですが、あまりイケてない方法らしいので、1コンテナは1つの役割を持つようにします。
基本的にDockerはデータの永続化(保存)はできないため、ホストのディレクトリをマウントすることで永続化を実現します。

1. MySQL

バージョンは5.7
マウントするディレクトリはMySQLの実データと、初期化用のデータの2か所

2. PHP

バージョンは7.1.5(アクティブサポート切れてるので、気になる方は変更してください)
マウントするディレクトリ、ファイルはドキュメントルートとphp.iniをマウントします。
ポートを8080とすることで、http://localhost:8080/でアクセスできるようになります。

3. phpMyAdmin

MySQLのデータを確認するために作成します。
ポートを8000とすることで、http://localhost:8000/でアクセスできるようになります。

フォルダ構成

下記のようなフォルダ構成とします。

work/
  ├ mysql/
  │├ data/
  │└ init/
  │  ├ 1_create.sql
  │  └ 2_insert.sql
  ├ php/
  │  ├ Dockerfile
  │  └ php.ini
  ├ www/
  │└ html/
  └ docker-compose.yml

mysql/init/***.sqlは、dockerのMySQLの初回起動時にサンプルデータなどを読み込ませることができます。
ファイル名のascii順で実行されるので、ファイル名に連番を振ると便利です。

docker-compose.yml

今回のメインディッシュのdocker-compose.ymlファイルは下記のようになりました。

docker-compose.yml
version: '3'
services:
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/init:/docker-entrypoint-initdb.d
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=test
    ports:
      - 3306:3306

  php:
    build:
      context: ./php
    volumes:
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - ./www:/var/www:cached
    ports:
      - 8080:80

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=password
    links:
      - mysql
    ports:
       - 8000:80
    volumes:
       - /sessions

php/Dockerfile

PHPに関しては各種モジュール(gd, ImageMagic, intl, zip)やcomposerを追加するため、Dockerfileを定義しました。

Dockerfile
FROM php:7.1.5-apache

RUN apt-get update

RUN apt-get install -y --no-install-recommends \
        # for gd
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
        libwebp-dev \
        libxpm-dev \
        # for ImageMagick
        libmagickwand-dev \
        # for intl
        libicu-dev \
        # from zip
        zlib1g-dev && \
    pecl install imagick && \
    docker-php-ext-enable imagick && \
    docker-php-ext-install bcmath calendar exif gettext intl mbstring mysqli pdo pdo_mysql zip && \
    docker-php-ext-install -j$(nproc) iconv && \
    docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \
    docker-php-ext-install -j$(nproc) gd && \
    rm -rf /var/lib/apt/lists/* && \
    apt-get clean && \
    # enable mod_rewrite
    a2enmod rewrite && \
    # install composer
    cd '/' && \
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"&&  \
    php composer-setup.php && \
    php -r "unlink('composer-setup.php');" && \
    mv composer.phar /usr/local/bin/composer

FROM php:7.1.30-apacheを設定するとfreetypeの設定のあたりでエラーが出てしまいました。

マウントの設定

マウントを設定するためにDocker Desktopの[Shared Drives]の設定でドライブへのアクセスを許可します。
このときに、ホスト側のアカウントにパスワードが必要になります。

Dockerの起動

dockerを起動してみます。

PowerShell
PS > docker-compose up -d

初回はイメージのダウンロードやPHPの各種モジュールのインストールなどに時間がかかります。
こんな感じでdoneとなれば起動は完了です。

ブラウザでアクセス

/work/html/www/phpinfo.phpへファイルを配置し、ブラウザでhttp://localhost:8080にアクセスします。
PHP7.1.5がインストールされていることが確認できました

phpMyAdminの確認

ブラウザでhttp://localhost:8000にアクセスします。
phpMyAdminが表示され、testという名前のDBが作成されていることが確認できます。

まとめ

docker-compose.ymlDockerfileを用意するだけで環境を用意することができました。
PHPのバージョンが7.1系なので7.4など最新のバージョンへの対応が課題です。
次は、この作成した環境へWpordpressを移植した手順(主につまづき点)をまとめたいと思います。