[コピペでおk] DockerでPHPの環境構築

前回でDockerでnginxが動きHTMLがブラウザに表示されたと思いますが、今回はそのDockerでnginxとphp-fpmの連携までを行いPHPが実行できるところまで解説します。これができるとあとはデータベースをDockerで立ち上げれば一通りWEBアプリケーションの開発環境はできあがりです。

GitHub – gachi-engineer/lesson2-docker…

GitHub – gachi-engineer/lesson2-docker…

docker入門(nginxとphp-fpmの連携). Contribute to gachi-engineer/lesson2-docker-php-fpm development by creating an account on Gi…

docker入門(nginxとphp-fpmの連携). Contribute to gachi-engineer/lesson2-docker-php-fpm development by creating an account on Gi…

docker-compose.yml

やり方は色々あるのですがいちばん簡単で初学者でも迷子になりにくいものを利用します。それはDockerでそれぞれのOSSが出しているオフィシャルイメージを使う方法です。前回もnginxのオフィシャルイメージを使いました。今回も同じようにPHPがつくってくれているphp-fpmのオフィシャルイメージを使う方法を取ります。

docker-compose.ymlから解説します。

https://github.com/gachi-engineer/lesson2-docker-php-fpm/blob/master/docker/docker-compose.yml

services:
  myfirstapp-web:
    image: nginx:latest
    container_name: myfirstapp-web
    ports:
      - "8080:80"
    volumes:
      # ↓↓↓ ドキュメントルートのパスが変更されています ↓↓↓
      - ../src:/var/www/html

      # ↓↓↓ php-fpmと連携するためnginxの設定ファイルをマウントして読み込ませてます ↓↓↓
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

  # php-fpmは最新バージョンのPHPのオフィシャルイメージをもってくるだけです
  myfirstapp-app:
    image: php:8.3-fpm
    container_name: myfirstapp-app
    volumes:
     # ↓↓↓ WEBサーバと同じパスにPHPファイルをおくためです ↓↓↓
      - ../src:/var/www/html

前回のDocker入門と違うところは、nginxのドキュメントルートを変更したこととnginxの設定ファイルを読み込ませていることです。phpのdocker設定に関しては特筆すべきところはなく、volumesでパスをwebサーバと同じにしているというところだけです。

nginxのデフォルトパスだとphp-fpm側にパスがないためオーナーとパーミッションが揃わずうまく動きません。そのためにphp-fpm側のパスと同じ /var/www/html にnginx側も変更しています。

そしてnginxの設定ではphp-fpmのコンテナをfastcgiサーバとして指定して処理させるように設定ファイルをつくっています。デフォルトからそんなに変更することはなく必要最低限にとどめていますので初めてみる方でもそこまで迷子になることはないでしょう。

nginxの設定ファイル default.conf

前回のDocker入門と違うところは、rootっていう項目とphpが動くようにする設定です。少し長いために抜粋で行きたいとおもいます。rootという項目はドキュメントルートです。ドキュメントルートというのはWEBサーバが最初にベースとなるディレクトリを決めるところです。例えば /var/www/html とすればそのディレクトリの下に存在するファイルはWEBサーバは外に公開することができますが、それ以外のファイルやディレクトリは公開できません。

https://github.com/gachi-engineer/lesson2-docker-php-fpm/blob/master/docker/nginx/default.conf

    location / {
        # パスが変わっています
        root   /var/www/html;

        # URLが / だけで終わったときに探すファイルです、index.phpを一番前に指定しています。
        # なければ index.html index.htmと探します。すべてなければ 404 not foundになります。
        index  index.php index.html index.htm;
    }

中略)

    # URLの最後がphpで終わってるファイルはここで処理するという意味です
    location ~ \.php$ {
        # どこのfastcgiサーバに処理をお願いするか、ここではdocker内のphp-fpmなのでこういうふうに指定します
        fastcgi_pass   myfirstapp-app:9000;
        fastcgi_index  index.php;

        # スクリプトのファイル名と実際のパスのマッピングです
        # index.phpと来たら、/var/www/html/index.phpを実行するという意味です。
        fastcgi_param  SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;

        include        fastcgi_params;
    }

index.phpを用意する

もともとあったindex.htmlをindex.phpにして簡単なPHPコードを書きます。説明が不要なぐらい簡単な内容ですので、中身は特になんでもよいのでアレンジしてもらってもかまいません。

https://github.com/gachi-engineer/lesson2-docker-php-fpm/blob/master/src/index.php

echo は文字列を出力するという命令です。今回はHTMLコードと一緒に出力しているため、h1タグがブラウザ側で解釈されて文字が大きく太くなっていると思います。

WEBアプリケーションをつくるというのは、要するにHTMLコードを動的に出力するということです。これがはじめのはじめの第一歩です。楽しみですね、これから本格的なWEBアプリケーションをつくるのは。

dockerをたちあげる

いつものdockerを立ち上げます。これだけです。

hoge@localhost:$ cd docker
hoge@localhost:$ docker compose up -d

ブラウザでアクセスしてみる

以下のような画面が表示できれば成功です。

やっぱり人に教えてもらうのがいい

ガチエンジニアプログラミングスクールでいっしょに勉強していきませんか。より詳細な部分をお教えすることができますし、何よりマンツーマンレッスンなので個人の進み具合にあった指導が可能です。こんな質問してもいいのかなって不安に思うこともないですし、百戦錬磨の講師が手とり足取りお教えいたします。まずはお問い合わせ