Docker に少しずつ慣れてきましたが、今回は動的なことをしたいモックサーバを急遽使いたかったので、ローカルの Docker で Nginx と PHP(php-fpm)が動作するコンテナを作成してみました。
それぞれのサーバの要件は以下の通り。
コンテナ上では80番ポートで起動する
ローカルのホストOS上では10080番で受ける
コンテナ起動時にconfファイルをマウントする
コンテナ上では9000番ポートで起動する
Nginxからは9000番ポートにリバースプロキシ
コンテナ起動時にphpファイルをマウントする
Nginx と php-fpm 間は UNIX ドメインソケットでも良かったかも・・・。
ローカルのファイルの準備
以下のようなディレクトリ構成を準備します。
最初はこのくらいシンプルに練習していけばいいと思います。
1 2 3 4 5 6 | site ├ conf │ ├ default.conf │ └ php.ini └ html └ index.php |
Nginxの設定
今回は、docker-compose.yml に設定を定義して運用を楽にしてみます。
まずは、Nginx の設定から。
1 2 3 4 5 6 7 8 9 10 11 | $ 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 ではホスト名に何が指定されても受け入れるようにしているくらいで、他には特別は設定はしていません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 の設定です。
1 2 3 4 5 6 7 8 | $ 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 コマンドを使います。
1 | $ docker-compose up -d web |
これで、web と php のコンテナが起動します。
以下の docker または docker-compose コマンドの ps オプションで確認します。
1 2 3 | $ docker ps $ docker-compose ps |
両方のコンテナが起動していれば完了です。
あとは、以下の URL にアクセスして動作確認してみましょう。
http://localhost:10080/
まとめ
Docker で Nginx と PHP を連動して動かす方法を紹介しました。
今回はシンプルな構成でしたが、以下のような開発時のちょっとしたモックを作る際に利用できます。
リクエストパラメータを受けて、そのパラメータを加工したレスポンスを返す
遷移先のサーバが別の文字コードを使っている場合の文字化けチェック
前者は外部の API サーバとまだ疎通できない場合に、自前でモックとして代用するようなケースですね。
後者は、外部のサービスの遷移先にパラメータを渡すけど外部のサーバの文字コードが違う場合、そして戻ってくる際も別の文字コードでパラメータが連携してくるパターンのような面倒な場合の代用ですね。
下手に自サイト内で別の文字コードを返すようなページを用意するよりも安全で確実です。