Xdebug для Docker в PhpStorm

Установка Xdebug в Docker-образы. Настройка отладки консольных скриптов. Подключение к PhpStorm для отладки веб-скриптов в PHP-FPM.

Скрытый контент
Комментарии (73)
Arunas

спасибо

Ответить
Алексей

Как всегда все отлично! Но.

-- Для локальной разработки я все-таки предпочитаю оф. образ php:7.4-fpm, не alpine. Это чисто мое личное предпочтение

-- А команды ip в нем нет почему то. Т.е.

HOST_IP=$(ip route | awk 'NR==1 {print $3}')

вылетает с ошибкой

Поэтому мне, лично, кажется более предпочтительным вариант с явной настройкой сети

networks:
    internal:
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: 192.168.200.0/28

И явной передачей параметров для xdebug в docker-compose.yml файле

    api-php-fpm:
        build:
            context: api/docker
            dockerfile: development/php-fpm/Dockerfile
            args:
                - USER_ID
                - GROUP_ID
        volumes:
            - ./api:/app
        environment:
            APP_ENV: dev
            APP_DEBUG: 1
            XDEBUG_CONFIG: " remote_host=192.168.200.1 remote_enable=1  remote_port=9000"
            PHP_IDE_CONFIG: "serverName=api"
        networks:
            - internal

Но тут как раз тот случай когда на вкус и цвет все фломастеры разные :)

Ответить
Ruslan

Я так понял, вы приватный докер реджестри установили. Каким мануалом пользовались, ссылкой не поделитесь?

Ответить
Алексей

Дмитрий, еще раз огромный респект за уроки, но мне всё таки пришлось закостылить после внимательного изучения Ваших эпизодов.

В чем проблема?

Для учебы я подняли vds на vscale.io За 400 руб.

Поднимать еще один образ для учебы, для реестра образов докера - уже напряжно.

Вопрос: как поднять на одной виртуальной машине всё?

И реестр, и всё, остальное?

Ответить
Дмитрий Елисеев

Можно поднять реестр на 5000 порту и везде использовать REGISTRY=site.com:5000

Либо использовать любой сторонний реестр на бесплатном тарифе.

Ответить
Алексей

Ссылки нет - использовал околонаучный метод тыка. С удовольствием поделюсь своими изысканиями, если найдете меня в скайпе по логину proctoleha

Ответить
Алексей

По поводу приватного докер репозитория: в чисто учебных целях залил на гит проект, который, в числе прочего, через Ansible, разворачивает приватный докер репозиторий, в парадигме данного курса.

https://github.com/ale10257/ansible-playbook-with-docer-registry

Ответить
Ruslan

Вижу дожили до этого урока двое. Напишите на какой платформе вы держите разработку?

К примеру, мне удалось запустить всё под Windows.

Ответить
Алексей

Снимаю шляпу. Даже примерно не представляю как можно запускать все это под виндой. У меня минт 18.3

Ответить
Ruslan

Вы используете Минт как единственую ОС для пользования, или это отдельная загрузка специально для разработки? Часто из-за того , что работаю на Винде, а деплою на Линукс и возникающих проблем задумываюсь о переходе на Линукс.

Ответить
Алексей

Мой ноут - это мой главный рабочий инструмент для работы - т.е. для зарабатывания денег. Поэтому linux only. Никаких игрушек, ничего лишнего. Только линукс, и никакой головной боли при разработке

В виртулке стоит windows 7, и, кстати, её образ занимает всех больше места. У меня ssd на 240 гигабайт, приходится следить :)

Ответить
BATPYIIIKOB

Полгода как полностью работаю только на Ubuntu 18.04. Было нелегко :) , но со временем нашёл все аналоги нужного ПО, либо установил через Wine

Ответить
Sergei

У меня тоже все под виндой встало без проблем.

Ответить
Ruslan

А что вы использовали (swl, Docker descktop or ...) ? И дошли ли вы до тестов?

Ответить
Дмитрий Ориховский

