docker compose php cli
Как поднять проект на PHP в Docker под Windows
Чем является статья
Статья является набором простых, понятных инструкций и советов для пользователей Docker под Windows. Статья поможет разработчикам на PHP быстро поднять проект. Описываются проблемы и их решения. Статья полезна тем, кто не обладает бесконечным ресурсом времени, чтобы глубоко копаться в проблемах докера под Windows. Автор был бы бесконечно признателен, если бы ему ранее встретилась подобная статья и автор бы съэкономил бы много сил и времени. Текст может содержать ошибки и неточности.
Чем не является статья
Статья не является полным и исчерпывающим руководством по Docker for Windows. В статье не описывается ничего нового и не разглашаются ранее неизвестные факты — все это вы можете самостоятельно найти в разных источниках. Статья также не отвечает на вопрос — перешел ли цыпленок дорогу.
Первый шаг — добавить нового администратора в систему
Это важный шаг, если вы его пропустите или не выполните, то возможно нижеследующие инструкции вообще не имеют смысла для вас. Выполните Windows+R, lusrmgr.msc, откроется «Локальные пользователи и группы». Далее пользователи, контекстное меню, в нем «Новый пользователь. «. Добавьте нового пользователя (например dockerhost) с обязательным паролем. Пароль является обязательным! Добавьте членство в группе Администраторы. Других групп не добавляйте.
Далее в Docker settings, Shared drivers отметьте нужные вам диски и введите данные (логин и пароль) нового пользователя. Сохраните настройки. Если вы ранее вводили логин и пароль пользователя, под которым работаете, то введите данные нового пользователя. Хотите огрести проблем в неожиданном месте — используйте рабочий аккаунт и дальше статью не читайте.
С какой конфигурации начать?
На просторах интернета встречаются всякие конфиги docker-compose.yml для PHP вэбсервера. Какая то их часть не запуститься под Windows. Я рекомендую посмотреть генератор docker-compose.yml. У меня конфиг из генератора завелся сразу и поэтому далее я редактировал конфиг именно оттуда. Окончательный результат выложил в github. Вариант из генератора плох несколькими вещами. Описание проблемы и ее решения приводятся ниже.
Настройка постоянного хранилища БД
Проблема: невозможно хранить файлы БД на локальном диске. Это следует принять как аксиому под Windows и попытаться найти приемлемое решение, чтобы данные хранились вне контейнера. Для Windows это — named volume. Всего пара строк решает эту проблему
Named volume находятся в папке /var/lib/docker/volumes/ виртуальной машины докера MobiLinuxVM. Прямого доступа к этим файлам нет, только через контейнер посредник. Мне неизвестно решение, как сделать доступной эту папку из под Windows. Для управления named томами воспользуйтесь коммандой docker volume. Например удалить не используемые тома docker volume prune.
Вам не нужно парится с правами и пользователями для файлов в named volume — за вас все делает докер, за что ему большое спасибо. В некоторых руководствах, по настройке постоянного хранилища БД в докере, приводятся танцы с назначением прав. Под Windows без named volume у вас ничего не выйдет. Ну первый раз может и запуститься, а вот при повторном запуске загнется. Вы даже не представляете, какое было облегчение когда заработало постоянное хранилище с named volume.
Добавление SSH ключей
SSh ключи также добавим через named volume. Причина — для приватных ключей нужны особые права, а эту возножность не дают обычные тома под Windows.Процитирую требуемый кусок из docker-compose.yml
Чтобы это заработало необходимо в named volume скопировать ключи, изменить права на приватные ключи, протестировать связь. Все эти действия можно оформить в виде одного bat файла
Сетевое взаимодействие между контейнерами
Чтобы соеденятся между контейнерами, описанными в одном docker-compose.yml файле, ничего ненужно. Достаточно указать имя сервиса или имя контейнера как имя хоста. Номера портов менять не нужно — работают порты по умолчанию. На этом можно было бы закончить, если бы не требовалось получать и отправлять запросы в контенйеры из другого docker-compose.yml. С этим тоже никаких проблем, достаточно указать название сетей и контейнеров в сети. Процитирую нужный участок docker-compose.yml
При первом запуске контейнеров докер может ругнуться. ERROR: Network second_network declared as external, but could not be found. Please create the network manually using docker network create second_default and try again. Собственно, все верно, воспользуйтесь подсказкой докера и вручную создайте сеть.
Настройка логов
Хотелось бы иметь логи от всех сервисов в одной папке, доступной локально. Делается это несложно при помощи обычных томов. Главное — включить логирование в самом сервисе. Для php — это опции в файле php.ini, в nginx — в его конфиге, в postgres — тоже. С php и nginx все просто — имеются соответствующие файлы в нашем конфиге. Для postgres придется воспользоваться опциями коммандной строки (существует еще путь через файл postgresql.conf, но это будет несколько сложнее)
Полный текст docker-compose.yml в репе и в конце статьи. Надо сказать, что я до сих пор не доволен настройкой логов. Пока устраивает как есть. Желающие более тонкой настройки логирования, могут воспользоваться документацией соответствующих сервисов.
Образы контейнеров
Если обратили внимание, то я для php и nginx использовал свои собственные образы. Мне это экономило время при тестировании. Вам ничего не мешает использовать другие образы контейнеров — мой конфиг всего лишь демо. Свои образы легко построить — в посмотите в репе папку build, где создаются использованные образы.
Заключение
Приведу здесь финальный вариант docker-compose.yml если кому то лень лезь в реп:
Как видите, ничего сложного и все работает. Также приведу несколько полезных комманд, которые я оформил в виде bat файлов. Запуск тестов codeception
После этой статьи, возникшие вопросы в состоянии решить официальная документация по докеру или другим использованным компонентам. На этом все, удачи в разработке.
Среда разработки PHP на базе Docker
Решение, которое позволит создать на локальном компьютере универсальную среду разработки на PHP за 30 — 40 минут.
Почему Docker?
Docker не является VM-системой, он не моделирует аппаратное обеспечение компьютера. Используя Docker вы получите минимальное потребление ресурсов. Docker-контейнеры взаимодействуют напрямую с ядром вашего компьютера (или ядром хоста), но при этом изолируют программу на уровне процесса.
Высокая скорость развертывания. Вы можете использовать готовые docker-образы, которые устанавливаются и запускаются за секунды.
Приложения, находящееся внутри docker-контейнеров, можно запустить на любом компьютере с установленным Docker, при этом окружение будет одинаковым.
Возможность простой сегрегации пользовательских данных и контейнеров-сервисов. Если вы сломаете или удалите docker-контейнер, то данные не потеряются, так как они не будут принадлежать контейнеру. Контейнер выполняет лишь функцию сервиса, и не хранит данные, которые нельзя потерять между запусками.
Вы можете очень быстро добавлять новые контейнеры, изменять их конфигурацию, запускать различные версии баз данных на одной машине.
Требования
Docker engine 19.x и выше.
Возможности и особенности среды разработки
Несколько версий PHP — 7.3 и 7.1 с набором наиболее востребованных расширений.
Возможность использовать для web-проектов разные версии PHP.
Готовый к работе монитор процессов Supervisor.
Предварительно сконфигурированный веб-сервер Nginx.
Базы данных: MySQL 5.7, MySQL 8, PostgreSQL (latest), MongoDB 4.2, Redis (latest).
Настройка основных параметров окружения через файл .env.
Возможность модификации сервисов через docker-compose.yml.
Последняя версия docker-compose.yml.
Все docker-контейнеры базируются на официальных образах.
Структурированный Dockerfile для создания образов PHP.
Каталоги большинства docker-контейнеров, в которых хранятся пользовательские данные и параметры конфигурации смонтированы на локальную машину.
В целом, среда разработки удовлетворяет требованию — при использовании Docker каждый контейнер должен содержать в себе только один сервис.
Репозиторий проекта
Структура проекта
Рассмотрим структуру проекта.
Примечание
.gitkeep — является заполнением каталога, это фиктивный файл, на который не следует обращать внимание.
.env-example
Пример файла с основными настройками среды разработки.
.gitignore
Каталоги и файлы, в которых хранятся пользовательские данные, код ваших проектов и ssh-ключи внесены в. gitignore.
Этот каталог предназначен для хранения ssh-ключей.
readme.md
docker-compose.yml
Документ в формате YML, в котором определены правила создания и запуска многоконтейнерных приложений Docker. В этом файле описана структура среды разработки и некоторые параметры необходимые для корректной работы web-приложений.
mongo
Каталог базы данных MongoDB.
mongo.conf — Файл конфигурации MongoDB. В этот файл можно добавлять параметры, которые при перезапуске MongoDB будут применены.
db — эта папка предназначена для хранения пользовательских данных MongoDB.
dump — каталог для хранения дампов.
mysql-5.7
Каталог базы данных MySQL 5.7.
config-file.cnf — файл конфигурации. В этот файл можно добавлять параметры, которые при перезапуске MySQL 5.7 будут применены.
data — эта папка предназначена для хранения пользовательских данных MySQL 5.7.
dump — каталог для хранения дампов.
logs — каталог для хранения логов.
mysql-8
Каталог базы данных MySQL 8.
config-file.cnf — файл конфигурации. В этот файл можно добавлять параметры, которые при перезапуске MySQL 8 будут применены.
data — эта папка предназначена для хранения пользовательских данных MySQL 8.
dump — каталог для хранения дампов.
logs — каталог для хранения логов.
nginx
Эта папка предназначена для хранения файлов конфигурации Nginx и логов.
default.conf — файл конфигурации, который будет применён ко всем виртуальным хостам.
vhost.conf — здесь хранятся настройки виртуальных хостов web-проектов.
Рассмотрим vhost.conf подробнее:
В файле конфигурации описаны настройки для двух web-проектов — project-1.localhost и project-2.localhost.
Здесь следует обратить внимание на то, как производится перенаправление запросов к нужному docker-контейнеру.
Например, для проекта project-1.localhost указано:
php-7.3 — название docker-контейнера, а 9000 — порт внутренней сети. Контейнеры между собой связаны через внутреннюю сеть, которая определена в файле docker-compose.yml.
php-ini
В этом каталоге находятся файлы конфигурации PHP.
Для каждой версии PHP — свой файл конфигурации.
php-workers
Место для хранения файлов конфигурации Supervisor.
Для каждой версии PHP — могут быть добавлены свои файлы с настройками.
php-workspace
Здесь хранится файл, в котором описаны действия, выполняемые при создании образов docker-контейнеров PHP.
Dockerfile — это текстовый документ, содержащий все команды, которые следует выполнить для сборки образов PHP.
postgres
Каталог для системы управления базами данных PostgreSQL.
data — эта папка предназначена для хранения пользовательских данных PostgreSQL.
dump — каталог для хранения дампов.
projects
Каталог предназначен для хранения web-проектов.
Вы можете создать в это каталоге папки, и поместить в них ваши web-проекты.
Содержимое каталога projects доступно из контейнеров php-7.1 и php-7.3.
Если зайти в контейнер php-7.1 или php-7.3, то в каталоге /var/www будут доступны проекты, которые расположены в projects на локальной машине.
redis
Каталог key-value хранилища Redis.
conf — папка для хранения специфических параметров конфигурации.
data — если настройки конфигурации предполагают сохранения данных на диске, то Redis будет использовать именно этот каталог.
Программы в docker-контейнерах PHP
Полный перечень приложений, которые установлены в контейнерах php-7.xможно посмотреть в php-workspace/Dockerfile.
Здесь перечислим лишь некоторые, наиболее важные:
Начало работы
1. Выполните клонирование данного репозитория в любое место на вашем компьютере.
Перейдите в директорию, в которую вы клонировали репозиторий. Все дальнейшие команды следует выполнять именно в этой директории.
2. Скопируйте файл .env-example в .env
Если это необходимо, то внесите изменения в файл .env. Измените настройки среды разработки в соответствии с вашими требованиями.
3. Выполните клонирование web-проектов в каталог projects.
Для примера, далее мы будем исходить из предположения, что у вас есть 2 проекта:
project-1.ru — будет работать на версии PHP 7.3, а project-2.ru — на PHP 7.1.
4. Отредактируйте настройки виртуальных хостов Nginx.
Файл конфигурации виртуальных хостов находится в каталоге ./nginx/conf.d/.
5. Настройте хосты (доменные имена) web-проектов на локальной машине.
Необходимо добавить названия хостов web-проектов в файл hosts на вашем компьютере.
В файле hosts следует описать связь доменных имён ваших web-проектов в среде разработки на локальном компьютере и IP docker-контейнера Nginx.
На Mac и Linux этот файл расположен в /etc/hosts. На Windows он находится в C:\Windows\System32\drivers\etc\hosts.
Строки, которые вы добавляете в этот файл, будут выглядеть так:
В данном случае, мы исходим из того, что Nginx, запущенный в docker-контейнере, доступен по адресу 127.0.0.1 и web-сервер слушает порт 80.
6. [опционально, если это необходимо] Настройте маршрутизацию внутри контейнеров web-проектов.
Web-проекты должны иметь возможность отправлять http-запросы друг другу и использовать для этого название хостов.
Из одного запущенного docker-контейнера php-7.1 web-приложение № X должно иметь возможность отправить запрос к другому web-приложению № Y, которое работает внутри docker-контейнера php-7.3. При этом адресом запроса может быть название хоста, которое указано в файле /etc/hosts локального компьютера.
Чтобы это стало возможным нужно внутри контейнеров так же внести соответствующие записи в файл /etc/hosts.
Самый простой способ решить данную задачу — добавить секцию extra_hostsв описание сервисов php-7.1 и php-7.3 в docker-compose.yml.
IP_HOST_machine — IP адрес, по которому из docker-контейнера доступен ваш локальный компьютер.
Если вы разворачиваете среду разработки на Mac, то внутри docker-контейнера вам доступен хост docker.for.mac.localhost.
Узнать IP адрес вашего Mac можно при помощи команды, который нужно выполнить на локальной машине:
В результате вы получите, что-то подобное:
После того, как вам станет известен IP-адрес, укажите его в секции extra_hostsв описание сервисов php-7.1 и php-7.3 в docker-compose.yml.
8. Настройте параметры соединения с системами хранения данных.
Хосты и порты сервисов
Для того, чтобы настроить соединения с базами данных из docker-контейнеров php-7.1 и php-7.3 следует использовать следующие названия хостов и порты:
Docker compose php cli
Docker-environment for web-development on PHP
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Nginx + MariaDB + MailHog + PHP-7.1/7.2/7.3/7.4/8.0 FPM + Apache mod-php 5.6/7.1
All you have to do is run these commands:
1. Edit your /etc/hosts
2. Run these commands
3. Test running services
For ease of management, all basic commands are included in the Makefile. To list the available commands, run cat Makefile.
View the status of running containers
Viewing container logs
Change login/password super:demo
Open docker/nginx/.htpasswd and replace its contents.
Host user permissions
In the terminal, using the id command, we get the digital identifier of our user and group. Then uncomment the line
In docker /php/build/Dockerfile and replace 1050 with your identifiers there. We start containers with a rebuild
Switch php version
Uncomment the block with the container of the required php version in docker-compose.yml.
In Nginx config for the site, comment out the old upstream and uncomment the new one.
In the case of Apache in the Nginx config, you need to comment out the entire block for PHP-FPM and uncomment the one below for Apache. Also do not forget to tweak Apache configs.
Just copy config docker/nginx/config/templates/site.test.conf* and tweak it.
In the case of using the container with apache, you must also fix the docker/apache-php-56/config/sites-enabled/site.test.conf config.
There are examples of Nginx config files in docker/nginx/config/disabled/
Connect to the database from the console
Example with importing SQL-dump:
Connect to the database from the console
Run php scripts from the console
Route access to the database
The password is registered in the MYSQL_ROOT_PASSWORD parameter in mysql.env
Change of database access details
Changed in mysql.env file
An example of running Cron background tasks
PhpStorm + Docker + Xdebug
В этой небольшой статье я опишу рабочее решение настройки Xdebug для использования его при отладке в PhpStorm с использованием удаленного интерпретатора PHP, работающего внутри Docker-контейнера.
В итоге получится конфигурация на базе окружения в Docker-контейнерах, которая позволит производить отладку Web-приложения, консольного приложения, тестов, запускаемых из консоли и запускаемых из PhpStorm.
Исходные данные
У вас должны быть установлены Linux, PhpStorm, Docker, Docker-compose. У меня в блоге есть небольшая памятка, как установить Docker и docker-compose в Linux. Если Вы ведете разработку не на Linux, то Вам, наверное, придется чуть сложнее, но раз Вы читаете эту статью, значит Вы уже озадачились вопросом отладки с использованием php в контейнере Docker и у Вас уже всё давно установлено. Если настройки для MacOS или Windows будут отличаться от приведенных в статье, я обязательно укажу на это.
Статья будет рассмотрена на следующем примере. Каталог на локальной машине (хосте), в котором планируется разработать некоторое приложение: /home/denis/code/docker-xdebug. При этом корень Web-сервера находится в подкаталоге public. Основной каталог проекта отображается внутрь Docker-контейнеров на каталог /var/www. Внутри Docker-контейнера, при этом, получаем путь к корневому каталогу Web-сервера /var/www/public — именно на него настроен Web-сервер nginx.
Пример конфигурации
На самом деле, поставленная задача достаточно тривиальная. Все решения, которые мне удавалось находить ранее, были завязаны на IP-адресе хоста и их невозможно было использовать остальными членами команды, так как в каждом новом случае IP-адрес хоста был случайный и каждому члену команды приходилось бы менять IP-адрес на свой в общем файле конфигурации бандла, что крайне неудобно.
Решение проблемы оказалось достаточно простым. Я просто создал общую сеть для бандла в docker-compose (192.168.220.0/28) и таким образом добился одинакового IP-адреса хоста (192.168.220.1) на всех машинах членов команды разработки.
Если Вы используете MacOS или Windows, то вместо адреса 192.168.220.1 Вам нужно будет указать host.docker.internal в приведенном ниже docker-compose.yml.
Ниже приведу подробную инструкцию и все файлы, необходимые для сборки бандла с рабочей отладкой Xdebug.
В файлах отсутствует установка каких либо дополнительных зависимостей и расширений, так как в каждом проекте они свои. Это выходит за рамки данной статьи. Вы должны сами добавить их при необходимости.
docker-compose.yml
Если у вас MacOS или Windows, то вместо remote_host=192.168.220.1 используйте remote_host=host.docker.internal.
docker/php-fpm/Dockerfile
docker/php-fpm/php.ini
Это необходимо для того, чтобы Вы успели изучить результаты отладки до истечения таймаута запроса.
docker/nginx/Dockerfile
docker/nginx/default.conf
Теперь просто запускаем бандл docker-контейнеров:
Настройка PhpStorm
Настройка отладки в PhpStorm типичная для подобных ситуаций. Необходимо в настройках (File — Settings) проделать следующее:
Добавить Docker сервер
Если он у Вас еще не добавлен, конечно. Для этого откройте настройки: «Build, Execution, Deployment» — Docker. Затем нажмите плюсик, чтобы добавить новое подключение к докеру. У меня все подключилось сразу же в режиме Unix socket. Нажмите Apply.

