dockerでPHPの開発環境構築・リモートデバッグの設定

職場でLaravelを使っているため、勉強用にPHPの環境を構築しました。

環境はdockerで用意し、コンテナに対してリモートデバッグできるようにしました。

ディレクトリ構成

.
├── .vscode
│   └── launch.json
├── df-nginx.dockerfile
├── df-php.dockerfile
├── docker-compose.yml
├── nginx
│   └── nginx.conf
└── php
    ├── app
    │   └── index.php
    ├── log
    │   └── xdebug.log # Xdebugのログファイル
    └── php.ini #phpの設定ファイル

docker-compose.yml

version: '3'

services:
  php-fpm:
    container_name: php-fpm-dev
    build:
      context: .
      dockerfile: df-php.dockerfile
    tty: true
    volumes:
      - ./php/app:/usr/src/app
      - ./php/php.ini:/usr/local/etc/php/php.ini
      - ./php/log:/var/log

  nginx:
    container_name: nginx-dev
    build:
      context: .
      dockerfile: df-nginx.dockerfile
    depends_on:
      - php-fpm
    tty: true
    volumes:
      - ./php/app:/usr/share/nginx/html
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 10902:80

NginxとPHP-FPM、2つのコンテナを指定。

PHPのアプリケーションは両方のコンテナにマウントする必要があります。

Nginx周りの設定

df-nginx.dockerfile

Nginxのdockerfileはalpineのコンテナと作業ディレクトリを指定しているのみです。

FROM nginx:1.19.6-alpine

WORKDIR /usr/share/nginx/html

nginx.conf

Nginxのコンフィグファイル。 root はphp-fpm側のコンテナの、コードが置かれているディレクトリを指定します。

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    root /usr/src/app;
    index index.php index.html index.htm;
    try_files $uri $uri/ /index.php?q=$uri&$args;

    # pass the PHP scripts to FastCGI server listening on php-fpm:9000
    location ~ \.php$ {
       fastcgi_pass   php-fpm:9000;
       fastcgi_index  index.php;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include        fastcgi_params;
    }
}

fastcgi_pass にはdocker-composeで設定したphp-fpmのサービス名とポートを設定。

php-fpmはデフォルトで9000番ポートをLISTENしています。

PHP周りの設定

df-php.dockerfile

FROM php:8.0.1-fpm-alpine

WORKDIR /usr/src/app

RUN apk --no-cache update \
  && apk add autoconf build-base \
  && pecl install xdebug \
  && docker-php-ext-enable xdebug

デバッグできるように、xdebugをインストールしています。

php.ini

Xdebugの設定をphp.iniに書いています。コメントアウトした設定項目については後述します。

[xdebug]
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = "host.docker.internal"
xdebug.client_port = 10903
xdebug.log = "/var/log/xdebug.log"
# If using Xdebug2, use the below.
# [xdebug]
# xdebug.remote_enable = 1
# xdebug.remote_autostart = 1
# xdebug.remote_host = "host.docker.internal"
# xdebug.remote_port = 10903
# xdebug.remote_log = "/var/log/xdebug.log"

Xdebugの設定について

PHP8になってから、Xdebugも2→3にアップデートされ、いくつかの設定項目が変更されたようです。

つまり、Xdebug2で設定したいくつかの項目は書き換える必要があります。

↓例えば下記のような設定だった場合

# php.ini, Xdebug2
[xdebug]
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_host = "host.docker.internal"
xdebug.remote_port = 9012
xdebug.remote_log = "/var/log/xdebug.log"

↓次のように書き換えます

  • xdebug.remote_enable = 1 → xdebug.mode = debug
  • xdebug.remote_autostart = 1xdebug.start_with_request = yes
  • xdebug.remote_hostxdebug.client_host
  • xdebug.remote_portxdebug.client_port
  • xdebug.remote_logxdebug.log
# php.ini, Xdebug2
[xdebug]
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = "host.docker.internal"
xdebug.client_port = 9012
xdebug.log = "/var/log/xdebug.log"

他に変更が必要な項目があれば、 アップグレードガイド を参考に設定します。

VS Codeの設定

必要なプラグイン(PHP-Debug)をインストールし、 launch.json を下記のように設定します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 10903,
            "pathMappings": {
                 "/usr/src/app": "${workspaceFolder}/php/app"
             }
        },
    ]
}

pathMappings: を挟んで左側にコンテナのディレクトリ、右側にホスト側のディレクトリを指定します。

コンテナの起動

docker-compo up -d でコンテナが起動します。

デバッグ

ブレークポイントを指定し、ブラウザからphpファイルを開くといい感じにデバッグできました。

ターミナルから php index.php という風に実行しても、しっかりブレークポイントで止まってくれます。

まとめ

次はLaravelのデバッグができるように、環境を整えようかと思います。

https://github.com/hodanov/docker-template-php

しばらくはGoさわれなそう、、