У меня на mac os catalina тоже все работает:)

Ответить
Ruslan

На Мас нужно много дополнительного софта и танцев с бубном, или там и из коробки работает?

Ответить
Дмитрий Ориховский

Все работает почти как в линукс. Устанавливаеш Docker for mac и все норм работает.

Ответить
Алекс

Сначала пробовал под windows 10 используя wsl 2, но постоянно были проблемы с быстродействием и PHPstorm ( рассинхрон файловой системы ). в итоге перешел на убунту, полет нормальный

Ответить
Konstantin

Дома на Ubuntu поднял, конечно же без проблем. На работе на windows + прокст

Ответить
Ruslan

Подробнее можете рассказать? У меня в дальнейшем на одном ПК просто перестало работать, на втором я так и не смог нормально запустить тесты. Попробую уйти на виртуалбокс и в нем докер поднимать.

Ответить
Konstantin

Windows 10 поддерживает подсистемы. Набери в store "Ubuntu". Поставь её и там работай

Ответить
Konstantin

Docker в Windows 10 у меня работает только в консоли

Ответить
Ruslan

Вас еще ждут разочарования. Некоторые имиджи под винду не работают (или не корректно работают) на линуксе, а в этом курсе имидж создается на хосте и деплоится в прод.

С WSL у вас будут сложности ставить Xdebug в PhpStorm.

Ответить
Konstantin

Все работает одинаково, как в виде так и в линукс

Ответить
Ruslan

Покажите вашу сборку. и Дойдите на ней до 11го пункта.

Ответить
Ruslan

Мои трудности в этом курсе: Мне только вчера удалось действительно всё запустить без ошибок (xdebug еще не тестил).

Ответить
Алексей

У мена главная засада была с Ансамблем. Долго я его крутил, чтобы хоть чуть-чуть проникнуться

Ответить
Ruslan

Я его уже год использую. Он мне и понравился тем, что записал все команды как в блокнот и расскатывай всё за пять минут. Раньше установка почтового сервера занимала пол дня, теперь с проверкой минут 10ть.

Ответить
Sam

Всем доброго дня

Есть одно замечание(вопрос) Проект размером +- 100Гб И если пытаться его впихнуть в папку public через волюмы и там уже запускать то возникают проблемы с контекстом а именно очень, ну очень долго создается образ

решается добавлением файла .dockerignore

вот образ построенный по вашим урокам. https://github.com/samwolf1982/nginx-php_fpm-redis-msql-starter_docker

Ответить
Ruslan

100Гб это ресурсы какие-то. И вы делаете COPY , а не VOLUME?

Ответить
Sam

обычный проект, сайт-магазин, куча фото делал не COPY.

volumes:
  - type: bind
    source: ./public
    target: /var/www
Ответить
Алекс

Фото желательно на отдельном сервере держать

Ответить
fedot

Дмитрий, большое спасибо за уроки, очень много ценной инфы, будет ли вариантов скриптов ансамбля безо всяких докеров? к примеру что бы он установил все на одну виртуалку, докер конечно крут, но если там что то отклеится, то можно очень долго ковыряться, а если к примеру надо запустить проект быстро, то можно найти много проблем, к концу урока наверное вообще пачка контейнеров будет и как искать что именно отвалилось не совсем понятно, я имею ввиду не ошибки в коде, а функционирование самого сервера.
Получится что один лог здесь, другой там не особо удобно быстро искать проблему.

Ответить
Руслан

Полагаю, поднять все без докера на предустановленном сервере как раз очень просто. Автоматизация же настройки голого сервера будет зависеть от конкретной конфигурации его ОС, и всех сервисов под нее. Поэтому написать и протестировать универсальные на все случаи ansible скрипты будет сложно.

Включение организации рабочего процесса с докером для унификации local/staging/production окружений и автоматизация развертывания их конфигураций с ansible очень порадовали, огромнейший респект Дмитрию!

