Загрузка...

Установка LEMP c xdebug в Docker

Все примеры dev-сборок под докер в репозитории, каждая ветка в нём - отдельный инстанс lemp окружения в контексте конкретного фреймворка/cms. Список веток: https://github.com/alonelion1987/docker-test/branches

Не секрет, что перед тем как делать бэкенд на php, нужно иметь настроенное окружение (Linux, Nginx, MySQL/PostrgeSQL, PHP). Nginx в связке с PHP-FPM отлично работает и отдает статику, не задействуя для этого php там где не надо, а также обрабатывая множество соединении одновременно. Так что в заметке будут рассмотрены именно эти компоненты и написан примерный рабочий конфиг для этих вещей в докере. Также докер, если немного в нём разобраться очень удобен для быстрого развёртывания всех необходимых компонентов в системе (именно с теми расширениями, которые требуются), вместо того чтобы устанавливать и настраивать каждый пакет по отдельности и иметь головную боль со сменой версии, к примеру. Если пойти потом дальше и задействовать какой-нибудь механизм деплоя собранных образов на продашен, то получится очень быстрая система выкладки релизов приложения и единое с dev-версией окружение, но это уже тема отдельной заметки.

Рассмотрим примерное построение окружения версии nginx 1.16.1, php7.1-fpm, php7.1-cli (консольный образ для использования composer), mysql:8. Я специально взял где-то самые последние версии, а где-то нет (например php 7.1), чтобы продемонстрировать что в докере вы можете управлять любым количеством версии компонентов. Он при разворачивании умно все кэширует и пересобирает те, которые действительно надо пересобрать! Ещё для php мы подключим xdebug, создадим сеть и укажем для всех сервисов заранее определённый ip адрес, чтобы можно было подключить систему отладки в phpStorm через docker.

Для начала надо чтобы у вас был linux и PhpStorm IDE (я использую дистрибутив ubuntu), так как в linux по умолчанию заложен механизм работы с контейнерами, а докер лишь утилита, которая управляет всем этим. С другими ОС немного сложнее (например Windows), так как там приходится "притягивать за уши" поддержку контейнеризации из-за чего проигрыш в скорости и сложности настройки. Для работы нужно просто установить утилиты docker и docker-compose. А имея свой репозиторий с конфигами всех необходимых сервисов, вы сможете быстро приступить к работе на любом рабочем компьютере.

Структура php проекта

Я намеренно показал пустую папку prod здесь, подразумевая, что вы будете какими-либо специальными инструментами собирать образы для продакшена с помощью немного другого конфига docker-compose, построив таким образом весь жизненный цикл разработки с использованием docker. А здесь рассматривается тема dev-окружения.

Makefile (чтобы не вспоминать команды докера каждый раз), первоначальный запуск init:

up: docker-up   # поднять контейнеры
down: docker-down   # убить контейнеры
restart: docker-down docker-up   # перезапустить контейнеры
init: docker-down-clear docker-down docker-pull docker-build docker-up   # инициализировать контейнеры или перезапустить с очищением бд

docker-up:
	docker-compose up -d

docker-down:
	docker-compose down --remove-orphans

docker-down-clear:
	docker-compose down -v --remove-orphans

docker-pull:
	docker-compose pull

docker-build:
	docker-compose build

docker-compose.yml:

version: '3'
services:

    # web-server NGINX
    web-app-nginx:
        build:
            context: ./web-app/docker/dev
            dockerfile: nginx.docker
        volumes:
            - ./web-app:/container-app
        depends_on:
            - web-app-php-fpm
        ports:
            - "8888:80"
        networks:
            - inner

    # Server API: fast cgi process manager for web-server
    web-app-php-fpm:
        build:
            context: ./web-app/docker/dev
            dockerfile: php-fpm.docker
        volumes:
            - ./web-app:/container-app
        environment:
            XDEBUG_CONFIG: "remote_host=192.168.150.1 remote_enable=1"
            PHP_IDE_CONFIG: "serverName=Docker"
        depends_on:
            - web-app-mysql
        networks:
            - inner

    # php cli interface
    web-app-php-cli:
        build:
            context: ./web-app/docker/dev
            dockerfile: php-cli.docker
        volumes:
            - ./web-app:/container-app
            - composer:/root/.composer/cache
        depends_on:
            - web-app-mysql
        networks:
            - inner

    # mysql database
    web-app-mysql:
        image: mysql:8
        volumes:
            - web-app-mysql:/var/lib/mysql
        environment:
            MYSQL_DATABASE: webapp
            MYSQL_USER: user
            MYSQL_PASSWORD: pass
            MYSQL_ROOT_PASSWORD: root
        ports:
            - "33061:3306"
        networks:
            - inner

networks:
    inner:
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: 192.168.150.0/28

volumes:
    web-app-mysql:
    composer:

Раздел networks отвечает за создание сети, таким образом что сервис web-app-php-fpm и другие могли иметь ip 192.168.150.1 в этом примере, иначе при перезапуске ip каждый раз случайный. Это очень удобно, если командная разработка ведется. Если возникнет ошибка при рестарте докера с сообщением Pool overlaps with other one on this address space, попробуйте просто переназначить ip, например, на 192.168.149.0.

/test/web-app/docker/dev/nginx/default.conf:

# конфиг nginx
server {
    listen 80;
    index index.php index.html;
    server_name localhost 127.0.0.1;
    root /container-app/public;

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

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass web-app-php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_read_timeout 1000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

/test/web-app/docker/dev/php-fpm/php.ini:

max_execution_time = 1000
max_input_time = 1000

Чтобы сайт не падал при дефолтных значениях времени обработки запроса php, мы увеличиваем это в конфиге для php и прокинем их в контейнер в дальнейшем.

/test/web-app/docker/dev/nginx.docker:

FROM nginx:1.16.1-alpine

COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf

WORKDIR /container-app

/test/web-app/docker/dev/php-cli.docker:

FROM php:7.1-cli

RUN apt-get update && apt-get install -y zlib1g-dev zip && \
    docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd  && \
    docker-php-ext-install pdo pdo_mysql && \
    docker-php-ext-configure mysqli --with-mysqli=mysqlnd && \
    docker-php-ext-install mysqli && \
    docker-php-ext-install zip

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin --filename=composer --quiet

ENV COMPOSER_ALLOW_SUPERUSER 1

WORKDIR /container-app

После этого в терминале можно устанавливать пакеты через composer таким образом: docker-compose run --rm web-app-php-cli composer require <:package_name>

/test/web-app/docker/dev/php-fpm.docker:

FROM php:7.1-fpm

RUN apt-get update && apt-get install -y libjpeg-dev libpng-dev libfreetype6-dev && \
    docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd  && \
    docker-php-ext-install pdo pdo_mysql && \
    docker-php-ext-configure mysqli --with-mysqli=mysqlnd && \
    docker-php-ext-install mysqli && \
    docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/lib && \
    docker-php-ext-install gd && \

    # Установка и включение xdebug в php
    pecl install xdebug-2.6.0  && \
    docker-php-ext-enable xdebug

ADD ./php-fpm/php.ini /usr/local/etc/php/php.ini

ENV LOCALTIME Europe/Kaliningrad

WORKDIR /container-app

/test/web-app/public/index.php:

$x = 400; // test value, get it in xdebug!

phpinfo(); // set here breakpoint

Настройки PhpStorm

Ветка в репозитории: nginx_php-fpm_mysql_xdebug_test. Сам репозитории представляет из себя набор конфигов для докера и примеры установки различных фреймворков/микрофреймворков/cms в докере, распределённых по веткам. Репу создал для объединения как можно большего количества возможных систем. Сейчас там пока что есть ветка для slim, symfony4 и текущая. В дальнейшем буду пополнять коллекцию. Сейчас в планах сделать примитивную заготовку, распределенную систему в докере, фронтенд и бекенд с апи, таким образом во фронте можно использовать любой js-фреймворк, создавая spa-приложение.

Последующие скриншоты сделаны на основе проекта в этой ветке, так что лучше эту ветку склонировать к себе и настраивать. Весь код в начале статьи просто демонстрировал настройки из корневой папки проекта web-app, вместо app (как на скриншотах ниже).

После инициализации окружения в контейнерах и объединения их в общую сеть, можно приступить к настройке PhpStorm для работы с xdebug и проверяем что докер доступен из IDE:

Доступность докера

Добавляем докеровский php интерпретатор:

Докеровский php интерпретатор

Докеровский php интерпретатор

Докеровский php интерпретатор

Поднимаем контейнеры и в настройках PHP - Debug, нажимаем кнопку Validate, если всё как на скрине ниже, то все настройки выполнены верно.

Валидация

Добавляем соответствие путей в локальной системе и путей в папке контейнера

Соответствие путей

Добавляем конфигурацию:

Добавляем конфигурацию

Запускаем а потом обновляем страницу в браузере по адресу localhost:8888:

Запускаем

Вот и всё, xdebug настроен!



Похожие заметки:

Настраиваем IDE PhpStorm

В заметке рассматривается как создать новый проект и подключить его к удаленному web серверу или хостингу. Также покажу как настроить препроцессоры типа — SASS, для автоматической компиляции в CSS, без сторонних компиляторов, IDE умеет делать все сама.

Открыть здесь

Настраиваем XDebug в PhpStorm

Краткий обзор основной настройки и работы средства профилирования и отладки PHP скриптов для популярной IDE PhpStorm

Открыть здесь

Обзор CodeLobster IDE

CodeLobster IDE это удобная, бесплатная, кросс-платформенная IDE с поддержкой Drupal, Joomla, Twig, JQuery, CodeIgniter, CakePHP, Bootstrap, Laravel, Node.js, AngularJS, Symfony, Magento, Yii, WordPress

Открыть здесь


Перед тем как писать комментарии, рекомендую ознакомиться:

Markdown синтаксис »

Оформление кода »

Нужна аватарка »

Комментарии


2
avatar

Ivan сказал 13-10-2019 в 23:03


Привет, ошибка

Pool overlaps with other one on this address space

Не могу полечить, менял айпи диапазоны. Мало инфы по этой ошибке в Гугле. Что делать?


avatar

Админ

Роман Жариков сказал 14-10-2019 в 23:50

   В ответ на комментарии автора Ivan

Попробовать:

  • поднять сеть с другим драйвером, пост про сети
  • посмотреть сети и удалить все, которые не удалились: docker network ls -q | xargs docker network rm, перезапустить сам докер
  • возможно обновить IDE