コズログ

コズァドットハテナァブログゥドットッッジェーピゥィー

Docker(Compose)でPHP+MongoDB環境を作る時のメモ

PHP7+Apache+MongoDB環境が必要になったので、Dockerで環境構築しました。

2017年5月25日時点でのメモです。

MongoDB

以下に公式のリポジトリがあるので、テキトウにタグを指定してDockerfileを作りました。

今日時点で安定版の3.4.4を選択しました。

https://hub.docker.com/r/_/mongo/

FROM mongo:3.4.4

こんな感じ。

PHP-Apache

PHPも以下の公式リポジトリから入れます。

https://hub.docker.com/_/php/

今回は、apacheでいくので「-apache」付きのPHP7を選択し、以下のようなDockerfileを作成しました。

FROM php:7.0.19-apache

RUN apt-get update && apt-get install -y \
    libssl-dev && \
    docker-php-ext-install -j$(nproc) mbstring && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN curl -L -O https://pecl.php.net/get/mongodb-1.2.9.tgz
RUN pecl install mongodb-1.2.9.tgz

PHPモジュールは、docker-php-ext-installの後ろに追加するのがお作法らしいです。(今回はmbstraingのみです。)

MongoDBのドライバ関連モジュールをインストールする際の注意点として、PHPのMongo系ドライバが2つあり、古い方は非推奨になっておるという所です。(古いMongoと新しいMongoDB、名前がややこしい・・・。)

なので、特に理由がなければ新しいモジュールを選択するべきです。

PHP: MongoDB - Manual

MongoDBモジュールのインストールは、マニュアルに書いてある通り、「pecl install mongodb」で行けると思ったのですが、パッケージが見つからないというエラーがでました。

updateしても改善しなかったので、直接ダウンロードしてインストールすることにしました。

PECL :: Package :: mongodb

冪等性を確保するためにもバージョン指定して入れたほうが良さそうなので、これで良しとしました。

インストール途中でエラーを吐いたので、libssl-devを追加しました。

あとは、php.iniに以下を追加します。

extension = mongodb.so

私はphp.iniをホスト側にマウントしています。(必要なら追記してください。)

私はphp.iniをゲスト側にコピーしています。(必要なら追記してください。)

COPY config/php.ini /usr/local/etc/php/

DockerCompose

最後にdocker-compose.ymlを編集してコンテナを制御します。

  mongo:
     build: "./mongo"
     container_name: "mongo"
     ports:
       - "27017:27017"
     volumes:
       - ./mongo/data:/data/db
  php-apache:
    build: "./php-apache"
    container_name: "php_apache"
    ports:
      - "60001:80"
    volumes:
      - ./php-apache/www:/var/www
    depends_on:
      - mongo

WEBサーバー(apache)をポート60001で待ち受けて、Mongoのほうはデフォルトの27017にしました。

MongoDBのデータを永続化するために、/date/dbをホスト側のmongo/dateにマウントしています。(データボリュームコンテナ使ってもええんやで。)

depends_onにて、php-apacheコンテナからMongoコンテナを参照できます。

全体的なディレクトリ構成

ディレクトリ構成はこんな感じです。

./
  |- docker-compose.yml
  |- php-apache
  |    |- Dockerfile
  |    |- config(php.ini)
  |    |- www
  |- mongo
       |- Dockerfile
       |- data

最後にビルドしてテスト

docker-compose up --build -d

をしてビルドしてコンテナ立てたら、PHP側からphpinfoなどを見てモジュールが有効になっているのを確認するとよさげです。