Забегая наперед интересует, будет ли урок по организации мониторинга работы всех контейнеров, автоматизация их перезапуска при падении (k8s etc.), а также как мониторить работу отдельных сервисов приложения (в т.ч. на использование ресурсов)? Может есть практика сливать/мониторить логи приложений со всех докеров в единый и какой-то удобный механизм его мониторить (ElasticSearch/Kibana etc.)?

Спасибо.

Ответить
fedot

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

Ответить
Дмитрий Елисеев

Такое усилие с обратным пробросом портов понадбилось только для установки Xdebug.

А так да, Docker - это другой образ жизни со своими утиллитами.

Ответить
fedot

Думаю к концу курса прояснится насколько докер удобен и необходим на проде, пока особых плюсов не вижу, настроить удаленную виртуалку подключить себе гит и спокойно деплоить файлы, пока как то привычнее, все в файловой системе, никаких скрытых контейнеров, спокойно зашел куда понадобилось в данные момент и сделал свое дело. Если куча непонятного народа работает над проектом до да, такая унификация конечно будет сильно облегчать взаимодействие, а если всего несколько человек, которые свое дело знают, то плюсы непонятны, кучу доп инфы поднимать нужно, что бы разобраться, а где время брать и окупится ли такое его вложение. И если нода добавится, как с ней будет вообще непонятно, там куча модулей сборщиков и прочих утилит.

Ответить
Дмитрий Елисеев

Забегая наперед интересует, будет ли урок по организации мониторинга работы всех контейнеров, автоматизация их перезапуска при падении.

Они и сейчас перезапускаются с restart: always. Продвинутее с health checks будет при использовании Docker Swarm и K8s.

А также как мониторить работу отдельных сервисов приложения (в т.ч. на использование ресурсов)

Для этого как раз используют ElasticSearch и Kibana с различными Beats для сбора статистики.

Может есть практика сливать/мониторить логи приложений со всех докеров в единый и какой-то удобный механизм его мониторить?

Аналогично через Logstash и подобные агенты собирают все логи в ElasticSearch для Kibana.

Ответить
fedot

Большое спасибо, то что надо

Ответить
Роман

У вас в create_certbot идет установка из ppa:certbot/certbot, у Дмитрия из deb ftp.debian.org/debian buster-backports main. В чем принципиальная разница? И есть ли она.

Небольшое наблюдение: на самом деле я пытался вручную без плейбуков добавить репозитории как у Дмитрия, потом сделать установку certbot, начинал ругаться на верификацию потом, когда пытался сделать apt-get update и дальнейшие действия прекращались

Ответить
Алексей

ppa:certbot - это репы для убунты

buster-backports - для debian

Ответить
Bondarenko Alexandr

Добрый день! Планируется ли снять ролик о деплое динамических окружений (каждая фича развертывается на своем поддомене)? Было бы очень здорово и актуально.

Ответить
Дмитрий Елисеев

Это сложнее, но редко нужно. Проще сделать develop ветку с поддоменом и фичи мержить в неё.

Если нужно посмотреть работу фичи, то можно просто перейти по git checkout на ветку и запустить make init локально. А при работе по подходу с Feature Toggles разработка фич ведётся без ответвлений прямо в основной ветке.

А вообще поддомены можно включить добавлением A-записи * к домену. Либо использовать один тестовый поддомен и сертификат и просто поднимать фичи на разных портах, вычисляемых по имени ветки.

Ответить
Александр

Очень полезный был бы урок по стратегиях записи и сбора логов, да и про elk стек вцелом, как инструмента.

Ответить
Роман

Про xdebug - супер! Особенно такой интересный трюк с host.docker.internal. Очень познавательно, если разработка через докер затрагивает также и участников на винде и маке. Спасибо!

Ответить
Sergei

