zukucode
主にWEB関連の情報を技術メモとして発信しています。

Docker ComposeでNginxとphpを連携する

Docker Composeで複数のコンテナの連携をしてNginxphpを実行します。

Nginxの設定

まずはNginxのコンテナを作成します。webというサービス名で作成します。

docker-compose.yml
version: '3'
services:
  web:
    image: nginx
    volumes:
      - .:/usr/share/nginx/html
    ports:
      - "8080:80"

動作確認用にdocker-compose.ymlと同じ場所にhtmlファイルを作成します。

  • カレントディレクトリ
    • docker-compose.yml
    • index.html
index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <p>nginxとphpの連携テスト</p>
  </body>
</html>

以下のコマンドでコンテナを実行します。

$ docker-compose up -d

ブラウザでlocalhost:8080にアクセスすると、htmlの内容が表示されることを確認できます。

続いてphpのコンテナの設定をするため、起動したコンテナを停止しておきます。

$ docker-compose stop

phpの設定

次にphpのコンテナを作成します。

appというサービス名で作成します。このサービス名は後ほど使用するため、覚えておいてください。

docker-compose.ymlphpのコンテナを追記します。

docker-compose.yml
version: '3'
services:
  web:
    image: nginx
    volumes:
      - .:/usr/share/nginx/html
    ports:
      - "8080:80"
  app:
    image: php:7-fpm
    volumes:
      - .:/usr/share/nginx/html

動作確認用にdocker-compose.ymlと同じ場所にinfo.phpファイルを作成します。

  • カレントディレクトリ
    • docker-compose.yml
    • index.html
    • info.php
info.php
<?php phpinfo();

コンテナを起動し、ブラウザでlocalhost:8080/info.phpにアクセスすると、phpの情報が表示されるのではなく、info.phpのファイルがダウンロードされてしまいます。

Nginxphpを認識するために、Nginxの設定ファイルを編集する必要があります。

Nginxの設定ファイルの編集

Nginxの設定ファイルは/etc/nginx/nginx.confですが、このファイルを直接編集するのではなく、/etc/nginx/conf.d/フォルダにXXX.confという形式のファイルを作成しておくとその設定が読み込まれる仕組みがあるので、これを利用します。(XXX.confXXXはどのような名前でも問題ありません)

今回はdefault.confという名前で設定ファイルを以下の場所に作成します。

  • カレントディレクトリ
    • docker
      • web
        • default.conf ←作成
    • docker-compose.yml
    • index.html
    • info.php

設定ファイルにphpを読み込む設定を追記します。

fastcgi_passappは先程設定したphpのサービス名です。

また、ドキュメントルートのフォルダを一般的な/var/www/htmlに変更しています。

default.conf
server {
  root  /var/www/html;
  index index.php index.html;

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

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   app:9000;
    fastcgi_index  index.php;

    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
  }
}

また、docker-compose.ymlに以下を追記します。

先ほど作成した設定ファイルをNginxのコンテナで参照するようにボリュームに設定します。

また、設定ファイルでappのサービス名を指定しているため、このコンテナを起動するより先にappのコンテナを起動するようにdepends_onの設定を追加しています。

設定ファイルでドキュメントルートも変更したため、その部分も変更します。

docker-compose.yml
version: '3'
services:
  web:
    image: nginx
    depends_on:
      - app
    ports:
      - "8080:80"
    volumes:
      - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html
      - .:/usr/share/nginx/html
  app:
    image: php:7-fpm
    volumes:
      - .:/var/www/html
      - .:/usr/share/nginx/html

コンテナを再起動してブラウザでlocalhost:8080にアクセスすると、phpのバージョン情報などが表示されます。

以上でNginxphpのコンテナの連携ができました。

phpの設定

文字コードやタイムゾーンなど、phpの設定を行います。

Nginxの設定と同様に、ホスト側で作成したファイルをコンテナ側で読み込むようにします。

今回はphp.iniという名前で設定ファイルを以下の場所に作成します。

  • カレントディレクトリ
    • docker
      • web
        • default.conf
      • app
        • php.ini ←作成
    • docker-compose.yml
    • index.html
    • info.php

設定内容は適宜変更してください。

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

設定ファイルを読み込むようにボリュームの設定に追記します。

docker-compose.yml
  app:
    image: php:7-fpm
    volumes:
       - .:/var/www/html
       - ./docker/app/php.ini:/usr/local/etc/php/php.ini

コンテナを再起動すると、設定内容が読み込まれていることが確認できます。

phpmysqlに接続する方法はDocker Composeでphpでmysqlにアクセスするで紹介します。


関連記事