Добавить внешний интерпретатор
Откройте настройки: «Languages & Frameworks» — PHP
Справа от CLI Interpreter нажмите кнопку с тремя точками.
В открывшемся окне CLI Interpreters нажмите плюс слева вверху и выберите там From Docker….
Далее нужно выбрать Docker (либо в новых версиях PhpStorm можно также выбрать Docker Compose). Второй вариант мне показался удобней, так как в этом случае я вижу контейнеры только данного проекта, а не все существующие на хосте (у меня их довольно много).
Два варианта на выбор:


Не забывайте правильно указывать наименование образа или сервиса. Нажмите ОК, после чего будет произведена попытка добавления выбранного интерпретатора из Docker.
В случае удачи, вы увидите следующее окно (здесь видно, что была определена версия PHP, конфигурационный файл PHP, а также, что очень важно, версия Xdebug. Переименуйте интерпретатор в нечто более понятное, например, как на скриншоте ниже.
Начиная с версии PhpStorm 2019.1 появилась возможность выбора, каким образом запускать тесты в контейнере. Если у вас контейнер с постоянно работающей службой, такой как php-fpm, то выбирайте Connect to existent container. Если же у вас в качестве интерпретатора используется php-cli, который не выполняется постоянно, то выберите опцию Always start a new container. Нажмите OK.
Теперь Вы должны увидеть следующее:
Проверить конфигурацию Xdebug
Откройте настройки: «Languages & Frameworks» — PHP — Debug. И нажмите на ссылку Validate.
Откроется окно, в котором Вы должны указать полный путь к web-корню (в нашем примере это подкаталог проекта public) и адрес сервера (в нашем примере порт 80 контейнера nginx транслируется в порт 80 хоста, поэтому в адресе порт не указывается. Если Вы транслировали в другой порт хоста — укажите обязательно его, например, http://127.0.0.1:8080). Нажмите Validate.
Если у Вас результат проверки выглядит так же, то Вы все настроили правильно. Закройте окно Validate Debugger Configuration.
Если у Вас проблема с валидацией имени сервера, значит вы в настройках сервера nginx не указали 127.0.0.1 в качестве одного из server_name. Если проблема с загрузкой php.ini, значит вы использовали другой способ конфигурирования PHP вместо загрузки php.ini в каталог контейнера /usr/local/etc/php/ — это не страшно, если Вы понимаете, что делаете.
Добавить PHP сервер
Откройте настройки: «Languages & Frameworks» — PHP — Servers и нажмите плюсик, чтобы добавить новый.
Укажите имя сервера Docker (должно совпадать с переменной окружения PHP_IDE_CONFIG в docker-compose.yml) и хост 127.0.0.1. Затем ниже включите опцию Use path mappings и укажите соответствие между локальным каталогом проекта и этим же каталогом проекта внутри Docker-контейнера. Это соответствие изначально настраивается в docker-composer.yml для службы php-fpm в разделе volumes. Затем нажмите OK.
Добавить конфигурацию для запуска
Остался последний штрих — добавление конфигурации запуска. Мы добавим простую Web-страницу.
В главном меню Run перейдите в Edit configurations…
В открывшемся окне нажимайте плюсик вверху слева и выбирайте PHP Web page. Укажите имя для данной страницы, например, WWW, затем укажите сервер, с которым связана эта страница (мы создали его на предыдущем шаге) и нажмите OK.
Упрощенный способ взаимодействия с контейнерами
Для управления контейнерами, вам придется использовать длинные команды вроде:
Но это не самое сложное. Самое сложное заключается в том, что теперь для запуска тестов вам придется вызывать сценарии внутри контейнеров. Например, чтобы запустить конкретный набор тестов, вам придется ввести следующую команду:
Постоянный ввод таких команд — вырабатывает хорошую привычку, но быстро надоест. Ведь это можно упростить!
Для этого создайте в корне проекта файл (например, с именем alias.bash), содержащий псевдонимы команд, а затем настройте PhpStorm таким образом, чтобы он подключал его при открытии терминала. В Git-репозитории, ссылка на который приведена в конце статьи, вы найдете все необходимые файлы из этой статьи, включая файл alias.bash, который уже содержит некоторые самые необходимые команды в более развернутом виде, который будет удобней для редактирования и поддержки.
Ваш файл alias.bash может, например, выглядеть следующим, упрощенным образом:
Псевдонимы могут работать с параметрами. Это видно в последнем псевдониме — сценарию phpunit передаются все параметры, с которыми был вызван псевдоним. Такие псевдонимы можно назвать своего рода прокси-командами.
Чтобы файл с псевдонимами применялся при открытии сессии терминала в PhpStorm, откройте настройки: Tools — Terminal и в поле Shell path введите:
Вы можете составлять псевдонимы любой сложности, включая составные, состоящие из других псевдонимов. Это позволяет сосредоточиться на разработке, не отвлекаясь на составление команд для запуска чего либо внутри контейнера вручную.
Запуск отладки
Теперь пришло время приступить к самой отладке.
В подкаталоге проекта public создайте файл index.php с следующим содержимым:
Вверху справа на панели запуска выберите созданную конфигурацию и нажмите зеленый треугольник.
Это действие должно запустить сервер, который откроет в браузере файл index.php, в результате чего в браузере должен быть отображен результат работы phpinfo().
Отладка WEB-приложения
Устанавливаем точку останова на строку phpinfo();
И вместо зеленого треугольника нажмем кнопку с зеленым жуком — это запустит сервер в режиме отладки.
При первом запуске отладки в браузере вам возможно понадобится специальное расширение JetBrains IDE Support, которое обычно предлагается к установке автоматически. Установите его.
При запуске отладки, откроется браузер с URL, к которому будет добавлен параметр с идентификатором сессии отладки, что-то вроде: http://127.0.0.1/?XDEBUG_SESSION_START=11223
При этом вывод в браузер не будет выполнен, так как сработает точка останова. Вернитесь в окно PhpStorm. Активная точка останова выглядит вот так:
В данном случае птичкой обозначается та точка (а их может быть несколько), на которой произошел останов. Все переменные выше будут подсвечены их значениями для удобства.
Теперь переместимся ниже — на панель отладки.
Также существует другой способ отладки — при помощи «прослушивания». Нажмите кнопку с телефонной трубкой, чтобы активировать режим прослушивания.
После того, как кнопка изменит вид (с красного запрещающего знака на зеленые полоски), Вы можете просто открыть веб-приложение в браузере и, если в коде проставлены точки останова, режим отладки запустится автоматически.
Отладка консольного приложения (CLI)
Для отладки консольного приложения можно нажать кнопку с трубкой, чтобы включить режим прослушивания, как и в описанном выше способе.
Теперь можно запустить консольный скрипт следующей командой:
Также можно создать псевдоним для вызова php-сценариев и поместить его в файл alias.bash. Например, вот такой:
И теперь тоже самое можно будет сделать выполнив следующую команду:
Если при этом отладка не сработала, убедитесь, чтобы имя сервера, которое создавали выше, совпадало с именем сервера в файле docker-compose.yml в переменной окружения PHP_IDE_CONFIG.
После окончания отладки не забудьте отключить режим прослушивания.
Отладка тестов (PhpUnit)
С отладкой тестов дела обстоят точно так же, как и с консольным приложением. Включайте прослушивание (кнопку с трубкой) и запускайте тесты следующим псевдонимом (прокси-командой):
Но используя PhpStorm намного удобней и практичней использовать встроенные средства запуска тестов, которые предоставляют удобную навигацию по тестам, а также множество других полезных функций. Для того чтобы запустить тестирование средствами PhpStorm, необходимо настроить тестовый фреймворк.
Откройте настройки: «Languages & Frameworks | PHP | Test Frameworks». И добавьте новый фреймворк (нажмите кнопку с плюсиком) — PHPUnit by Remote Interpreter. В открывшимся окне выберите наш интерпретатор и нажмите ОК.
Затем необходимо указать путь к phpunit.xml, убедиться, что путь к Composer autoloader автоматически добавился (добавить вручную, если нет) и нажать ОК.
Тестовый фреймворк настроен. Теперь необходимо добавить конфигурацию запуска тестов, подобно той, которую мы добавляли чуть выше для запуска веб-приложения.
Для этого в главном меню Run перейдите в Edit configurations…
Нажмите плюсик и добавьте PhpUnit. Укажите удобное Вам имя, например Tests и установите переключатель запуска в Defined in the configuration file. Теперь Вы можете настраивать тесты через конфигурационный файл phpunit.xml.
Теперь точно так же кнопкой с зеленым треугольником на панели запуска Вы можете запускать тесты в обычном режиме, кнопкой с жуком — запускать тесты в режиме отладки и кнопки с щитом запускать тесты в режиме расчета покрытия тестами (для расчета покрытия Вы должны настроить блок whitelist в конфигурационном файле phpunit.xml).
При этом активировать режим прослушивания (кнопка с трубкой) уже не нужно.
Резюме
В данной статье был описан простой способ настройки и использования отладчика Xdebug в PhpStorm, если используется удаленный интерпретатор в виде Docker-контейнера.
После того, как Вы склонируете себе репозиторий, не забудьте выполнить composer install для установки зависимостей и создания автозагрузчика. Для этого можно воспользоваться уже входящим в набор псевдонимов псевдонимом composer:
PhpStorm + Docker + Xdebug: 109 комментариев
Настроил все по инструкции и на последнем шаге в PHPStorm вылезло Port 9003 is busy. Использую Laradock. Вот тут, например, советуют отключить вообще использование порта 9003: https://github.com/laradock/laradock/issues/2948
Есть идеи что это может быть?
Насколько я понял бегло просматривая ишью на гитхаб по вашей ссылке, автор вопроса зачем-то пробросил порт 9003 из контейнера на хост-машину. Этого делать не нужно, так как не Storm подключается к PHP, а наоборот, PHP подключается к Storm на хосте. Порты же нужно пробрасывать в случае если необходимо получить сетевой доступ к контейнерам, а не наоборот. Контейнерам и так доступна вся внешняя сеть, включая интернет.
Если в вашем случае нет этой ошибки в конфигурации docker-compose.yml, как у автора вопроса на гитхаб, то у вас какой-то другой процесс на хосте занимает этот порт. Это вполне может быть. Порт 9003 не закреплен глобально за xdebug, поэтому любое приложение может его использовать наравне с xdebug.
Решить задачу можно разными способами. Например, найти приложение, которое занимает порт 9003 и решить что с ним делать. Или же от противного: изменить порт для xdebug на другой.
Добрый день, в настройка PHPStorm не видит интерпретатор php через Docker Compose (напрямую в образе видит без проблем), хотя в Mac без проблем подхватывает (отличие было в том что на Mac стоят Docker for Mac)
Большое спасибо за инструкцию, с прослушки все заработало, а не подскажете, вот ставлю брекпоинт на прослушке, рефрешу страницу и она падает на брекпоинт дважды (раз прокликиваешь, и оп, сразу опять вход на том же брекпоинте что уже был).
В чем может быть такая проблема? Потестирую еще на другом приложении, но вот, вдруг вы знаете.
Пожалуйста. Рад, что инструкция помогла.
Не сталкивался никогда с описанной проблемой. Будто браузер дважды посылает запросы или может быть редирект?
Может быть кто-то из читателей подскажет…
У меня аналогичная ситуация с Chrome на Mac. В Safari все норм
Большое спасибо за статью! год назад научился по ней сам, теперь скидываю ее знакомым)
Пожалуйста! Рад, что помогло!
Спустя некоторое время Listening перестаёт работать и приходится будить/возобновлять через запуск Debug режима (зелёный жук). Кто нибудь знает в чём проблема?
У меня тоже такое было, но сейчас все нормально.
Возможно проблема была в версии шторма. Сейчас версия 2020.3.2 и все нормально. Не нужно «будить» жуком 🙂
Посмотрите у меня в репозитории как настроено для xdebug-3. Там отличаются директивы в конфиге. Может быть с этим еще есть какие-то проблемы, если у вас 3 яверсия.
Всё никак не дойдут руки обновить в статье для 3й версии.
По доменному имени тоже все работает точно так же как и по IP.
Нужно в c:\Windows\System32\Drivers\etc\hosts прописать доменное имя.
Отличная статья, автор красавчик!
Добавлю, что сейчас уже Xdebug3, кое-что изменилось.
https://xdebug.org/docs/upgrade_guide
В моем случае я не через environment пробрасывал настройки xdebug, как автор, а прям файлом xdebug.ini.
[xdebug]
xdebug.mode = debug
xdebug.client_host = host.docker.internal
Да. Спасибо! Изменилось. И я уже в репозитории изменил всё, а в статье пока руки не дошли поменять.
В репозитории полностью рабочий вариант для xdebug 3 включая РНР8 в зависимостях.
здравствуйте, я столкнулась с ошибкой
Xdebug: [Step Debug] Could not connect to debugging client. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port) 🙁
Подскажите пожалуйста, как пробросить настройки файлом xdebug.ini (xdebug.client_host = host.docker.internal) в шторме, чтобы запустить программный тест. Не могу понять как это Вы сделали
Добрый день.
Похоже, что у вас новый xdebug версии 3 (пытается подключиться к шторму на порт 9003, а не 9000 как xdebug версии 2).
Статью еще не обновлял под третью версию, но в репозитории уже файлы обновил несколько недель назад.
В общем, в репозитории уже всё как вам надо. Некоторые настройки PHP (в том числе и для xdebug) вынесены в ini-файл контейнера.
I really spent a lot of time trying to run xdebug in my docker project. Finally after way to many hours it works. Thank you!
Спасибо за статью! Подскажите пожалуйста, а приходилось ли настраивать такую связку: «сервер с php+xdebug» — «промежуточный сервер» — «рабочее место»? Куда можно посмотреть в этом плане?
Пожалуйста! Рад, что помогла.
Если вы один разработчик, который работает с xdebug на удалённом сервере, то просто пропишите в переменной окружения XDEBUG_CONFIG параметр remote_host=ip_адресвашегокомпьютера. Если у вас удалённый сервер (за пределами офиса), а офис работает через NAT, то можно попросить системного администратора, чтобы пробросил порт 9000 с вашего сервера (с докером) на вашу рабочую станцию. Но если NAT нет, то просто укажите IP своего компьютера и всё. Тоже самое вы делаете и при локальной работе с докером — указываете IP вашей хост-операционной системы.
Если же ситуация более сложная, как, например, есть сервер в интернете, где под docker работает web-приложение с x-debug, но работать с отладкой должны не только Вы, а вся команда (на разных IP-адресах) то тут тоже есть решение — DBGp Proxy. Как настроить не подскажу, не приходилось. Но, думаю, по названию вы легко найдете информацию в сети.