Я иногда в шоке, как вы вообще добираетесь до таких мелочей, дополнительные сетевые слои у винды/мака, первый IP всегда шлюз, установить в конфиге серверное имя, чтобы его шторм мог по имени отлавливать. Тут вообще черный пояс по докеру и шторму. Вы там похоже в документациях ночуете :) Только какая роль дебаг плагина в хроме? Куда он запросы шлет? Если у нас php-fpm отправляет инфу из контейнера в наружу.

Ответить
Дмитрий Елисеев

Вы там похоже в документациях ночуете :)

Приходится :)

Только какая роль дебаг плагина в хроме?

Плагин просто ко всем запросам из браузера добавляет маркерную куку XDEBUG_SESSION со значением из его настроек. Её видит Xdebug в php-fpm, включается и подключается оттуда к PhpStorm по адресу <phpstorm_ip>:9000 из remote_host и remote_port.

Ответить
Sergei

Спасибо!

Ответить
Ruslan

Я дошел до этого момента и скажу, что по моим наблюдениям Докер под Windows работает как-то по другому.

У меня сейчас Docker Desktop Edge 2.1 под WSL2.

Странность в том , что если я применяю наш патч-скрипт для унификации, то контейнеры отваливаются. Я стал смотреть адреса не устанавливая патча:

Если смотреть из виндовс консоли, то :

docker exec -it site_api-php-fpm_1 ping -q -c1 host.docker.internal
PING host.docker.internal (192.168.65.2): 56 data bytes

А если :

docker exec -it site_api-php-fpm_1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
    link/sit 0.0.0.0 brd 0.0.0.0
63: eth0@if64: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:15:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.21.0.4/16 brd 172.21.255.255 scope global eth0
       valid_lft forever preferred_lft forever

ipconfig на хост машине:

Ethernet adapter vEthernet (WSL):

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::f0b1:ecf1:df99:e1ab%68
   IPv4 Address. . . . . . . . . . . : 172.21.0.1
   Subnet Mask . . . . . . . . . . . : 255.255.240.0
   Default Gateway . . . . . . . . . :

а такой сети нет 192.168.65.0

Как тогда это всё общается?

Ответить
Дмитрий Елисеев

Да, у нового подхода с WSL свои нюансы. Можете поисследовать в своей системе, как они там общаются в новом варианте виртуализации.

Ответить
Илья

Столкнулся с проблемой, что phpstrom не видит установленного xdebug во вкладке cli interpreters, когда настраиваю интерпретатор из докера. Само расширение установил, докер файлы один в один с вашими, но на этапе настройки интерпретатора xdebug не видится, дальше, соответственно, тоже - отладка не запускается.

Ответить
Илья

Забыл добавить: версия php тоже не определяется. PHP version: Not installed, Debugger: Not installed. Но контейнер то он определил и cli работает корректно

Ответить
Илья

Решил вопрос сменой источника интерпретатора: поменял docker-compose на docker, и версии определились. Dockre-compose почему-то не работает корректно.

Ответить
Ruslan

Вы же понимаете, что это почти обертка. У вас что-то в композере ни так установлено. (ИХМО)

Ответить
Александр

Такая же проблема ни php ни debuger не определяется в api-php-cli , код взял с комитта - Configured API web debug 24.12.2019

Ответить
Александр

тоже помог вариант - поменял docker-compose на docker,

Ответить
Дмитрий Елисеев

Чтобы применились все изменения из докерфайлов нужно не забывать пересобирать образы и перезапускать контейнеры вызовом docker-compose up --build d

Ответить
elmut

Соединение не было установлено. Возможно, 'xdebug.remote_host = docker.for.win.localhost' неправильный решение

это связано с тем, что в Docker в варианте Toolbox для Windows заполнитель docker.for.win.localhost не заполнен. Таким образом, IP-адрес компьютера PHPStorm должен быть установлен вручную.

Чтобы сделать это, вы вручную устанавливаете значение xdebug.remote_host равным 192.168.99.1 (IP Docker устанавливает для хоста, может изменять) параметры интерпретатора cli:

Ура заработало после 3 дней.

Ответить
Сергей

