このエントリはMagento Advent Calendar 2018の4日目です。

今年、地道に開発を続けてきたMagento2をDockerで動かすプロジェクトがようやく本格的に稼働し始めました。
今回はApacheイメージの作成について説明してみたいと思います。


Apacheイメージ

まずは元になるDockerHub公式イメージをpullしておきましょう。
DockerHubのApacheイメージでは
1. composerがインストールされていない
2. 必要なPHPエクステンションがインストールされていない
という不足部分があり、これらを解消しなくてはいけません。
そこでDockerfileを作成して以下のようなカスタムしたDockerイメージを作成していきます。

FROM php:7.2-apache

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

RUN apt-get update \
&& apt-get install -y libwebp-dev libjpeg-dev libpng-dev libicu-dev libxml2-dev libxslt1-dev \
&& docker-php-ext-configure gd --with-webp-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install bcmath calendar exif gd gettext intl mysqli pcntl pdo_mysql soap sockets wddx xsl opcache zip

RUN a2enmod rewrite

RUN useradd -u 1000 -m docker
ENV APACHE_RUN_USER docker
ENV APACHE_RUN_GROUP docker

元イメージの指定

1行目は元にするDockerイメージを指定します。今回はPHP7.2のApacheイメージを使用します。

必要なパッケージのインストール

6行目のapt-get install -y ...は、libwebp-dev, libjpeg-dev, libpng-devがgdのため、libicu-devがintlのため、libxml2-devがsoapのため、libxslt1-devはxslのために必要なので先にapt-getでインストールする処理をしています。

PHPエクステンションのインストール

7行目はgdのインストールにのみ(何故か)コンフィグの設定が必要なので先に設定しておきます。詳しくは省きます。
8行目でエクステンションのインストールをしています。Debian等ではapt-getでインストールするのが通常だと思いますが、php:72.-apacheイメージ側でdocker-php-ext-installというコマンドが用意されているので、こちらを使用しました。

Apacheモジュールの有効化・無効化

10行目ではApacheモジュールの有効化・無効化をしています。今回はよく使うであろうrewriteモジュールを有効化していますが、各自必要な処理を書いてください。

Apache実行ユーザーの指定

Dockerではコンテナ内外の実行ユーザーの違いなどで所有者権限エラーが頻出します。
12行目ではその対策として、UID1000のdockerというユーザーを作成しています。
13,14行目ではenvvars内にある実行ユーザーを指定する環境変数を定義しています。

※補足
Dockerではホスト側のファイルをコンテナ内にマウントする機能があり、その際に所有者などの権限がコンテナ内外でそのまま反映されるため、実行ユーザーが違うことでエラーがよく発生します。
今回は簡易的にDockerfile内でユーザーを作成してしまいましたが、本格的に活用したい場合はコンテナが立ち上がる際にUIDを合わせて起動するようにするなど、多少工夫をするべき箇所かと思います。


イメージのビルド

Dockerfileを書き終えたらビルドをしましょう。
Dockerfileのあるディレクトリに移動して、docker build -t {name}:{tag} .を実行すればビルドが始まるはずです。
-tオプションでイメージに名前とタグがつけられます。後々便利なのでつけておきましょう。


Apacheコンテナの起動

イメージをビルドできたら、ためにし起動してみましょう。
docker run -d -p 80:80 -v {magento-dir}:/var/www/html {name}:{tag}で立ち上がるはずです。
-dオプションでバックグラウンド起動をさせることが出来ます。
-pオプションでポートフォワードを指定できます。ホストの80番ポートをコンテナ内の80番ポートに転送させています。
-vオプションで先述したボリュームのマウント位置を指定できます。左側にホストのMagentoプロジェクトディレクトリ、右側にコンテナのApacheルートディレクトリを指定することで、起動時に自動でマウントしてくれます。

ここまで出来たらブラウザで確認してみましょう。

Magentoのインストールウィザードが表示されましたか?

Readliness Checkですべての項目がチェックされているかも確認するといいでしょう。

以上でApacheイメージの作成は終了です。
しかし、毎回起動するごとにdocker runのオプションを手打ちするのは大変ですよね?そんな悩みを解決するdocker-composeという便利なツールがあるのですが、こちらはまたの機会に…といたしましょう!
※(2018年12月15日追記)docker-compose編を投稿しました。


告知

来週の12月11日の19時からMagento Meetup Kansaiが行われます。
関西にお住まいの方でMagentoに興味関心がある方はぜひ参加登録してみてください!
WiFiに電源、軽食とドリンクをご用意してお待ちしております