Среда разработки 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-контейнера для memcached
Memcached может значительно увеличить производительность стека развертывания приложения. Memcached не требует дополнительных ресурсов, и, кроме того, помогает использовать текущий их объем более эффективно.
Этот мануал в первую очередь предназначен для тех, кто хочет запустить несколько веб-приложений. Он поможет вам создать docker-образ, который можно использовать для быстрого развертывания изолированных контейнеров memcached. Эти контейнеры, работающие в индивидуальных средах, смогут взаимодействовать с приложениями и ускорят их загрузку.
Краткий обзор Docker
Проект docker предлагает инструменты, разработанные на основе некоторых функций ядра Linux. Цель docker состоит в том, чтобы помочь разработчикам и системным администраторам портировать приложения (со всеми их зависимостями) и заставить их работать кроссплатформенно на разных машинах.
Для этого Docker использует безопасные изолированные среды на основе LXC (Linux Containers), который называются контейнерами. Эти контейнеры создаются из docker-образов. Образы можно создать вручную или автоматически через Dockerfiles.
Краткий обзор memcached
Memcached – это распределенное хранилище данных с открытым исходным кодом. Оно было разработано для хранения определенных типов данных в ОЗУ (вместо традиционных дисков с более низкой скоростью) для очень быстрого извлечения данных приложениями. Это позволяет сократить время, затрачиваемое на обработку запросов, путем уменьшения количества запросов (по сравнению с традиционными СУБД, например, MySQL).
Внедряя хорошо спланированный и оптимизированный механизм кэширования, вы помогаете приложению обрабатывать большее количество запросов и выполнять больше процедур.
Memcached часто используется в среде производства. Это один из самых популярных инструментов для повышения производительности, который не требует обязательного внедрения дополнительного оборудования (например, большего количества серверов или ресурсов).
Memcached сохраняет ключи и совпадающие с ними значения (размером до 1 МБ) в ассоциативный массив (т. е. в хэш-таблицу), который можно масштабировать и распределять на большом количестве виртуальных серверов.
Установка Docker в Ubuntu
Сначала нужно установить Docker (в данном руководстве используется версия 0.7.1).
Обновите индекс пакетов:
Убедитесь, что поддержка aufs включена:
Добавьте ключ репозитория docker в apt, чтобы проверить подлинность пакета:
Добавьте репозиторий docker в список источников:
Обновите индекс пакетов:
sudo aptitude update
Загрузите и установите docker:
sudo aptitude install lxc-docker
По умолчанию брандмауэр UFW (Uncomplicated Firewall) блокирует весь пересылаемый трафик, который необходим docker.
Включите переадресацию в UFW. Откройте конфигурационный файл брандмауэра:
sudo nano /etc/default/ufw
Найдите в нем строку:
Измените ее значение:
Нажмите CTRL+X и Y, чтобы сохранить и закрыть файл.
Базовые команды Docker
Запуск демона Docker и использование интерфейса командной строки
После установки демон docker должен работать в фоновом режиме, он уже готов обрабатывать команды, отправленные из командной строки. Если вам нужно вручную запустить docker, используйте команду:
Командная строка docker принимает следующий синтаксис:
sudo docker [опция] [команда] [агрумент]
Примечание: Для работы с docker у пользователя должен быть доступ к sudo.
Базовые команды docker
Создание образа Memcached
Создайте файл Dockerfile, с помощью которого docker сможет автоматически собирать образы с предустановленным хранилищем Memcached (они будут использоваться для запуска изолированных экземпляров Memcached).
Что такое Dockerfile?
Dockerfile – это сценарии, содержащие последовательность команд, которые должны быть выполнены в указанном порядке для автоматического создания нового образа docker. Они очень помогают в развертывании.
Эти файлы всегда начинаются с определения базового образа с помощью команды FROM. С этого момента начинается процесс сборки, и каждое последующее действие формирует контейнер с помощью коммитов (сохранение состояния образа) на хосте.
Основные команды Dockerfile
Создание Dockerfile
Поскольку Dockerfiles представляют собой простые текстовые документы, вы можете создать такой файл с помощью любого текстового редактора и записать в него команды, которые должен выполнить docker, чтобы создать образ. Добавьте в файл команды в той последовательности, в которой они должны выполняться.
Примечание: Полный код Dockerfile вы найдете в конце данного раздела.
Создайте пустой Dockerfile:
В нем нужно последовательно перечислить все команды и директивы. В начале каждого Dockerfile указывается базовый образ (с помощью команды FROM).
Определите цель этого Dockerfile и укажите базовый образ:
После этого начального блока команд и объявлений можно перечислить инструкции по установке Memcached.
Укажите порт по умолчанию, который будет открыт в контейнере:
# Port to expose (default: 11211)
EXPOSE 11211
Установите команду по умолчанию и входную точку (т. е. Демон Memcached):
# Default Memcached run command arguments
CMD [«-u», «root», «-m», «128»] # Set the user to run Memcached daemon
USER daemon
# Set the entrypoint to memcached binary
ENTRYPOINT memcached
В результате ваш Dockerfile будет выглядеть так:
Сохраните и закройте Dockerfile (CTRL+X и Y).
Создание образа Docker для контейнеров Memcached
Теперь можно создать первый образ Memcached.
Чтобы создать образ с меткой memcached_img, запустите команду:
Примечание: В конце команды обязательно поставьте точку, иначе Docker не сможет найти Dockerfile.
Запуск Docker-контейнеров Memcached
Теперь можно очень просто создать любое количество совершенно изолированных и автономных экземпляров memcached на основе полученного образа. Все, что для этого нужно сделать – это создать новый контейнер с помощью команды docker run.
Создание контейнера Memcached
Чтобы создать новый контейнер, используйте следующую команду (при необходимости откорректируйте данные):
Эта команда создаст контейнер по имени memcached_ins, доступный по порту 45001, на основе образа memcached_img.
Ограничение памяти контейнера Memcached
Чтобы ограничить доступную память контейнера до 256 Мб, введите:
Чтобы подтвердить ограничение памяти, вы можете исследовать контейнер:
# Example: docker inspect [container ID] | grep Memory
sudo docker inspect memcached_ins | grep Memory
Примечание: Приведенная выше команда выведет информацию о доступной памяти. Чтобы просмотреть всю информацию о контейнере, используйте команду:
sudo docker inspect [container ID]
Тестирование контейнера Memcached
Существует несколько способов проверить работу нового контейнера. К примеру, можно использовать для этого простое приложение для Python CLI. Также можно просто подключиться к приложению с помощью кэширующих аддонов, фреймворков или библиотек.
Убедитесь, что у вас есть все необходимые библиотеки для Python и Memcached:
Создайте простой сценарий Python:
Добавьте в него следующий код:
# Import python-memcache and sys for arguments
import memcache
import sys
# Set address to access the Memcached instance
addr = ‘localhost’
# Get number of arguments
# Expected format: python cache.py [memcached port] docker php memcached install [value] len_argv = len(sys.argv)
# At least the port number and a key must be supplied
if len_argv
Сохраните и закройте файл.
Этот сценарий поможет проверить работу docker-контейнера memcached на хосте.
Memcached и PHP ликбез
Что такое Memcache и какое отношение он имеет к PHP?
Memcache разработан для кэширования данных, генерация которых требует большого количества ресурсов. Такого рода данные могут содержать что угодно, начиная с результатов запроса к базе данных и заканчивая тяжеловесным куском шаблона. Memcached не входит в базовый набор модулей, поставляемых с PHP, однако он доступен в репозитории pecl.
Установка и настройка
В качестве рассматриваемого дистрибутива я решил использовать Debian, потому как он наиболее часто используется при создании web-серверов. Модуль Memcached для PHP доступен в репозитории уже скомпилированным (php5-memcached), но я опишу процесс установки из исходного кода, так как не все репозитории настолько богаты, как дебиановский.
Устанавливаем сервер Memcached
#/etc/memcached.conf
#Memcached будет работать, как демон
-d
#Лог будет складывать туда
logfile / var / log / memcached.log
#Отведём 256 мегабайт ОЗУ под хранилище
-m 256
#Слушать будет этот порт
-p 11211
#В последствии желательно поменять
-u nobody
#Слушаем localhost
-l 127.0.0.1
Проверяем
Компилируем и устанавливаем модуль для PHP
apt-get install php5-dev libmemcache-dev
echo ‘extension=memcache.so’ >> / etc / php5 / apache2 / php.ini
/ etc / init.d / apache2 restart
Примеры использования
1. Базовые операции
В результате выполнения этого кода каждый раз будет выводиться время с точностью до секунд. Однако обновляться оно будет раз в 5 секунд, пока не очистится кэш. В данном примере проиллюстрированы самые простые операции, но в производительности мы скорее потеряем, чем выиграем. Ведь нам каждый раз придётся подключаться к серверу…
2. Повышаем производительность
2.1 С кэшированием
В данном примере приведена функция, которая создаёт изображение размером 800×600 и расставляет на нём 10 000 точек. Один раз, сгенерировав такое изображение, в дальнейшем мы лишь выводим его на экран, не генерируя заново.
2.2 Без кэширования
Тут всё гораздо проще и привычней: генерируем изображение каждый раз заново.
Результаты
Я протестировал оба скрипта на производительность. Одна и та же машина в первом случае выдала 460 ответов в секунду, а во втором лишь 10. Чего и следовало ожидать.
Ещё несколько полезных функций
addServer — в случае, если у вас в распоряжении несколько кэширующих серверов, вы можете создать некий кластер, добавляя сервера в пул. Следует обратить внимание на параметр weight. Он указывает на то, сколько памяти вам будет доступно на конкретном сервере.
delete — из названия понятно, что данный метод удаляет из кэша объект с заданным ключом.
replace — заменяет значение объекта с заданным ключом. Используйте в случае, если Вам понадобится изменить содержимое объекта, раньше чем истечёт время его жизни.
С моей точки зрения, применять кэширование стоит только на высоконагруженных ресурсах. Ведь каждый раз, подключаясь к серверу Memcached, вы тратите драгоценное время, что скорее всего не будет оправданным. Что касается больших проектов, лучше сразу написать больше строк кода, чем потом делать это в попыхах, с мыслью о том, что ваш сервис лежит. Также не стоит забывать о расходовании памяти! Учтите, что положив 300 мегабайт в кэш, вы отняли у себя 300 мегабайт ОЗУ.
В завершение хочу сказать, что данная статья не раскрывает все прелести технологии, однако я надеюсь, что она стимулирует Вас к самосовершенствованию. Спасибо за прочтение, многоуважаемый %username%!
UPD: Ещё один интересный момент. Memcached, есть PHP API к libmemcached. А Memcache, библиотека для php, не использующая libmemcached.
Внедрение Docker для небольшого проекта в Production, часть 3
В предыдущих частях мы свами подготовили сервер к использованию контейнеров:
В этой части мы научимся работать с контейнерами и разворачивать стек приложений за считанные секунды. Но вначале я бы хотел сделать небольшое отступление на поступившие комментарии и замечания.
Один из важных вопросов был, а как же в CoreOS дела обстоят со Swap, отвечаю, дела отлично и вы сейчас в этом сами убедитесь. Итак, приступим к настройке. Как всегда для этого нам понадобиться подключение к серверу через SSH и текстовый редактор, кстати, хотел добавить ранее я говорил, что в системе нет редактора vim, я ошибся, он там есть, так что место vi можно использовать и vim сути это не поменяет. Для того чтобы включить своп нам не нужно будет размечать диск, для этого достаточно имеющегося раздела с ext4. Свопинг будем запускать в качестве службы, плюс этого метода в том, что своп можно отключать и включать как сервис, при этом регулируя размер свопа через файл описания службы.
Итак, в командной строке выполним следующее:
В содержимое файла внесем следующий текст:
Для удобства настройка свопинга идет через переменные окружения:
Указываем путь и имя файла, для дальнейшей работы, следующей строкой:
Мы скажем что размер файла у нас 2048 мегабайта, что равно 2 ГБ, думаю в нашей системе это будет с избытком.
Этот участок файла собственно отвечает за включение и отключения самого файла, думаю дополнительные разъяснения не нужны, все предельно читаемо и понятно.
После этого нужно сохранить наш файл и покинуть редактор, теперь необходимо запустить службу и активировать свопинг.
Для этого как обычно воспользуемся консолью и введем команду:
После выполнения мы включим своп, посмотреть что он активен нам поможет простая команда:
Которая покажет нам информацию о памяти в понятном виде в мегабайтах. В результате мы увидим что значения раздела Swap приобретут настроенные нами цифры, а именно всего 2ГБ а уж использование зависит от нагрузки на систему, но так как у нас она еще не нагружена то там будут нули.
Отлично, теперь пришло время подготовить все необходимое для того чтобы развернуть наш сайт, так как сайт у нас на WordPress то и для его работы нам понадобиться Web Server (Apache, Nginx), PHP, MySQL. Лично я буду использовать следующую связку: PHP 7.1, Nginx 1.11.9, MariaDB 10.1.21. Почему эту? Да потому, что мне так нравиться. Считаю что это самая производительная связка для того чтобы использовать WordPress, но помимо этого мы еще пожалуй добавим Varnish 5, и Memcached 1.4.34 для того чтобы наш блог работал еще быстрей. Начнем мы с самого простого и перейдем к более сложному. Сперва запустим memcache, для этого как обычно в консоль дадим команду на выполнение:
Тут все достаточно просто, говорим контейнеру автоматически перезапускаться, логи выводим в syslog, ну и даем внятное имя. По умолчанию настройки хорошо сбалансированы, и если я не ошибаюсь там выделено 64 мегабайта памяти, для нашего блога этого будет достаточно. Для того чтобы использовать эту возможность в наш WP нужно доставить плагин, лично я использую WP Total Cache, как его настроить есть куча мануалов, мы не будем останавливаться на этом.
Далее мы запустим наш сервер баз данных, это тоже тривиальная задача и не требует много времени и настроек, команда для запуска выглядит так:
Вводить его придется редко. Далее известные нам параметры. Хотелось лишь бы обратить внимание на то, что я использую официальные образы этих приложений с хаба, не указывая тег, то есть по умолчанию всегда будет браться последняя версия. Но если локально образ у вас уже есть, то будет взята версия которая храниться локально, поэтому для того чтобы обновиться мы можем выполнить следующую команду:
Тогда с хаба, будет взята гарантированно последняя версия образа. Для тех кому нужно время по установленному нами часовому поясу на этапу установки, то в запуск каждого контейнера имеет смысл добавить следующую опцию:
Она пробросит нам в контейнер файлик с настройкой временной зоны. Далее запустим наш веб сервер, для этого выполним команду:
Пояснять о значениях в конфигах не буду, на хабре есть статьи по которым я сам настраивал эти сервисы, при желании их можно легко найти.
Теперь приступим к самому интересному, это сборка нашего PHP 7, дело в том, что базовый образ не включает все необходимые нам расширения, поэтому мы соберем образ сами. Для того, чтобы у вас заработал практически любой движек, с любой темой, нам нужно создать следующий контейнер описав его Dockerfile:
Так как базовый образ построен на Debian Jessie то мы не будем нарушать эту традицию, и соберем на его базе свой, лишь только добавим в него нужные нам расширения. Далее дело останется за мылам, прописать конфиг, и запустить контейнер.
После сборки контейнера нужно выдернуть файлы конфигурации для правки, предположим при сборке мы назвали контейнер local/php7. Далее приступаем к конфигурированию:
Все, мы скопировали дефолтные конфигурационные файлы в нашу директорию, осталось их немного настроить.
Далее в этой же папке создаем файлы с именем дополнения для php и расширением ini следующего содержания:
Это например файл docker-php-ext-imagick.ini.
И так для каждого. Приводить все я их не буду, принцип я думаю понятен. Для особо ленивых я выложил это все тут.
Самая важная настройка лежит в файле zz-docker.conf
Не забудьте ее прописать, иначе через unix сокеты у нас php-fpm работать не будет. Если же ее оставить по умолчанию, то php-fpm запуститься на 9000 порту, и нам нужно будет поменять наш upstream в nginx с сокета на tcp, это для тех, кто в будущем захочет вынести php-fpm на отдельную машину. В рамках виртуального частного облака это не только просто но и безопасно.
Все готово, теперь запускаем контейнер введя в консоль команду:
Итак подведем промежуточный итог, у нас есть Nginx готовый принимать подключения, есть PHP-FPM 7.1, который будет обрабатывать наши php файлы, есть база данных, и есть зачатки кеширования в виде memcached. Теперь нам нужно настроить Varnish. Но сперва соберем наш образ, как обычно ниже привожу Dockerfile
Прошу заметить, я ставлю последнюю 5-ю версию не из репозиториев, а вручную. Так как она вышла не так давно и не успела попасть в репы. Более того, я добавляю Varnish Agent, он к сожалению версии 4.1, но это нам не помешает. Для чего увидим позже.
Последняя строка служит нам для того, чтобы вывести наши правила кеширования для Varnish, она не обязательна, но на моменте отладки удобно посмотреть подхватывает он нужные правила или нет.
Это файл настроек я выделяю 256 МБ под кеш, лично мне этого достаточно. Далее нам нужно настроить Varnish Dashboard, как это сделано, описано тут. Я не буду описывать этот процесс, но кому нужно пиши в коменты или ЛС я обязательно помогу. Для nginx файл настроек будет такой:
Теперь запустим контейнер.
Для тех, кому лень собирать свой образ, в строке запуска уже есть мой образ, собранный ранее. Вам нужно лишь разместить конфиги на своих местах. Я намеренно не выложил файл default.vcl так как у каждого он свой, более того есть хорошая статья, как настроить Varnish. Вот собственно мы и закончили установку нашего супового набора для запуска блога на WP.
Я намеренно упустил часть конфигурирования MariaDB, так как в интернетах полно мануалов как это сделать. Я не использую docker-compose по причине того, что в поставке CoreOS его нет, но это решаемо. Да и запуск единичных сервисов мне кажется более удобным. Тем более все команды можно завернуть в один скриптик, прописать в cloud-init, использовать Ansible….
Спасибо за внимание, продолжение следует. Если что и забыл, извиняюсь, так как пишу статью отрываясь от работы.