У меня тоже похожая ошибка. Connection was not established. Probably xdebug.remote_host=host.docker.internal is incorrect. macOS Catalina Когда делаю пинг

docker-compose exec api-php-fpm ping host.docker.internal

PING host.docker.internal (192.168.65.2): 56 data bytes
64 bytes from 192.168.65.2: seq=0 ttl=37 time=0.336 ms
64 bytes from 192.168.65.2: seq=1 ttl=37 time=0.873 ms
64 bytes from 192.168.65.2: seq=2 ttl=37 time=0.689 ms
64 bytes from 192.168.65.2: seq=3 ttl=37 time=0.502 ms

--- host.docker.internal ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.336/0.600/0.873 ms

адрес не докера, а локальный почему-то : (

Ответить
Сергей

В /etc/hosts ничего не прописалось

Ответить
Олег

Приветсвую. Смогли решить проблему? Такая же ситуация с маком На оф сайте PhpStrom такой вопрос поднимался, говорят прописать remote_host=docker.for.mac.host.internal, но к сожалению не помогает

Ответить
Сергей

Нет, пока не смог : ( Пробовал такое же.

Ответить
Олег

Поискав инфу на куче форумов удалось завести дебагер на Mac.

1) add into .docksal/etc/php/php.ini: [xdebug] xdebug.remote_connect_back = 0 xdebug.idekey = "PHPSTORM" xdebug.remote_host = 10.254.254.254

я добавил данные параметры в api/docker/development/php/conf.d/xdebug.ini

2) create a new network alias on your host machine: sudo ifconfig lo0 alias 10.254.254.254

тут как есть

3) потом я пересобрал контейнеры запустив make init

4) залез в api/bin/app.php, поставил точку останова, запустил дебагер. Он поругался что remote_host=...блабла. В сплывшем окне нажал на "изменить remote_host" и указал 10.254.254.254

И дебагер заработал

Честно сказать до конца не разобрался, в чем причина

https://docs.docker.com/docker-for-mac/networking/#there-is-no-docker0-bridge-on-macos

вот такая инфа есть на оф документации докера. что то у них там не так с сетью на маках. Может @Дмитрий знает и сможешь подсказать

Недавно пересел с убунты на мак, и как то всё не так привычно и не так гладко)

Ответить
Олег

короче надо было смотреть видео до конца, а я сразу полез на форумы, как что то пошло не так. а оказывается Дмитрий все рассказал далее Дмитрий, спасибо!

Ответить
Сергей

Видимо я невнимательно слушал, я попробую, спасибо! А почему хост такой? Он разве не динамический?

Ответить
elmut

Docker Quickstart Terminal for windows 10

php-fpm:
    container_name: php-fpm # Назовем свой контейнер по красивому
    build: # Билдим с помощью dockerfile указав директорию где он лежит
        context: ./docker/App
        dockerfile: development/php-fpm/Dockerfile
    volumes: # Проброс папок
        - ./App:/app
    depends_on: # Укажем зависимости
        - redis
        - mailer
        - centrifugo
        - postgres
        - rabbitmq
    extra_hosts:
        - " host.docker.internal: 192.168.99.1 "
    environment:
        APP_ENV: dev
        APP_DEBUG: 1
        XDEBUG_CONFIG: remote_host=192.168.99.1
        PHP_IDE_CONFIG: "serverName=APP"
    networks:
        - web_frontend
Ответить
bogdan

супер. спасибо! как раз разобрана трабла с дебаггером на маке

Ответить
Алексей

Добрый день! В настройках проекта в PhpStorm не получается установить соединение с докером, пишет "Отказано в доступе /var/run/docker.sock". Получается только соединиться если шторм запускать из-под рута. Подскажите, пожалуйста, что я делаю не так?

Ответить
Дмитрий Елисеев

Чтобы с Docker работать не от root нужно своего пользователя добавить в его группу:

sudo usermod -aG docker $USER
Ответить
Алексей

Спасибо большое!

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий