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 = 1
→xdebug.start_with_request = yes
xdebug.remote_host
→xdebug.client_host
xdebug.remote_port
→xdebug.client_port
xdebug.remote_log
→xdebug.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さわれなそう、、