Jump to content

Tutorial

  • entry
    1
  • comments
    20
  • views
    78

Запуск и отладка Opencart с помощью Docker и xDebug

ozzzi

828 views

Если вы до сих пор в качестве тестовой среды используете OpenServer или Хостинг+FTP, а единственным инструментом для дебага является var_dump, то самое время попробовать Docker и xDebug.

 

Docker - ПО для запуска сервисов в изолированных контейнерах. Т.е. для запуска приложения мы можем создать необходимое количество контейнеров: веб-сервер, интерпретатор PHP, запустить базу данных. Нам не нужно захламлять систему всеми этими сервисами, все будет установлено внутри докера. При этом мы можем использовать для разных проектов разный набор версий php, mysql и т.д.

 

В отличии от полноценных виртуальных машин (VirtualBox + Vagrant) нам не нужно скачивать образ операционной системы и ставить каждый раз полноценные версии сервисов. В докере используются облегченные версии ПО и если в одном проекте вы уже использовали PHP 7.3, то для другого проекта не нужно будет ничего качать и заново пересоздавать.

Вместе с Docker мы будем использовать дополнительный инструмент од названием Docker Compose. Он помогаем с помощью одного конфигурационного файла управлять группой контейнеров. 

 

Вместе с Docker мы будем использовать дополнительный инструмент од названием Docker Compose. Он помогаем с помощью одного конфигурационного файла управлять группой контейнеров. 

 

Что мы установим для нашего проекта:

  • PHP-FPM 7.3
  • Nginx
  • MySQL 5.7
  • Adminer

 

С докером определились, он поможет за 5 минут создать тестовое окружение с нужным набор сервисов.

 

XDebug - дополнение к PHP, которое помогает производить отладку и профилирование кода. В статье будет описана работа совместно с IDE: PhpStorm и VS Code. 

 

Приступим к практике.

 

Установка Docker

Docker: https://docs.docker.com/get-docker/
Docker Compose: https://docs.docker.com/compose/install/

 

