Dockerを使ってNginxでPHPが表示されるようにやってみた

Nginx側

server {
    listen 80;
    root /usr/share/nginx/html;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

別コンテナにあるphp-fpmを利用するようにするのでfastcgi_passにはコンテナ起動時に指定する--nameの名前を指定。index.phpは適当にphpinfoするだけのスクリプトだけ作っておいてあとはDockerfileを作るだけ

FROM nginx
COPY index.php /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80

あとはビルドしておく

docker buildx build -t nginx .

php-fpm側

php-fpmの設定をデプロイするためphp-fpm.confを作成

listen = 0.0.0.0:9000

んでphp-fpmの設定をデプロイしてphp-fpmが起動するようにDockerfileを作成

FROM php:8.2-fpm
COPY php-fpm.conf /usr/local/etc/php-fpm.d/
EXPOSE 9000

あとはビルドしておく。ちなみにDockerでPHPの拡張モジュールとかの設定をする場合にはhttps://hub.docker.com/_/phpのPHP Core Extensionsセクションを参考に

docker buildx build -t php-fpm

コンテナの起動

起動する前に同じネットワークを使用するようにするのでDocker Networkを作る

docker network create --subnet 172.16.0.0/16 --attachable mynet

んでまずphp-fpm側を先に起動する(fastcgi_passの名前解決ができないため)

docker run -d --name=php-fpm --net=mynet --expose=9000 -v www:/usr/share/nginx/html -t php-fpm

Docker Volumeを指定してNginx側が使用するファイルを参照できるようにしておく。あとはNginx側を起動

docker run -d -p 80:80 --net=mynet -v www:/usr/share/nginx/html -t nginx

あとはNginx側にアクセスしてみてちゃんとPHPが処理されて表示されるか確認

余談

Docker Composeを使用していない理由はDockerの基本的な基礎を学ぶためにあえて使用してない。まあDocker Compose使った方が圧倒的に楽なんでしょうけどw