Добрый день!
Все чаще стучась в различные компании разработчиков в качестве DevOps инженера, я получаю приблизительно одни и те же тестовые задания. Они отличаются друг от друга версиями PHP или проектами которые надо запустить.
Но в целом они упираются в одну связку это Nginx\Appache, SQL (тут вариаций много, все зависит от предпочтений заказчика), PHP и желательно чтобы это было разложено по контейнерам.
Поэтому я решил рассказать на примере, как все это поднять без особых усилий.
Возможно кому-то это поможет понять, на простом примере, что к чему. Описывать что такое Docker я не буду, т.к. статей на эту тему вагон и маленькая тележка.
В данной статье, мы подготовим небольшую структуру:
Для начала установим Docker.
Все зависит от системы в которой вы хотите работать, в отношении кроссплатформенности, docker приятно удивляет (один и тот же файл конфигурации позволяет собрать и запустить контейнеры на любой системе *nix, Win, iOS).
Для Linux (к примеру в CentOS)
Устанавливаем:
Включаем и стартуем сервис:
Чтобы наша структура создавалась одной командой нам потребуется docker-compose.
Для начала поставим необходимые для него компоненты:
Дальше устанавливаем docker-compose и обновляем python:
(или # pip install docker-compose)
Для Win систем (многие считают это извращением)
Но если вы решили, настоятельно рекомендую вам это делать на версии которая поддерживает Hyper-V (например win10 Prof).
Включаем компонент Hyper-V в «Включении и отключении компонентов Windows» (Turn Windows features on or of).
Скачиваем установщик с оф.сайта докера и устанавливаем. Также, дополнительно вы можете поставить GUI (Kitematiс) для наглядного отображения.
Приступим к созданию окружения:
Для начала создадим под этот проект папку и заходим в нее:
Дальше строим структуру папок таким образом:
Создаем понятную среду для nginx:
MySQL — в этой папке будут храниться базы. Удобно бэкапить и переносить.
Nginx — тут будут храниться логи, файл конфигурации и наш проект.
PHP — сюда мы сложим Dockerfile с настройками и php.ini.
в корне (в нашем случе папка /mage) будет лежать файл docker-compose.yml.
Создадим конфигурационный файл для Nginx:
Можно использовать любой другой редактор. Если его нет — можно установить с помощью:
И добавляем в nginx.conf следующее:
Это минимальный конфиг для того, чтобы все завелось. В первом блоке описываем какой порт слушать, перечисляем возможные index страницы, обзываем, создаем alias для длинного пути где лежит magento2, пишем — какие логи нужны и указываем где они должны храниться, указываем папку где живет magento2 (в данном случае наш alias $MAGE_ROOT).
Во втором блоке прописываем параметры fastcgi.
Третий блок нужен для решения проблемы отображения, в проекте показывалась пустая страница. Из документации вычитал что magento2 требует реврайтинга. (на других проектах таким проблем не возникало).
В папке www создаем каталог для нашего проекта:
Скачиваем с оф.сайта magento2
и извлекаем из архива в папку /mage/Nginx/www/magento2
C настройками для Nginx мы закончили.
Теперь займемся PHP:
Начнем с Dockerfile
Cобираем сами:
Это нужно, чтобы мы могли использовать те модули, которые нужны именно под этот проект.
В этом файле мы рассказали что должно быть установленно в этом образе, а так же указали где будет располагаться корневая директория и куда скопировать настройки из php.ini
Теперь настроим php.ini:
Это взято из php.ini.sample который предлагают сами разработчики Magento2. Нечего сверхъестественного я в него не добавлял.
Все, на этом настройка PHP закончена.
Дальше создаем файл docker-compose который нам все соберет в одну удобную систему.
Тут мы распишем какие сервисы и с какими настройками должны запуститься:
(или если не хотите наблюдать за работой контейнеров можете добавить -d)
И по экрану побегут строчки, а вы спокойно можете налить себе кружечку горячего кофе, пока машина будет работать за вас.
После установки, у вас в папке MySQL, создастся много файлов и папок, одна из которых будет magento2, а в папке Nginx/Logs появятся 2 лога.
Открыв браузер и набрав там localhost вы должны увидеть приглашение к установке Magento2.
Если все таки что-то не получилось, то возможно этот список решений, сможет вам помочь:
1) Версия docker-compose файла не подошла, тогда нужно поправить «version: '3.3'», посмотреть какая именно подойдет вам можно тут
2) Все нормально запустилось, но браузер открывает чистую страницу, без единой ошибки — поможет строчка в nginx.conf
3) Если после установки самой Magento2 (в браузере) у вас не прорисовываются фреймы и все выглядит как текстовый вариант сайта, вам нужно сделать следующее:
3.1 в SQL, советую зайти через phpmyadmin localhost:8090 логин root пароль mypassword, выбрать базу magento2 и ввести sql запрос
3.2 подключиться к контейнеру c PHP (php-fpm) и набрать
Он должен пересчитать и проверить все. И после этого все корректно должно отображаться.
4) Если у Docker нет прав на запись в папки (это он скажет если вы набрали ) docker-compose up (без -d)
4.1 в линуксе надо отключить политику защиты
Отключение до перезагрузки
или отключение навсегда
меняем строчку
4.2 В windows нужно в настройках docker выбрать shared drivers и выбрать диск на котором у вас лежит проект. После перезапуска Docker проблема уйдет.
Удачи вам в ваших начинаниях, господа!
Ссылка на готовую сборку тут.
Все чаще стучась в различные компании разработчиков в качестве DevOps инженера, я получаю приблизительно одни и те же тестовые задания. Они отличаются друг от друга версиями PHP или проектами которые надо запустить.
Но в целом они упираются в одну связку это Nginx\Appache, SQL (тут вариаций много, все зависит от предпочтений заказчика), PHP и желательно чтобы это было разложено по контейнерам.
Поэтому я решил рассказать на примере, как все это поднять без особых усилий.
Возможно кому-то это поможет понять, на простом примере, что к чему. Описывать что такое Docker я не буду, т.к. статей на эту тему вагон и маленькая тележка.
В данной статье, мы подготовим небольшую структуру:
- В качестве вэб сервера будет использоваться Nginx с минимальной настройкой для запуска проекта.
- В качестве SQL будет использовать MySQL.
- PHP7.0-fpm версия c небольшими надстройками для запуска нашего проекта.
- В качестве проекта который мы будем разворачивать — берем magento2.
Для начала установим Docker.
Все зависит от системы в которой вы хотите работать, в отношении кроссплатформенности, docker приятно удивляет (один и тот же файл конфигурации позволяет собрать и запустить контейнеры на любой системе *nix, Win, iOS).
Для Linux (к примеру в CentOS)
Устанавливаем:
# yum install docker
Включаем и стартуем сервис:
# systemctl enable docker.service # systemctl start docker.service
Чтобы наша структура создавалась одной командой нам потребуется docker-compose.
Для начала поставим необходимые для него компоненты:
# yum install epel-release # yum install -y python-pip
Дальше устанавливаем docker-compose и обновляем python:
# yum install docker-compose
(или # pip install docker-compose)
# yum upgrade python*
Для Win систем (многие считают это извращением)
Но если вы решили, настоятельно рекомендую вам это делать на версии которая поддерживает Hyper-V (например win10 Prof).
Включаем компонент Hyper-V в «Включении и отключении компонентов Windows» (Turn Windows features on or of).
Скачиваем установщик с оф.сайта докера и устанавливаем. Также, дополнительно вы можете поставить GUI (Kitematiс) для наглядного отображения.
Приступим к созданию окружения:
Для начала создадим под этот проект папку и заходим в нее:
# mkdir /mage (папка может быть названа как угодно) # cd /mage
Дальше строим структуру папок таким образом:
# mkdir MySQL Nginx PHP
Создаем понятную среду для nginx:
# cd Nginx # mkdir core html Logs www
MySQL — в этой папке будут храниться базы. Удобно бэкапить и переносить.
Nginx — тут будут храниться логи, файл конфигурации и наш проект.
PHP — сюда мы сложим Dockerfile с настройками и php.ini.
в корне (в нашем случе папка /mage) будет лежать файл docker-compose.yml.
Создадим конфигурационный файл для Nginx:
# cd /mage/Nginx/core # touch nginx.conf # nano nginx.conf
Можно использовать любой другой редактор. Если его нет — можно установить с помощью:
# yum install nano
И добавляем в nginx.conf следующее:
server { listen 80; index index.php index.html index.htm; server_name magento2.dev; set $MAGE_ROOT /var/www/magento2; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root $MAGE_ROOT; location ~* \.php$ { try_files $uri $uri/ /index.php last; fastcgi_split_path_info (.+?\.php)(/.*)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~* .php/ { rewrite (.*.php)/ $1 last; } }
Это минимальный конфиг для того, чтобы все завелось. В первом блоке описываем какой порт слушать, перечисляем возможные index страницы, обзываем, создаем alias для длинного пути где лежит magento2, пишем — какие логи нужны и указываем где они должны храниться, указываем папку где живет magento2 (в данном случае наш alias $MAGE_ROOT).
Во втором блоке прописываем параметры fastcgi.
Третий блок нужен для решения проблемы отображения, в проекте показывалась пустая страница. Из документации вычитал что magento2 требует реврайтинга. (на других проектах таким проблем не возникало).
В папке www создаем каталог для нашего проекта:
# cd /mage/Nginx/www # mkdir magento2
Скачиваем с оф.сайта magento2
и извлекаем из архива в папку /mage/Nginx/www/magento2
C настройками для Nginx мы закончили.
Теперь займемся PHP:
Начнем с Dockerfile
# cd /mage/PHP # touch Dockerfile php.ini # nano Dockerfile
Cобираем сами:
FROM php:7.0-fpm RUN apt-get update && apt-get install -y \ curl \ wget \ git \ libfreetype6-dev \ libjpeg62-turbo-dev \ libxslt-dev \ libicu-dev \ libmcrypt-dev \ libpng12-dev \ libxml2-dev \ && docker-php-ext-install -j$(nproc) iconv mcrypt mbstring mysqli pdo_mysql zip \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd RUN docker-php-ext-configure intl RUN docker-php-ext-install intl RUN docker-php-ext-install xsl RUN docker-php-ext-install soap RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer ADD php.ini /usr/local/etc/php/conf.d/40-custom.ini WORKDIR /var/www/magento2 CMD ["php-fpm"]
Это нужно, чтобы мы могли использовать те модули, которые нужны именно под этот проект.
В этом файле мы рассказали что должно быть установленно в этом образе, а так же указали где будет располагаться корневая директория и куда скопировать настройки из php.ini
Теперь настроим php.ini:
# nano php.ini
Это взято из php.ini.sample который предлагают сами разработчики Magento2. Нечего сверхъестественного я в него не добавлял.
memory_limit = 2G always_populate_raw_post_data = -1 cgi.fix_pathinfo = 1 fastcgi_split_path_info = 1 max_execution_time = 18000 flag session.auto_start = off zlib.output_compression = on suhosin.session.cryptua = off display_errors = Off
Все, на этом настройка PHP закончена.
Дальше создаем файл docker-compose который нам все соберет в одну удобную систему.
# cd /mage # touch docker-compose.yml # nano docker-compose.yml
Тут мы распишем какие сервисы и с какими настройками должны запуститься:
# Пропишем версию version: '3.3' # Перечислим сервисы services: nginx: # Пропишем какой образ мы хотим использовать image: nginx:latest # Назовем свой контейнер по красивому container_name: nginx # Проброс портов ports: - "80:80" - "443:443" # Проброс папок volumes: - ./Nginx/core:/etc/nginx/conf.d - ./Nginx/www:/var/www/ - ./Nginx/Logs:/var/log/nginx/ - ./Nginx/html:/usr/share/nginx/html/ # Укажем зависимости links: - php mysql: image: mysql:latest ports: - "3306:3306" container_name: mysql # Пропишем настройки, предлагаю использовать вместо mypassword более сложный пароль, он пренадлежит root environment: - MYSQL_ROOT_PASSWORD=mypassword - MYSQL_DATABASE=magento2 - MYSQL_USER=magento2 - MYSQL_PASSWORD=magento2 volumes: - ./MySQL:/var/lib/mysql php: # Билдим с помощью dockerfile указав директорию где он лежит build: ./PHP container_name: php-fpm volumes: - ./Nginx/www:/var/www links: - mysql phpmyadmin: image: phpmyadmin/phpmyadmin container_name: phpmyadmin ports: - 8090:80 links: - mysql:db
(или если не хотите наблюдать за работой контейнеров можете добавить -d)
И по экрану побегут строчки, а вы спокойно можете налить себе кружечку горячего кофе, пока машина будет работать за вас.
После установки, у вас в папке MySQL, создастся много файлов и папок, одна из которых будет magento2, а в папке Nginx/Logs появятся 2 лога.
Открыв браузер и набрав там localhost вы должны увидеть приглашение к установке Magento2.
Если все таки что-то не получилось, то возможно этот список решений, сможет вам помочь:
1) Версия docker-compose файла не подошла, тогда нужно поправить «version: '3.3'», посмотреть какая именно подойдет вам можно тут
2) Все нормально запустилось, но браузер открывает чистую страницу, без единой ошибки — поможет строчка в nginx.conf
"location ~* .php/ { rewrite (.*.php)/ $1 last; }"
3) Если после установки самой Magento2 (в браузере) у вас не прорисовываются фреймы и все выглядит как текстовый вариант сайта, вам нужно сделать следующее:
3.1 в SQL, советую зайти через phpmyadmin localhost:8090 логин root пароль mypassword, выбрать базу magento2 и ввести sql запрос
insert into core_config_data (config_id, scope, scope_id, path, value) values (null, 'default', 0, 'dev/static/sign', 0)
3.2 подключиться к контейнеру c PHP (php-fpm) и набрать
# php bin/magento cache:clean config # php bin/magento setup:static-content:deploy
Он должен пересчитать и проверить все. И после этого все корректно должно отображаться.
4) Если у Docker нет прав на запись в папки (это он скажет если вы набрали ) docker-compose up (без -d)
4.1 в линуксе надо отключить политику защиты
Отключение до перезагрузки
# setenforce Permissive
или отключение навсегда
# nano /etc/selinux/config
меняем строчку
"SELINUX=disabled"
4.2 В windows нужно в настройках docker выбрать shared drivers и выбрать диск на котором у вас лежит проект. После перезапуска Docker проблема уйдет.
Удачи вам в ваших начинаниях, господа!
Ссылка на готовую сборку тут.