Надеюсь, git у вас уже установлен (если нет, читайте блог https://opencartforum.com/blogs/entry/326-git-i-opencart-dlya-samyh-malenkih). 

Переходим в директорию проекта и клонируем репозиторий:

 

git clone [email protected]:ozzzi/docker-opencart.git .

В данном репозитории содержится конфигурация для запуска Opencart.

 

Структура директорий:

db - файлы базы данных
hosts - конфигурационный файл nginx. Конфигурационный файл настроен на использование домена oc.dev
images - файлы для создания образов
    Dockerfile - файл конфигурации образа
    php.ini - конфиг PHP
    mods - директория для загрузки конфигов дополнений 
logs - логи различных сервисов. По умолчанию настроен только лог для Nginx
.env - переменные окружения (в нем хранятся конфиги для MySQL).

 

docker-compose.yml - конфигурационный файл Docker Compose

 

Разберем файл docker-compose.yml

services - список сервисов (контейнеров). Для каждого сервиса (nginx, mysql и т.д.) принято создавать отдельный контейнер.

 

Список основных директив:
image - образ для создания контейнера. Образы хранятся тут: https://hub.docker.com
build - путь к Dockerfile для создания кастомного образа. Например, для PHP нам нужно установить ряд дополнений, поэтому нам нужно создать собственный образ. MySQL, Nginx мы вполне можем использовать без изменений. 
container_name - имя контейнера
ports - пробрасываем порты из контейнера на порты локального компьютера (порт компьютера:порт контейнера).
volumes - связываем папки на локальном компьютере и директории в контейнере. Используем для пробрасывания конфигов и файлов в контейнер, а также для сохранения данных сервисов в контейнере после перезагрузки (базы данных и т.д.).

 

Перейдем к настройке PHP в Dockerfile-е.

FROM - импортируем базовый образ из docker hub.
RUN - запускаем консольные команды Linux внутри контейнера для установки нужных пакетов: curl, zip и т.д.
ADD - импортируем файлы конфигов php и конфиг xDebug в контейнер
WORKDIR - рабочая директория

 

Команды для управления нашими контейнерами:
docker-compose up - запуск контейнеров
docker-compose up -d - тоже самое, но можно не держать открытым окно терминала
docker-compose up -d --build - собираем проект и запускаем, после внесения изменений также нужно запускать с данным ключем.
docker-compose stop - останавливаем контейнеры
docker-compose down - останавливаем  и удаляем контейнеры
docker-compose ps - выводит список запущенных контейнеров

 

Установка опенкарт

Файлы движка нужно закинуть в директорию www/oc.dev.

 

Чтобы домен был доступен по адресу oc.dev, нужно править файл hosts:
Ubuntu:

sudo gedit(ваш текстовый редактор) /etc/hosts

Windows:

windows\system32\drivers\etc\hosts

Вносим запись:

127.0.0.1 oc.dev

Данные для доступа к базе данных хранятся в файле .env (название базы, пользователь и пароль), а в качестве имени хоста мы используем имя контейнера базы данных: db.

Устанавливаем Opencart как обычно.

 

сли у вас есть проблемы с доступом к файлам и папкам (логи, кеш), вам помогут эти команды:
sudo chown -R $USER:$USER directory - устанавливает текущего пользователя владельцем директории (в контейнере скрипты исполняются от пользователя www-data)
sudo chmod -R 777 directiroy - права 777 для директории

 

Настройка xDebug

 

Файлы конфигурации хранятся по адресу:

/images/php/mods/xdebug.ini

 

Здесь нас интересует одна опция xdebug.remote_host. В ней нужно указать ip-адрес контейнера. Для Windows и Mac можно указать равным host.docker.internal

 

Для Linux на запущенном контейнере набираем в консоли:

docker inspect php-fpm | grep IPAddress

Полученный IP прописываем в конфиг xdebug.ini, в моем случае:

xdebug.remote_host = 172.25.0.2 (или 172.25.0.1, если не заведется отладчик)

Остановим и перезапустим наши контейнеры с опцией --build.

 

Настройка PHPStorm для работы с xDebug

 

1. Заходим в меню Run/Edit Configuration. Добавляем тип конфига "PHP Remote Debug"

 

1-step.thumb.jpg.f5748f36a54997592d39ffadcc970540.jpg

 

2. Нужно добавить Server

2-step.thumb.jpg.e86f8c569c6fffd714dbdc3ef0a6a285.jpg

 

3-step.jpg.dbbb23f975f9e10992d7f17100e7c2d7.jpg

 

Name - имя сервера вводим любое. Нужно поставить галочку Use path mappings, значения должны быть такими:
слева (File/Directory) - путь до папки на локальном компьютере, куда копировали Opencart.
справа (Absolute path on the server) - путь внутри контейнера: /var/www/oc.dev

 

3. Заполняем название конфигурации (любое). Вносим метку, на которую будет реагировать IDE: PHPSTORM.

4-step.thumb.jpg.634d34f7201a807d54ae4c036143f016.jpg

 

 

4. Проверим работу xDebug нажатием на ссылку Validate.

5-step.thumb.jpg.9718e340b3dd2b1d65be75490bce0a30.jpg

 

Приступаем к отладке

 

Для примера мы хотим узнать, какие модули отображаются на главной странице в позиции Top. Открываем файл catalog/controller/common/content_top.php. Нас заинтересовала строка 49, в которой можно посмотреть код модуля. Возле номера строки ставим точку остановки (Breakpoint) левой кнопкой мыши. 

 

6-step.thumb.jpg.8087c898f2e39d54438c1fab83d7470d.jpg

 

Чтобы вызвать работу отладчика выбираем конфигурацию, которую мы добавилил в 3-м пункте, жмем на Debug 'Docker' (зеленый жук) в панели справа,сверху и включаем прослушку Start Listaning for PHP Debug Connections (трубка). Обновляем главную страницу сайта. Должен сработать отладчик и вы увидите:

 

7-step.thumb.jpg.43457db304b30eac58fc52db100a8437.jpg

 

 

Окно отладки:
1. Данной кнопкой можно поменять брекпойнты и вернуться назад к отладке.
2. Кнопка просмотра точек остановки.
3. Синие стрелки вверх/вниз позволяют пробегать построчно по коду (вверх/вниз)
4. Все доступные переменные на момент остановки скрипта.
5. Стек вызова - можем проследить полный путь вызова.
 

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

 

8-step.jpg.bc4b9d71f6e7210d137b8dcdb47ac3d8.jpg

 

 

Настройка VS Code для работы с xDebug

 

1. У вас должно быть установлено дополнение PHP Debug

9-step.thumb.jpg.d78a02008fcb8b5eb4d2b1515f7ede10.jpg

 

2. Breakpoints ставятся возле нумерации строк.

10-step.thumb.jpg.7c2f2212c5f8da4a5da5f18d666d9beb.jpg

 

3. Включаем окно отладки (Ctrl + Shift + D) и нажимаем на ссылку create a launch.json file.

11-step.jpg.944f69d02470dc08b6066dffcaf5bff7.jpg

 

Код launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "log": true,
            "externalConsole": false,
            "pathMappings" : {
                "/var/www/oc.dev/": "${workspaceFolder}"
            }
        }
    ]
}

 

