Docker ComposeでNginxとphpを連携する
Docker Compose
で複数のコンテナの連携をしてNginx
でphp
を実行します。
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.yml
にphp
のコンテナを追記します。
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
のファイルがダウンロードされてしまいます。
Nginx
でphp
を認識するために、Nginx
の設定ファイルを編集する必要があります。
Nginxの設定ファイルの編集
Nginx
の設定ファイルは/etc/nginx/nginx.conf
ですが、このファイルを直接編集するのではなく、/etc/nginx/conf.d/
フォルダにXXX.conf
という形式のファイルを作成しておくとその設定が読み込まれる仕組みがあるので、これを利用します。(XXX.conf
のXXX
はどのような名前でも問題ありません)
今回はdefault.conf
という名前で設定ファイルを以下の場所に作成します。
- カレントディレクトリ
- docker
- web
- default.conf ←作成
- web
- docker-compose.yml
- index.html
- info.php
- docker
設定ファイルにphp
を読み込む設定を追記します。
fastcgi_pass
のapp
は先程設定した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
のバージョン情報などが表示されます。
以上でNginx
とphp
のコンテナの連携ができました。
phpの設定
文字コードやタイムゾーンなど、php
の設定を行います。
Nginx
の設定と同様に、ホスト側で作成したファイルをコンテナ側で読み込むようにします。
今回はphp.ini
という名前で設定ファイルを以下の場所に作成します。
- カレントディレクトリ
- docker
- web
- default.conf
- app
- php.ini ←作成
- web
- docker-compose.yml
- index.html
- info.php
- docker
設定内容は適宜変更してください。
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
コンテナを再起動すると、設定内容が読み込まれていることが確認できます。
php
でmysql
に接続する方法はDocker Composeでphpでmysqlにアクセスするで紹介します。