При разработке веб-приложений, одной из проблем является запуск локальной версии приложения. Так как со временем проект обрастает зависимостями, процесс установки приложения усложняется. Приходится писать документацию по установке. При этом возникает новая проблема — документацию нужно поддерживать в актуальном состоянии, иначе она теряет смысл, но программисты не любят это делать. Так же конфигурационный файл локальной версии приложения как правило отличается от версии, хранящейся в системе контроля версий. Поэтому, когда в команду приходит новый сотрудник, начинаются проблемы с развертыванием локальной версии приложения, так как приходится по крупицам собирать изменения, которые не были внесены в документацию по установке.
Проблему настройки локальной среды разработки можно решить с помощью Docker Compose — инструмента, позволяющего настраивать и запускать несколько docker-контейнеров одновременно. Docker Compose использует YAML файл для описания сервисов, требуемых приложению. После настройки, все сервисы можно установить и запустить одной командой.
Настройка веб-приложения на Laravel с помощью Docker Compose
Рассмотрим работу с Docker Compose на примере веб-приложения на Laravel, которое работает с базой данных PostgreSQL и Redis для кеширования информации.
Для начала вам нужно установить Docker Engine и Docker Compose. Инструкции по установке для вашей операционной системы вы можете найти по указанным ссылкам.
Шаг 1. Установка
Для установки Laravel воспользуемся Composer:
composer create-project --prefer-dist laravel/laravel test_project
Данная команда скачает исходники Laravel и установит все его зависимости.
После установки в директории проекта будет файл .env
с настройками приложения. Если файл не был создан автоматически, просто скопируйте его из файла .env.example
.
Теперь укажем следующие настройки:
DB_CONNECTION=pgsql DB_HOST=postgres DB_PORT=5432 DB_DATABASE=postgres DB_USERNAME=postgres DB_PASSWORD= REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379
Шаг 2. Создание Dockerfile
На этом шаге мы создадим Dockerfile, который будет создавать контейнер с приложением, устанавливать все зависимости, необходимые для работы Laravel.
В директории проекта создадим файл Dockerfile
и вставим следующее содержимое:
FROM php:7 RUN apt-get update -y && apt-get install -y openssl zip unzip git libpq-dev RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN docker-php-ext-install pdo mbstring ADD . /test_project WORKDIR /test_project RUN composer install CMD php artisan serve --host=0.0.0.0 --port=8181 EXPOSE 8181
Эта конфигурация означает следующее:
- Создать контейнер приложения из официального контейнера PHP 7.
- Установить необходимые для работы Laravel пакеты: openssl, zip. Так же официальный контейнер PHP имеет проблему с установкой драйверов PDO для PostgreSQL, решить ее можно установкой дополнительного пакета libpq-dev
- Установить Composer.
- Установить следующие php-расширения: pdo, mbstring.
- Добавить текущую директорию
.
в директорию/test_project
контейнера. - Сделать
/test_project
рабочей директорией контейнера. - Установить зависимости проекта с помощью Composer.
- Сделать командой по умолчанию для контейнера запуск встроенного в php сервера на порту 8181 командой
php artisan serve
. - Указать, что контейнер будет ждать соединений на порту 8181.
Шаг 3. Описание сервисов в файле Compose
Создадим следующий файл docker-compose.yml
в директории проекта:
version: '3' services: web: build: . ports: - "8181:8181" volumes : - ".:/test_project" postgres: image: "postgres:alpine" redis: image: "redis:alpine"
Данный файл описывает 3 сервиса:
- Сервис
web
использует контейнер, созданный из файлаDockerfile
в текущей директории. При этом текущая директория добавлена в контейнер как «volume», это позволяет обновлять код приложения в контейнере без перезагрузки самого контейнера. - Сервисы
postgres
иredis
используют официальные контейнеры с Docker Hub.
Шаг 4. Сборка и запуск проекта с Compose
Для запуска проекта проекта просто запустите в директории проекта следующую команду:
docker-compose up
Compose скачает необходимые контейнеры и запустит все указанные сервисы. Если вы используете нативный Docker для Linux, Docker для Mac или Docker для Windows, откройте http://localhost:8181/ или http://0.0.0.0:8181/ в браузере. Если вы используете Docker Machine для Mac или Windows, воспользуйтесь docker-machine ip MACHINE_VM для получения IP адреса хоста Docker. После этого вы должны увидеть в браузере стартовый экран Laravel.
Шаг 5. Проверка подключения к Redis и PostgreSQL.
Для работы с redis потребуется установить библиотеку predis:
composer require predis/predis
Теперь убедимся, что подключение к Postgresql и Redis работает. Добавим в routes/web.php
следующий код:
Route::get('/test', function () { echo 'Connected to database: ' . DB::connection()->getDatabaseName() . '<br>'; echo 'Visitors count: ' . Redis::incr('visitorsCount'); });
Теперь откройте в браузере /test
, вы должны увидеть следующий текст:
Connected to database: postgres Visitors count: 1
При обновлении страницы счетчик будет увеличиваться. Таким образом мы получили полностью работающее приложение на php, использующее PostgreSQL и Redis.
Для того, чтобы развернуть этот же проект на новой машине понадобится только установить docker и docker-compose, склонировать ваш репозиторий git, и запустить в консоли: docker-compose up
. На этом настройка проекта будет завершена.
Вывод
Как мы видим, Docker Compose позволяет значительно упростить настройку девелоперского окружения и сохранить много времени и нервов при приходе в команду новых сотрудников. Так же весь процесс сборки описывается в коде и хранится в системе контроля версий вместе с кодом приложения, так что дублирование этой информации в документации не требуется.
Пример, рассмотренный в статье вы можете скачать с GitHub: https://github.com/RusinovIG/blog-examples/tree/master.
Если вам интересна тема разработки с использованием Docker, прочитайте также об отладке PHP-приложений в Docker с помощью PhpStorm и Xdebug.
А вы используете Docker и Docker Compose для запуска локальной среды разработки?
Еще не юзал Docker Compose. Спасибо, надо попробовать.
Пол года пользуюсь докером при разработке. Очень сильно облегчает жизнь при переустановке операционной системы на компьютере и подготовке рабочего окружения для новых разработчиков.
P.S. В вашем случае я бы еще конейнер с базой добавил бы
Для базы и redis уже используются отдельные контейнеры. Посмотрите содержимое docker-compose.yml