4. Отладка:

12-step.thumb.jpg.26a82e12b2861266d0a953d6f1a81cdc.jpg

 

  1. Запуск отладчика
  2. Панель управления. Здесь также можно остановить и обновить отладку, а также пробежаться по строчкам кода.
  3. Здесь отображаются все переменные.
  4. Стек вызова.

 

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

 

  • +1 11


20 Comments


Recommended Comments

И зачем эта ересь, когда 2.5 евро стоит Клауд и 4 евро панель, либо фри бесплатные аналоги, которые разворачивают любое окружении в два счёта а xdebug. На любителя непонятно тоже зачем.

 

Тут как бы на вкус и цвет фломастеры разные. Но реально зачем?

  • +1 1

Share this comment


Link to comment
8 минут назад, Yoda сказал:

Тут как бы на вкус и цвет фломастеры разные. Но реально зачем?

 

Лично мне так удобней и быстрей развернуть тестовое окружение под каждый проект, чем настраивать на хостинге под каждый сайт свою версию PHP и кучу других пакетов, которые не будут нужны в другом проекте.

 

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

  • +1 1

Share this comment


Link to comment
2 часа назад, ozzzi сказал:

 

Лично мне так удобней и быстрей развернуть тестовое окружение под каждый проект, чем настраивать на хостинге под каждый сайт свою версию PHP и кучу других пакетов, которые не будут нужны в другом проекте.

 

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

советую перейти с docker-compose на minikube или хотябы попробовать

Share this comment


Link to comment
5 часов назад, ozzzi сказал:

 

Лично мне так удобней и быстрей развернуть тестовое окружение под каждый проект, чем настраивать на хостинге под каждый сайт свою версию PHP и кучу других пакетов, которые не будут нужны в другом проекте.

 

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

Можно поподробнее.
Вот какие такие пакеты - там нужны, тут нет?

И что за требования рынка, которым нужен докер ?

Share this comment


Link to comment
12 минут назад, Yoda сказал:

Можно поподробнее.
Вот какие такие пакеты - там нужны, тут нет?

 

На всех проектах разные версии PHP, там нужен ioncube, а там он не нужен, для одного проекта достаточно последнего PHP и RabbitMQ, для других они не нужны, для проектов на опенкарт используется MySQL, для других PostgreSQL, для третьего Elastic. Мне легче управлять этим зоопарком из докера.

 

20 минут назад, Yoda сказал:

И что за требования рынка, которым нужен докер ?

