Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Tutorial

  • записи
    3
  • коментаря
    42
  • переглядів
    4 170

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


ozzzi

8 462 перегляди

Если вы до сих пор в качестве тестовой среды используете 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 git@github.com: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 13

24 коментаря


Recommended Comments

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

 

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

  • +1 1
Надіслати
  В 11.01.2021 в 09:37, Yoda сказав:

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

Expand  

 

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

 

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

  • +1 2
Надіслати
  В 11.01.2021 в 09:45, ozzzi сказав:

 

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

 

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

Expand  

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

Надіслати
  В 11.01.2021 в 09:45, ozzzi сказав:

 

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

 

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

Expand  

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

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

Надіслати
  В 11.01.2021 в 14:57, Yoda сказав:

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

Expand  

 

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

 

  В 11.01.2021 в 14:57, Yoda сказав:

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

Expand  

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

Надіслати
  В 11.01.2021 в 18:49, stickpro сказав:

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

Expand  

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

Надіслати
  В 11.01.2021 в 19:30, EVMedvedev сказав:

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

Expand  

 

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

  • +1 1
Надіслати
  В 12.01.2021 в 08:27, magecode сказав:

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

Expand  

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

Надіслати
  В 12.01.2021 в 08:27, magecode сказав:

 

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

Expand  

 

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

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

Надіслати

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

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

Надіслати
  В 12.01.2021 в 18:49, magecode сказав:

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

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

Expand  

 

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


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

 

Надіслати
  В 12.01.2021 в 19:18, magecode сказав:

 

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

Expand  

 

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

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

Надіслати
  В 12.01.2021 в 19:19, Yoda сказав:

 

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

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

Expand  

 

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

Надіслати
  В 12.01.2021 в 19:31, magecode сказав:

 

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

Expand  

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

Надіслати
  В 12.01.2021 в 19:37, Yoda сказав:

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

Expand  

 

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

Надіслати
  В 12.01.2021 в 08:59, stickpro сказав:

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

Expand  

 

Кстати - есть неплохое обоснование тому, для чего нужно использовать docker-compose. Разработчикам модулей например важно обкатать свое детище на всех версиях PHP, возможно на разных комбинациях настроек связки PHP и WEB-сервера, протестировать на разных вариантах кэширования и т.п. Можно быстро компоновать разные варианты хостинга. А дальше переход к автоматизации тестирования с помощью travis ci. Но это уже для профессиональных разработчиков модулей скорее. Тех кто хочет делать качественные продукты.

Надіслати
  В 26.04.2021 в 17:44, buslikdrev сказав:

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

Expand  

 

Чтобы делать качественные продукты, надо уметь это делать. А для этого нужно владеть соответствующими инструментами.

  • +1 1
Надіслати

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.