Dockerizuota PHP v7.4 aplinka su XDebug v3

Tikslas: savo kompiuteryje noriu turėti Dockerizuotą webserverį su PHP bei galimybe debuginti kodą.

Kodėl man tai patinka:

  • Nesuku galvos dėl PHP ir įvairių bibliotekų versijų skirtumų tarp mano kompiuterio ir Dockerizuotos aplinkos
  • Šią aplinką galės atkurti bet kuris kitas žmogus, o ir aš pats vėliau ar tiesiog kitame kompiuteryje
  • Jei reikia, galima gana tiksliai atkurti programinės įrangos kombinaciją net ir pačiame LIVE serveryje. Tarkim dėl „priežasčių” yra tebenaudojama sena biblioteka ir t.t. ir pan.

Pradėkime nuo recepto, kaip atrodys mūsų Docker image:

Dockerfile

FROM php:7-apache

COPY provision/http-site.conf /etc/apache2/sites-available/000-default.conf
COPY provision/https-site.conf /etc/apache2/sites-available/default-ssl.conf

RUN apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends ssl-cert \
    && pecl channel-update pecl.php.net \
    && pecl install xdebug-3.0.2 \
    && docker-php-ext-enable xdebug \
    && echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.discover_client_host=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && a2ensite 000-default default-ssl \
    && a2enmod rewrite ssl \
    && apt-get clean -y && apt-get autoremove -y \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

Įkopijuotuose 000-default.cnf bei default-ssl.conf failuose nuo default varianto pakeista tik ši dalis:

ErrorLog /dev/stderr
CustomLog /dev/stdout combined

Tam, kad Dockerio konteinerių generuojami pranešimai ir klaidos būtų patogiai matomi konsolėje ir nereikėtų landžioti po Apache LOG failus.

xdebug.ini

XDebug pereinant iš versijos 2 į 3 įvyko šiokie tokie pokyčiai ir nuo šiol pakanka dviejų eilučių konfiguraciniame faile:

xdebug.mode=debug
xdebug.discover_client_host=1

Kaip įjungti/išjungti?

Naršyklių plėtiniai, kurie padės valdyti debuginimo režimą:

Galimos kliūtys

Ugniasienė. Jei pastaroji įjungta, IDE gali nematyti XDebug’o. Rekomenduoju patikrinti ar praleidžiamas 9003 (XDebug’o) port’as.