馬とテニスのIT革命
馬とテニスとリラックマが好きな IT 系のエンジニアです。
Docker

DockerでNginxとPHPを連携させてサクっと動かす

Docker に少しずつ慣れてきましたが、今回は動的なことをしたいモックサーバを急遽使いたかったので、ローカルの Docker で Nginx と PHP(php-fpm)が動作するコンテナを作成してみました。

それぞれのサーバの要件は以下の通り。

Nginx

コンテナ上では80番ポートで起動する
ローカルのホストOS上では10080番で受ける
コンテナ起動時にconfファイルをマウントする

PHP

コンテナ上では9000番ポートで起動する
Nginxからは9000番ポートにリバースプロキシ
コンテナ起動時にphpファイルをマウントする

Nginx と php-fpm 間は UNIX ドメインソケットでも良かったかも・・・。

ローカルのファイルの準備

以下のようなディレクトリ構成を準備します。

最初はこのくらいシンプルに練習していけばいいと思います。

site
 ├ conf
 │ ├ default.conf
 │ └ php.ini
 └ html
   └ index.php

Nginxの設定

今回は、docker-compose.yml に設定を定義して運用を楽にしてみます。

まずは、Nginx の設定から。

$vi docker-compose.yml

web:
  container_name: web
  image: nginx:1.13.5-alpine
  ports:
    - "10080:80"
  depends_on:
    - php
  volumes:
    - ./site/conf/default.conf:/etc/nginx/conf.d/default.conf

イメージは nginx:1.13.5-alpine を使用します。

ポイントは depends_on で php のコンテナと連動させている部分でしょうか。

この web コンテナを起動すると php のコンテナも一緒に起動します。

default.conf ではホスト名に何が指定されても受け入れるようにしているくらいで、他には特別は設定はしていません。

server {
    listen 80;
    server_name _;

    root  /var/www/html;
    index index.php;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(\.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

PHPの設定

次に PHP の設定です。

$vi docker-compose.yml

php:
  container_name: php
  image: php:7.1.9-fpm-alpine
  volumes:
    - ./site/html:/var/www/html
    - ./site/conf/php.ini:/usr/local/etc/php/php.ini

イメージは php:7.1.9-fpm-alpine を使用します。

site/html 配下に index.php などの PHP ファイルを配備して、コンテナ側の /var/www/html にマウントされます。

また、もし PHP の設定で上書きしたい項目がある場合は site/conf/php.ini に定義をして、コンテナ側の /usr/local/etc/php/php.ini にマウントします。

コンテナの起動

docker-compose コマンドを使います。

$ docker-compose up -d web

これで、web と php のコンテナが起動します。

以下の docker または docker-compose コマンドの ps オプションで確認します。

$ docker ps

$ docker-compose ps

両方のコンテナが起動していれば完了です。

あとは、以下の URL にアクセスして動作確認してみましょう。

http://localhost:10080/

まとめ

Docker で Nginx と PHP を連動して動かす方法を紹介しました。

今回はシンプルな構成でしたが、以下のような開発時のちょっとしたモックを作る際に利用できます。

リクエストパラメータを受けて、そのパラメータを加工したレスポンスを返す

遷移先のサーバが別の文字コードを使っている場合の文字化けチェック

前者は外部の API サーバとまだ疎通できない場合に、自前でモックとして代用するようなケースですね。

後者は、外部のサービスの遷移先にパラメータを渡すけど外部のサーバの文字コードが違う場合、そして戻ってくる際も別の文字コードでパラメータが連携してくるパターンのような面倒な場合の代用ですね。

下手に自サイト内で別の文字コードを返すようなページを用意するよりも安全で確実です。

Web API The Good Parts

オライリーの「Web API」に特化した本です。最近の多くの Web サービスは API が活用されていますが、その技術はこれまでの Web サイトとそれほど大きく変わりません。

今後、マイクロサービス化が進む中で知っておいて損はない内容が詰め込まれており、現場のエンジニアやこれから Web 系のエンジニアを目指す人にもオススメの一冊です。

created by Rinker
¥2,376
(2018/10/19 13:59:11時点 Amazon調べ-詳細)