Документация любого современного фреймворка, вакансии о работе. 

Share this comment


Link to comment
3 часа назад, stickpro сказал:

советую перейти с docker-compose на minikube или хотябы попробовать

 

А что это дает?

Share this comment


Link to comment
3 часа назад, EVMedvedev сказал:

 

А что это дает?

более удобную оркестрацию контейнеров и нет зависимоти от питона

Share this comment


Link to comment
37 минут назад, stickpro сказал:

более удобную оркестрацию контейнеров и нет зависимоти от питона

Эти дежурные фразы есть в любой статье по minikube  :-). Может вы можете рассказать чуть больше? В чем это большее удобство заключается. А зависимость от чего либо есть практически всегда. Не питон, так руби. Не руби, так NodeJS и т.д.

Share this comment


Link to comment
12 hours ago, EVMedvedev said:

Эти дежурные фразы есть в любой статье по minikube  :-). Может вы можете рассказать чуть больше? В чем это большее удобство заключается. А зависимость от чего либо есть практически всегда. Не питон, так руби. Не руби, так NodeJS и т.д.

 

тут вопрос в другом, на кой черт вообще кубер нужен для опенкарта. 

  • +1 1

Share this comment


Link to comment
30 минут назад, magecode сказал:

тут вопрос в другом, на кой черт вообще кубер нужен для опенкарта. 

так можно говорить про все что угодно, зачем опенкарту  php7, бутсрап 4,  nginx, когда есть апач, mysql8

Share this comment


Link to comment
8 часов назад, magecode сказал:

 

тут вопрос в другом, на кой черт вообще кубер нужен для опенкарта. 

 

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

Другое дело, что такие проекты на Опенкарт не делаются (он для этого просто не предназначен) и в этом случае вы правы - такие сложные вещи для ОС не нужны.

Share this comment


Link to comment

Дискуссия медленно перетекает в зачет по микросервисам.
Один товарищ пришел предложил впихнуть кубер, другой решил описать свой ci.
ТС написал небольшую доку по запуску докера для опенкарт, берите и пользуйтесь.

@ozzzi насчет пользуйтесь, было бы неплохо приложить в статью готовые yml кейсы.

Share this comment


Link to comment
19 минут назад, magecode сказал:

Дискуссия медленно перетекает в зачет по микросервисам.
Один товарищ пришел предложил впихнуть кубер, другой решил описать свой ci.
ТС написал небольшую доку по запуску докера для опенкарт, берите и пользуйтесь.

@ozzzi насчет пользуйтесь, было бы неплохо приложить в статью готовые yml кейсы.

 

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


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

 

Share this comment


Link to comment
6 minutes ago, Yoda said:

 

монстров из кучи сервисов, слепленных черех OC

 

 

Это даже звучит безнадежно

Share this comment


Link to comment
5 минут назад, magecode сказал:

 

Это даже звучит безнадежно

 

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

А у еще одного, у которого база в докере уже 2 года живет на 40 гигабайт SLA 100%.

Share this comment


Link to comment
8 minutes ago, Yoda said:

 

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

А у еще одного, у которого база в докере уже 2 года живет на 40 гигабайт SLA 100%.

 

Скажите пускай берет моделХ и не выдумывает

Share this comment


Link to comment
6 минут назад, magecode сказал:

 

Скажите пускай берет моделХ и не выдумывает

Давайте, вы логан сначала купите не в кредит, а потом начнете советы советовать!

Share this comment


Link to comment
7 minutes ago, Yoda said:

Давайте, вы логан сначала купите не в кредит, а потом начнете советы советовать!

 

ничего не получится, у меня плохая кредитная история, примерно такая же как с вашим монстр сервисом

Share this comment


Link to comment

@magecode  Да вы с Yoda не парьтесь :-). Эта статья ведь не для вас а для профессионалов или тех, кто хочет стать такими.

Share this comment


Link to comment
Guest
You are posting as a guest. If you have an account, please sign in.
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.