Среда разработки php на базе docker
Запуск PHP приложения на Docker контейнерах (PHP-FPM, Nginx, PostgreSQL)
За последний год программное обеспечение для автоматизации развертывания в среде виртуализации на уровне операционной системы набирает большие обороты. Эта статья послужит новичкам в этой сфере примером, как нужно упаковывать свое приложение в Docker контейнеры.
В классическом виде, PHP приложение представляет из себя следующие составляющие:
1. Установка Docker
Для начала работы, нам потребуется Docker. Скачать его можно на официальном сайте Docker.
2. Создание образов
Docker создает образы на основе DockerFile файлов, в котором описывается функционал. Мы создадим 3 образа для наших составляющих.
DockerFileNginx
В данном DockerFile мы создаем пользователя www-data с группой 82 и устанавливаем Nginx. Последняя строка COPY предполагает, что у вас конфигурация приложения лежит в папке config/website.conf. Она скопируется в /etc/nginx/conf.d/website.conf.
DockerFilePostgresql
В этом образе, мы будем отталкиваться от образа postgres:9.5.2 и выполним команду для определения локали и языка.
DockerFile
Этот образ послужит нам основным образом для нашего приложения. Сначала мы устанавливаем все необходимое для PHP и PHP-FPM. Далее, мы копируем текущую папку приложения в /usr/src/app, где будет распологаться наше приложение. В самом конце мы запускаем PHP-FPM.
Создание образов на основе DockerFile’ов
И так, у нас есть есть DockerFile’ы, на основе которых мы должны создать образы. Образы создаются очень просто. Достаточно выполнить следующие команды:
Мы создаем образы, прикрепляем их к нашему аккаунту на Docker Hub. Теперь, нам нужно отправить наши образы на репозиторий в Docker Hub. Выполняем следующие команды:
Запуск образов на сервере
Мы почти у цели! Нам осталось загрузить образы из репозитория и запустить их. Загружаем их с помощью следующих команд:
Осталось их запустить. Делается это так же просто.
Вуаля! Наше приложение запущено на Docker контейнерах. И тем не менее, всем читателям-новичкам я бы обязательно ознакомиться с документацией Docker.
Всем желаю успехов в освоении новых технологий!
Локальная среда для PHP разработки с помощью Docker
В этой статье описывается как собрать минимальную локальную среду для разработки на PHP используя Docker (Докер) и Docker-compose.
Здесь мы не будем изучать «Что такое Docker и как его установить?», подробная инструкция есть на официальном сайте.
Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в среде виртуализации на уровне операционной системы. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами.
Docker Compose — это инструментальное средство, входящее в состав Docker. Оно предназначено для решения задач, связанных с развёртыванием проектов.
Для чего?
Многие веб разработчики используют в своей работе такие «сборки» как OpenServer, XAMMP и подобные. Для простых зачать, типа создания блога на Вордресс, использование такой сборки вполне допустимо и позволяет выполнить все задачи. В OpenServer даже есть возможность менять версию PHP, MySQL, Apache.
Но иногда возникает необходимость быстро поднять идентичную среду разработки на другом компьютере для вашего коллеги или добавить к среде разработки определенную версию Node.js, или Redis, как быть в этом случае? Тут нам и поможет Докер.
Сейчас мы один раз сконфигурируем необходимую нам среду разработки на php и сможем с легкостью разворачивать ее на любом компьютере с помощью одной команды в терминале.
В нашей среде для разработки будут следующие компоненты:
В будущем добавить/убрать/изменить любой компонент очень просто с помощью конфигурационных файлов Docker и Docker-compose.
Приступаем
Создадим основную папку, например docker-lamp, которая будет корневой, а внутри создадим следующую структуру:
— sites — тут будут лежать наши проекты
— data
— mysql — тут будут храниться файлы наших баз данных
— logs — сюда будут записываться все логи
— config
— php — все настройки контейнера и php.ini
— nginx — — все настройки контейнера и конфигурационные файлы
Создаем в корневой папке файл docker-compose.yml и добавим в него следующее содержание (я постарался его прокомментировать чтобы не возникало вопросов):
Образы nginx и mysql прекрасно работают из коробки, а вот официальный образ php совсем пустой и в него не включены никакие расширения, еще мы хотели чтобы в нашей среде разработки был Composer.
Php.ini пока оставим пустым, если нам понадобиться в будущем настраивать PHP то воспользуемся им, а пока добавим в Dockerfile следующий код:
Теперь в папке sites для теста создадим тестовый проект Hello, для этого создадим папку hello и поместим туда единственный файл index.php который будет выводить информацию о php:
Остается только сконфигурировать NGINX, для этого добавим в /config/nginx файл hello.conf:
Не забываем в файле HOSTS добавить:
Запускаем терминал, переходим в нашу папку и запускаем команду:
Первый запуск может занять довольно длительное время, поскольку Докеру нужно скачать образы из интернета и собрать их.
Если при сборке не было никаких ошибок:
Переходим по адресу http://hello.loc/ и видим, что все работает.
Можно зайти в Docker-контейнер php и запустить bash, и проверить работает ли git и composer, для этого введем команду:
Завершаем работу командой:
Мы разобрали один из вариантов конфигурации, вы все можете настроить под себя. Может показаться, что это сложно и тратиться много времени, но настроив все один раз, вы и коллеги будите использовать это постоянно, разворачивая всю среду разработки одной строкой.
В начале я написал что в сборке будет присутствовать phpМyAdmin но, как вы заметили, его нет. Для тренировки попробуйте добавить его сами, а если не получится, то позже подготовлю инструкцию.
На Windows 10 у меня возникла ошибка при запуске контейнера MySQL, в логах было что то такое:
…..
[Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
…..
Гугление показало — это означает, что используемая файловая система не поддерживает aio. Для этого в docker-compose добавим команду:
В статье, в описание файла docker-compose, я это добавил.
Среда разработки php на базе docker
Среда разработки PHP на базе Docker
Возможности и особенности
В целом, среда разработки удовлетворяет требованию — «при использовании Docker каждый контейнер должен содержать в себе только один сервис».
Рассмотрим структуру проекта.
Примечание:
В некоторых каталогах можно встретить пустой файл .gitkeep. Он нужен лишь для того, чтобы была возможность добавить каталог под наблюдение Git.
.gitkeep — является заполнением каталога, это фиктивный файл, на который не следует обращать внимание.
Пример файла с основными настройками среды разработки.
Этот каталог предназначен для хранения ssh-ключей.
Документация, которую вы сейчас читаете.
Документ в формате YML, в котором определены правила создания и запуска многоконтейнерных приложений Docker. В этом файле описана структура среды разработки и некоторые параметры необходимые для корректной работы web-приложений.
Каталог базы данных MongoDB.
mongo.conf — Файл конфигурации MongoDB. В этот файл можно добавлять параметры, которые при перезапуске MongoDB будут применены.
db — эта папка предназначена для хранения пользовательских данных MongoDB.
dump — каталог для хранения дампов.
Каталог базы данных MySQL 5.7.
config-file.cnf — файл конфигурации. В этот файл можно добавлять параметры, которые при перезапуске MySQL 5.7 будут применены.
data — эта папка предназначена для хранения пользовательских данных MySQL 5.7.
dump — каталог для хранения дампов.
logs — каталог для хранения логов.
Каталог базы данных MySQL 8.
config-file.cnf — файл конфигурации. В этот файл можно добавлять параметры, которые при перезапуске MySQL 8 будут применены.
data — эта папка предназначена для хранения пользовательских данных MySQL 8.
dump — каталог для хранения дампов.
logs — каталог для хранения логов.
Эта папка предназначена для хранения файлов конфигурации Nginx и логов.
default.conf — файл конфигурации, который будет применён ко всем виртуальным хостам.
vhost.conf — здесь хранятся настройки виртуальных хостов web-проектов.
Рассмотрим vhost.conf подробнее:
В файле конфигурации описаны настройки для 2 web-проектов — project-1.localhost и project-2.localhost.
Здесь следует обратить внимание на то, как производится перенаправление запросов к нужному docker-контейнеру.
Например, для проекта project-1.localhost указано:
php-7.3 — название docker-контейнера, а 9000 — порт внутренней сети. Контейнеры между собой связаны через внутреннюю сеть, которая определена в файле docker-compose.yml.
В этом каталоге находятся файлы конфигурации PHP.
Для каждой версии PHP — свой файл конфигурации.
Место для хранения файлов конфигурации Supervisor.
Для каждой версии PHP — могут быть добавлены свои файлы с настройками.
Здесь хранится файл, в котором описаны действия, выполняемые при создании образов docker-контейнеров PHP.
Dockerfile — это текстовый документ, содержащий все команды, которые следует выполнить для сборки образов PHP.
Каталог для системы управления базами данных PostgreSQL.
data — эта папка предназначена для хранения пользовательских данных PostgreSQL.
dump — каталог для хранения дампов.
Каталог предназначен для хранения web-проектов.
Вы можете создать в это каталоге папки, и поместить в них ваши web-проекты.
Содержимое каталога projects доступно из контейнеров php-7.1 и php-7.3.
Если зайти в контейнер php-7.1 или php-7.3, то в каталоге /var/www будут доступны проекты, которые расположены в projects на локальной машине.
Каталог key-value хранилища Redis.
conf — папка для хранения специфических параметров конфигурации.
data — если настройки конфигурации предполагают сохранения данных на диске, то Redis будет использовать именно этот каталог.
Программы в docker-контейнерах PHP
Полный перечень приложений, которые установлены в контейнерах php-x.x можно посмотреть в php-n-workspace/Dockerfile.
Здесь перечислим лишь некоторые, наиболее важные:
1. Выполните клонирование данного репозитория в любое место на вашем компьютере.
Перейдите в директорию, в которую вы клонировали репозиторий. Все дальнейшие команды следует выполнять именно в этой директории.
Удалите файл .gitkeep в каталоге postgres/data/, иначе он помешает запуску PostgreSQL.
2. Скопируйте файл .env-example в .env
Если это необходимо, то внесите изменения в файл .env. Измените настройки среды разработки в соответствии с вашими требованиями.
3. Выполните клонирование web-проектов в каталог projects.
Для примера, далее мы будем исходить из предположения, что у вас есть 2 проекта:
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.
Не рекомендуем использовать имя хоста с .dev на конце в среде разработки. Лучшей практикой является применение других названий — .localhost или .test.
6. [опционально] Настройте маршрутизацию внутри контейнеров web-проектов.
Web-проекты должны иметь возможность отправлять http-запросы друг другу и использовать для этого название хостов.
Из одного запущенного docker-контейнера php-7.1 web-приложение №1 должно иметь возможность отправить запрос к другому web-приложению №2, которое работает внутри 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 следует использовать следующие названия хостов и порты:
Сервис | Название хоста | Порт |
---|---|---|
MySQL 5.7 | mysql-5.7 | 3306 |
MySQL 8 | mysql-8 | 3306 |
PostgreSQL | postgres | 5432 |
MongoDB | mongo | 27017 |
Redis | redis | 6379 |
Именно эти параметры следует использовать для конфигурации web-проектов.
Для соединения с базами данных с локальной машины:
7. Создайте контейнеры и запустите их.
Создание контейнеров займёт некоторое время. Обычно, от 10 до 30 минут. Дождитесь окончания процесса. Ваш компьютер не должен во время данного процесса потерять доступ в интернет.
8. Создайте SSH-ключи
Для работы web-проектов могут потребоваться SSH-ключи, например для того, чтобы из контейнера при помощи Composer можно было установить пакет из приватного репозитория.
Создать SSH-ключи можно при помощи следующей команды:
Вместо your-name@example.com укажите свой email.
В папку .ssh/ будут сохранены 2 файла — публичный и приватный ключ.
Если вы скопировали в папку .ssh свой ранее созданный ssh-ключ, то убедитесь, что файл id_rsa имеет права 700 (-rwx——@).
Установить права можно командой:
9. Проверьте созданные docker-контейнеры.
Если создание контейнеров прошло успешно, то вы увидите примерно такой результат:
10. Установка зависимостей для web-приложений.
Если для работы web-приложений необходимо установить зависимости, например через менеджер пакетов Composer или NPM, то сейчас самое время сделать это.
В контейнерах php-7.1, php-7.3 и php-8.0 уже установлен и Composer и NPM.
Войдите в контейнер php-7.1:
Перейдите в рабочий каталог необходимого web-проекта и выполните требуемые действия.
Например, установите зависимости через Composer при помощи команды:
Несколько наиболее важных вопросов и ответов на них.
Как зайти в работающий docker-контейнер?
container_name — имя контейнера.
Как останавливать и удалить контейнеры и другие ресурсы среды разработки, которые были созданы?
Как получить список всех контейнеров?
Как получить подробную информацию о docker-контейнере?
container_name — имя контейнера.
Как узнать какие расширения PHP установлены в контейнере php-7.3?
Если контейнер php-8.0 запущен, то выполните команду:
Как удалить все контейнеры?
Удаление всех контейнеров:
Удаление всех активных контейнеров:
Удаление всех неактивных контейнеров:
Развёртывание дампов MySQL, PostgreSQL и MongoDB
Если для работы web-проектов требуются перенести данные в хранилища, то следуйте описанным ниже инструкциям.
Как развернуть дамп PostgreSQL?
Выполните следующую команду на локальной машине:
или зайдите в контейнер postgres и выполните:
user_name — имя пользователя. Значение POSTGRES_USER.
database_name — название базы данных. Значение POSTGRES_DB.
Как развернуть дамп MySQL?
Вариант 1
Если требуется создать дополнительных пользователей, то следует это сделать перед началом процедуры загрузки дампа.
В файле mysql/conf.d/config-file.cnf отключите лог медленных запросов slow_query_log=0 или установите большое значение long_query_time, например 1000.
Если дамп сжат утилитой gzip, сначала следует распаковать архив:
Затем можно развернуть дамп, выполнив на локальном компьютере команду:
Указывать пароль в командной строке — плохая практика, не делайте так в производственной среде.
MySQL выдаст справедливое предупреждение:
mysql: [Warning] Using a password on the command line interface can be insecure.
Ключ —force говорит MySQL, что ошибки следует проигнорировать и продолжить развёртывание дампа. Этот ключ иногда может пригодится, но лучше его без необходимости не применять.
Вариант 2
Воспользоваться утилитой Percona XtraBackup.
Percona XtraBackup — это утилита для горячего резервного копирования баз данных MySQL.
О том, как работать с XtraBackup можно узнать по ссылке: https://habr.com/ru/post/520458/.
Как развернуть дамп MongoDB?
Скопируйте фалы дампа в каталог mongo/dump.
Войдите в контейнер mongo:
Выполните следующую команду, чтобы развернуть дамп базы database_name:
Среда разработки PHP на базе Docker
Решение, которое позволит создать на локальном компьютере универсальную среду разработки на PHP за 30 — 40 минут.
В целом, среда разработки удовлетворяет требованию — при использовании Docker каждый контейнер должен содержать в себе только один сервис.
Рассмотрим структуру проекта.
.gitkeep — является заполнением каталога, это фиктивный файл, на который не следует обращать внимание.
Пример файла с основными настройками среды разработки.
Каталоги и файлы, в которых хранятся пользовательские данные, код ваших проектов и ssh-ключи внесены в. gitignore.
Этот каталог предназначен для хранения ssh-ключей.
Документ в формате YML, в котором определены правила создания и запуска многоконтейнерных приложений Docker. В этом файле описана структура среды разработки и некоторые параметры необходимые для корректной работы web-приложений.
Каталог базы данных MongoDB.
mongo.conf — Файл конфигурации MongoDB. В этот файл можно добавлять параметры, которые при перезапуске MongoDB будут применены.
db — эта папка предназначена для хранения пользовательских данных MongoDB.
dump — каталог для хранения дампов.
Каталог базы данных MySQL 5.7.
config-file.cnf — файл конфигурации. В этот файл можно добавлять параметры, которые при перезапуске MySQL 5.7 будут применены.
data — эта папка предназначена для хранения пользовательских данных MySQL 5.7.
dump — каталог для хранения дампов.
logs — каталог для хранения логов.
Каталог базы данных MySQL 8.
config-file.cnf — файл конфигурации. В этот файл можно добавлять параметры, которые при перезапуске MySQL 8 будут применены.
data — эта папка предназначена для хранения пользовательских данных MySQL 8.
dump — каталог для хранения дампов.
logs — каталог для хранения логов.
Эта папка предназначена для хранения файлов конфигурации 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.
Для каждой версии PHP — свой файл конфигурации.
Место для хранения файлов конфигурации Supervisor.
Для каждой версии PHP — могут быть добавлены свои файлы с настройками.
Здесь хранится файл, в котором описаны действия, выполняемые при создании образов docker-контейнеров PHP.
Dockerfile — это текстовый документ, содержащий все команды, которые следует выполнить для сборки образов PHP.
Каталог для системы управления базами данных PostgreSQL.
data — эта папка предназначена для хранения пользовательских данных PostgreSQL.
dump — каталог для хранения дампов.
Каталог предназначен для хранения web-проектов.
Вы можете создать в это каталоге папки, и поместить в них ваши web-проекты.
Содержимое каталога projects доступно из контейнеров php-7.1 и php-7.3.
Если зайти в контейнер php-7.1 или php-7.3, то в каталоге /var/www будут доступны проекты, которые расположены в projects на локальной машине.
Каталог key-value хранилища Redis.
conf — папка для хранения специфических параметров конфигурации.
data — если настройки конфигурации предполагают сохранения данных на диске, то Redis будет использовать именно этот каталог.
Полный перечень приложений, которые установлены в контейнерах 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 следует использовать следующие названия хостов и порты:
Именно эти параметры следует использовать для конфигурации web-проектов.
Для соединения с базами данных с локальной машины:
7. Создайте контейнеры и запустите их.
Создание контейнеров займёт некоторое время. Обычно от 10 до 30 минут. Дождитесь окончания процесса. Ваш компьютер не должен потерять доступ в интернет.
Если вы всё сделали правильно, то контейнеры будут созданы и запущены.
Откройте Docker Dashboard и убедитесь в этом:
8. Создайте SSH-ключи.
Для работы web-проектов могут потребоваться SSH-ключи, например для того, чтобы из контейнера при помощи Composer можно было установить пакет из приватного репозитория.
Создать SSH-ключи можно при помощи следующей команды:
В папку .ssh/ будут сохранены 2 файла — публичный и приватный ключ.
9. Проверьте созданные docker-контейнеры.
Если создание контейнеров прошло успешно, то вы увидите примерно такой результат:
10. Установка зависимостей для web-приложений.
Если для работы web-приложений необходимо установить зависимости, например через менеджер пакетов Composer или NPM, то сейчас самое время сделать это.
В контейнерах php-7.1 и php-7.3 уже установлен и Composer и NPM.