- Монтування директорій винесено в окремі volumes, так більш правильно, хоча це тепер потребує встановлення додаткового плагіну для Docker
- Для прискорення роботи створено 2 контейнера з PHP:
- without xDebug - дозволяє значно прискорити роботу, коли відладка не потрібна
- with xDebug - використовується лише тоді, коли потрібно відлагодити код
- Перемикання між контейнерами PHP виконується автоматично за допомогою плагіну
- Збірку також адаптовано для роботи з MacOS, для цього використовується Mutagen (beta-версія).
- Необхідно оновити програму
docker-compose
- див. секцію Linux - підготовка та встановлення необхідних інструментів
На правах реклами хочу запропонувати вам також використовувати додатковий інструмент для пришвидшення взаємодії з контейнерами та bin/magento
- magento2-helper
- Troubleshooting
- Plugin Xdebug
- Підготовка та встановлення необхідних інструментів
- Реєстр готових (pre-build) PHP імеджів
- Домени та SSL
- Конфігурація та параметри
- Переглянути активні контейнери
- CLI в контейнері
- Використання Docker-compose
- Завантаження Magento
- Права доступу до директорій
- Встановлення Magento
- Використання контейнера для існуючого проекту Magento
- Імпорт бази даних з backup-файлу
- Backup (dump) бази у файл
- Видалити DEFINER з dump файлу
- Налаштування Xdebug для CLI
- Встановлення додаткових бібліотек і екстеншенів в імедж
- Генерація SSL сертифікатів (ручний режим)
-
xDebug не працює на MacOS - перевірте значення змінної
xdebug.remote_connect_back
у файліconfig/php/php.ini
, воно має бути рівним0
абоOff
-
docker-compose не оновлюється - при встановленні через
pip install docker-compose
встановлення відбувається в директорію~/.local/bin/docker-compose
, тоді як правильне місце буде/usr/local/bin/docker-compose
. Необхідно деінсталюватиpip uninstall docker-compose
-
invalid port in upstream "${PHP_HOST_XDEBUG} - оновити локальні імеджі контейнерів, виконайте команду
docker-compose pull
-
Configuration for volume code specifies "mountpoint" driver_opt... - оновити
docker-compose
,sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Примітка: Для виконання команд composer
або роботи з bin/magento
використовуйте контейнер magento2_php
, а не magento2_php_xdebug
, це пришвидшить роботу.
Для xDebug потрібно встановити плагін Xdebug helper, який допомагає швидко вмикати та вимикати дебагер.
- Chrome - Xdebug Helper
- Firefox - Xdebug Helper
Примітка: Перевірено на Ubuntu та Manjaro дистрибутивах, також буде працювати на усіх похідних від Debian та Arch.
Для роботи необхідно встановити офіційний плагін для Docker - local-persist за допомогою команди:
curl -fsSL https://raw.githubusercontent.com/MatchbookLab/local-persist/master/scripts/install.sh | sudo bash
Необхідно оновити програму docker-compose
на найновішу версію, на момент написання інструкції це 1.29.2, для цього виконайте команди:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Перевірити свою версію програми docker-compose
можна за допомогою команди docker-compose --version
Важливо оновити локальні імеджі контейнерів, так як вони кешуються, і можуть виникати помилки при старті проекту.
Для повторного завантаження імеджів з хмари виконайте команду docker-compose pull
у директорії з проектом.
Примітка: Гілка зі збіркою для MacOS знаходиться у відповідній гілці репозиторію
Для роботи потрібно встановити Homebrew та Mutagen (beta):
- Homebrew -
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
- Mutagen -
brew install mutagen-io/mutagen/mutagen-beta
- Запустити службу Mutagen -
mutagen daemon start
Для роботи з Mutagen необхідно усі команди для роботи з контейнерами змінити з docker-compose ...
на mutagen compose ... (up, down, start, down, rm ...)
Mutagen - це програма, яка дозволяє робити синхронізацію файлів між локальною файловою системою (ФС) і ФС контейнера без втрати продуктивності.
Для того, щоб перевірити статус виконання синхронізації можна ввести команду mutagen sync monitor
Важливо оновити локальні імеджі контейнері, так як вони кешуються, і можуть виникати помилки при старті проекту.
Для повторного завантаження імеджів з хмари виконайте команду docker compose pull
у директорії з проектом.
При виникненні помилок з не існуючим класом, або ж не можливістю створення файлу - потрібно виконати команду у контейнері PHP chmod -R 777 app/etc/ pub/static pub/media/ var/ generated/
У випадку якщо xDebug не працює, перевірте значення змінної xdebug.remote_connect_back
у файлі config/php/php.ini
, воно має бути рівним 0
або Off
Всі доступні версії PHP контейнерів доступні за посиланням: https://web.docker.pp.ua/#!taglist/magento2-php
Примітка: також можете переглянути репозиторій за посиланням https://web.docker.pp.ua/
Для листів встановлена локальна заглушка, яка не дозволить відправити лист в Internet, а лише збереже його локально для перегляду.
Переглянути всі отримані листи можна за посиланням: http://localhost:8025/
Примітка: виконуємо у локальному терміналі
В останній ревізії контейнера при запуску docker-compose up
реалізований механізм автоматичного створення сертифікатів по параметру VIRTUAL_HOST
:
Примітка: також є можливість генерації в ручному режимі, див. секцію Генерація SSL сертифікатів (ручний режим)
Конфігурація додаткових доменів реалізована через DOMAINS
параметр у файлі docker-compose.yml
:
Для того щоб додати новий домен потрібно вказати його у форматі:
domain=store_code
- див. секціюКонфігурація та параметри
(domain=website_code
- в залежності від параметраMAGE_RUN_TYPE
)- при додаванні декількох доменів їх потрібно розділяти пробілом
domain1=store_code1 domain2=store_code2
- при запуску контейнера конфігурації та сертифікати для доментів будуть згенеровані автоматично
- додати
0.0.0.0 domain_name
до/etc/hosts
файлу - налаштувати
base_url
відповідним чином
Для конфігурування Magento використовуються наступні параметри:
VIRTUAL_HOST
- хостнейм, який буде використовуватись як адреса веб-сайтуMAGE_MODE
- режим роботи Magento (default
,developer
,production
,maintenance
)MAGE_RUN_TYPE
- тип коду для ініціалізації (store
,website
)MAGE_RUN_CODE
- код store або website (залежить від параметраMAGE_RUN_TYPE
), який буде використовуватись для ініціалізації Magento.
Примітка:
-
MAGE_RUN_TYPE =
store
-
MAGE_RUN_TYPE =
website
:
Примітка: виконуємо у локальному терміналі
Команда docker ps
CONTAINER ID
- ID контейнераIMAGE
- образ контейнера на якому він працюєCOMMAND
- головна команда контейнера (задається при створенні вDockerfile
)CREATED
- дата створенняSTATUS
- час роботи від стартуPORTS
- показує як локальний (доступний на ПК) порт співвідноситься до порту в контейнері DockerNAMES
- ім'я контейнера - використовується у командах по роботі з контейнером
Як заходити в PHP контейнер, щоб не зіпсувати права доступу:
docker exec -ti magento2_php su www-data -s /bin/bash
- за допомогою цієї команди ви відкриєте CLI контейнера і там вже виконувати усі решту маніпуляції
magento2_php
- ім'я контейнера PHP (див. секціюПереглянути активні контейнери
)
Примітка: виконуємо у локальному терміналі
- Клонуємо GIT-репозиторій на локальний комп'ютер:
git clone https://github.pp.ua/anbis/docker-magento2.git
- Переходимо у директорію, яка була створена у попередньому пункті
cd docker-magento2
- Запускаємо контейнери
docker-compose up
- Перевіряємо статус контейнерів
docker ps
(у новому вікні терміналу): - переходимо в контейнер PHP
docker exec -ti magento2_php bash
Примітка: виконуємо у контейнері PHP
-
за допомогою
СOMPOSER
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition
- завантажуємо файли за допомогою Composermv project-community-edition/{*,.*} .
- переміщуємо файли на рівень нижче (можуть бути повідомлення про помилку - ігноруємо)rm -rf project-community-edition
- видаляємо директорію, вона нам більше не потрібнаchown -R www-data:www-data .
- змінюємо права доступу після завантаження на коректніexit
- виходимо з терміналу контейнера
-
за допомогою
GIT
- to be continued...
Примітка: виконуємо у локальному терміналі
Для правильної роботи Magento необхідно надати право на запис у наступні директорії:
var
app/etc
pub/media
pub/static
Для цього необхідно виконати команду (знаходитись у директорії проекту):
chmod -R 777 app/etc/ pub/static pub/media/ var/ generated/
в контейнері PHPsudo chown -R $USER:$USER code
в локальному терміналі
Примітка: виконуємо у контейнері PHP
-
bin/magento
- перевіряємо чи працює консоль Magento -
bin/magento setup:install --db-host=magento2_mysql --db-name=magento2 --db-user=magento2 --db-password=magento2 --search-engine=elasticsearch6 --elasticsearch-host=http://magento2_elasticsearch:9200 --elasticsearch-port=9200 --elasticsearch-enable-auth=0 --session-save=redis --session-save-redis-host=magento2_redis --session-save-redis-port=6379 --session-save-redis-db=1 --cache-backend=redis --cache-backend-redis-server=magento2_redis --cache-backend-redis-port=6379 --cache-backend-redis-db=2 --admin-user=anbis --admin-password=magent0 --admin-email=test@example.com --admin-firstname=name --admin-lastname=surname --base-url=https://magento2.dev/ --backend-frontname=admin --language=en_US --currency=USD --timezone=America/Chicago --cleanup-database --use-rewrites=1
db-host=magento2_mysql
- хост бази даних (БД)db-user=magento2
- користувач БДdb-password=magento2
- пароль користувача БДdb-name=magento2
- назва БДsearch-engine=elasticsearch6
- використовувати пошуковий сервер ElasticSearch6elasticsearch-host=http://magento2_elasticsearch:9200
- хост ElasticSearchelasticsearch-port=9200
- порт ElasticSearchelasticsearch-enable-auth=0
- не використовувати аутентифікацію ElasticSearchsession-save=redis
- використовувати Redis для зберігання сесійsession-save-redis-host=magento2_redis
- хост Redissession-save-redis-port=6379
- порт Redissession-save-redis-db=1
- БД Rediscache-backend=redis
- використовувати Redis для зберігання кешуcache-backend-redis-server=magento2_redis
- хост Rediscache-backend-redis-port=6379
- порт Rediscache-backend-redis-db=2
- БД Redisadmin-user=anbis
- користувач для адмін-панеліadmin-password=magent0
- пароль користувача адмін-панеліadmin-email=test@example.com
- email користувача адмін-панеліadmin-firstname=name
- ім'я користувача адмін-панеліadmin-lastname=surname
- прізвище користувача адмін-панеліbase-url=https://magento2.dev/
- URL для доступу Magento з браузера (magento2.dev
,magento2.local
,magento2.test
)backend-frontname=admin
- URL-постфікс для доступу в адмін-панельlanguage=en_US
- локаль магазинуcurrency=USD
- валюта магазинуtimezone=America/Chicago
- часова зона магазинуcleanup-database
- очистити базу перед встановленням Magentouse-rewrites=1
- використовувати SEO-friendly URL для категорій і продуктів
-
перейти по URL, який був вказаний в параметрі
base-url
(https://magento2.dev/
)
Примітка: виконуємо у контейнері PHP
- створити директорію
code
у директорії з проектом - копіювати або перенести усі файли Magento у директорію
code
- імортувати БД з файлу
- перевірити коректні налаштування файлу
app/etc/env.php
(файл-примірникenv.php.example
) - якщо директорія
vendor
порожня - виконати в командуcomposer install
- за необхідності встановити коректні права доступу до директорій
- виконати
bin/magento setup:upgrade
bin/magento setup:store-config:set --base-url="http://magento2.dev/"
bin/magento setup:store-config:set --base-url-secure="https://magento2.dev/"
bin/magento cache:flush
- додати
0.0.0.0 magento2.dev
до/etc/hosts
файлу
Примітка: виконуємо у локальному терміналі
cat backup.sql | docker exec -i CONTAINER_NAME /usr/bin/mysql -u ROOT --password=PASSWORD DATABASE
:
backup.sql
- файл для імпортуCONTAINER_NAME
- контейнер з MySQL (по замовчуваннюmagento2_mysql
)ROOT
- ім'я користувача MySQL (по замовчуваннюroot
)PASSWORD
- пароль користувача MySQL (по замовчуваннюmagento2
)DATABASE
- база данних MySQL (по замовчуваннюmagento2
)
Примітка: виконуємо у локальному терміналі
docker exec CONTAINER_NAME /usr/bin/mysqldump -u ROOT --password=PASSWORD DATABASE > backup.sql
:
CONTAINER_NAME
- контейнер з MySQL (по замовчуваннюmagento2_mysql
)ROOT
- ім'я користувача MySQL (по замовчуваннюroot
)PASSWORD
- пароль користувача MySQL (по замовчуваннюmagento2
)DATABASE
- база данних MySQL (по замовчуваннюmagento2
)backup.sql
- файл для імпорту
Примітка: виконуємо у локальному терміналі
cat backup_WITH_definers.sql | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' > backup_WITHOUT_definers.sql
backup_WITH_definers
- файл з дефайнерамиbackup_WITHOUT_definers
- файл для імпорту, який вже не містить дефайнерів
docker inspect magento2_php
docker-compose stop
docker-compose up
- включити PHP Storm - Run - Break at first line in PHP scripts
- включити Listener Xdebug
- готово
Примітка: виконуємо у локальному терміналі
- закоментувати стрічку з
image: docker.pp.ua/magento2-....
- розкоментувати стрічку з
build: ./builds-custom/....
- відкрити та редагувати
Dockerfile
файл у директоріїbuilds-custom
і відповідний імедж (наприкладphp
-builds-custom/php/Dockerfile
) docker-compose stop
docker-compose up --force-recreate --build
Примітка: виконуємо у локальному терміналі
Для генерації сертифіката потрібно:
- перейти в директорію
cd ssl/ssl_generator
- виконати команду
./create.sh sample.test
, де: - повинна створитись нова директорія з вашим хостом:
- необхідно вказати цей хост у
docker-compose.yml
файлі: - імпортувати кореневий сертифікат в браузер, для того щоб браузер міг довіряти самопідписаним сертифікатам:
- додати
0.0.0.0 sample.test
до/etc/hosts
файлу - готово