Docker ComposeでNginxとphpを連携する
Docker Composeで複数のコンテナの連携をしてNginxでphpを実行します。
Nginxの設定
まずはNginxのコンテナを作成します。webというサービス名で作成します。
docker-compose.ymlversion: '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 stopphpの設定
次にphpのコンテナを作成します。
appというサービス名で作成します。このサービス名は後ほど使用するため、覚えておいてください。
docker-compose.ymlにphpのコンテナを追記します。
docker-compose.ymlversion: '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.confserver {
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.ymlversion: '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にアクセスするで紹介します。