PHPの勉強用に「折角だからnginxをdockerで立てて使おう〜」と軽い気持ちでコンテナ立てて実行しようとしたところ「コンテナのnginxのドキュメントルートにどうやってファイル置くんだろ。」とか「もしかしてコンテナ入って置かないとダメ?」とか前知識が無くて全然うまく行かず。。
docker-composeを使って速攻で準備
出来ねぇ出来ねぇボヤいてたらwebエンジニアにdocker-composeを使って速攻でその辺の環境を作る方法を教えてもらいました。
コンテナを立てたい場所に下記のdocker-compose.yml
ファイルを作成します。
[docker-compose.yml]
### nginxでphpをブラウザ上に表記するのに必要なコンテナ一式。
version: '3'
services:
app:
image: laradock/php-fpm:2.2-7.2
# ローカルのカレントディレクトリに格納したファイルをコンテナの/var/phpappにマウントする
volumes:
- ./:/var/phpapp/
nginx:
image: nginx:latest
# 8080ポートから来た接続をコンテナの80番ポートに連携する
ports:
- "8080:80"
volumes:
# ローカルの./docker/nginx/nginx.confのをnginxコンテナの/etc/nginx/conf.d/default.confにマウントする
- ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
# ローカルカレントディレクトリをコンテナの/var/phpappにマウント
- ./:/var/phpapp/
mysql:
image: mysql:5.7
# 33306ポートから来た接続をコンテナの3306番ポートに連携する
ports:
- 33306:3306
volumes:
- ./testdata/:/data
environment:
MYSQL_DATABASE: app
MYSQL_ROOT_PASSWORD: root
あとnginx.confの内容を下記にします。
これはローカルの.docker/nginx/nginx.conf
に作成してください。
[nginx.conf]
server {
listen 80;
server_name localhost;
root /var/phpapp/web;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
nginx.confの方は深く説明しませんが、この設定にしておけばローカルのカレントディレクトリのweb
フォルダに格納したPHPファイルはちゃんと処理されてブラウザ上で表示されます。
あとはdocker-composeファイルを起動させれば準備完了します!
$ docker-compose up -d
出来たものはこちらです。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04e0f98cc4ef mysql:5.7 "docker-entrypoint.s…" 7 hours ago Up 7 hours 33060/tcp, 0.0.0.0:33306->3306/tcp memo_keizi_mysql_1
8c0639887fb3 laradock/php-fpm:2.2-7.2 "docker-php-entrypoi…" 23 hours ago Up 23 hours 9000/tcp memo_keizi_app_1
c3574c4c67b9 nginx:latest "nginx -g 'daemon of…" 34 hours ago Up 33 hours 0.0.0.0:8080->80/tcp memo_keizi_nginx_1
IMAGE
のところがdocker-composeのimage
で記述したものになっています。
PHPをブラウザで表示させるところまで確認する
折角なので格納したPHPファイルがブラウザ上で表示されるところまで確認します。
※今回MySQLは使用しません。
nginx.confで設定したroot /var/phpapp/web;
によりwebフォルダがドキュメントルートになります。
カレントディレクトリにwebフォルダを作成し、PHPファイルを格納します。
$ ls web/
index.php
ファイルの内容はありきたりですが、Hello World出力で。。
[index.php]
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php echo '<p>Hello World</p>'; ?>
</body>
</html>
http://localhost:8080/
でアクセスすると、、
問題なく出力されました。
このwebフォルダにPHPのファイルを入れてパス指定すれば問題なく起動します。
終わりに
半端な知識で「nginxはコンテナで!PHPはローカルに入ってるからそれで勝手に処理してくれるでしょ!」くらいの軽い気持ちでやったら泥沼でした。。