При разработке веб-приложений, одной из проблем является запуск локальной версии приложения. Так как со временем проект обрастает зависимостями, процесс установки приложения усложняется. Приходится писать документацию по установке. При этом возникает новая проблема — документацию нужно поддерживать в актуальном состоянии, иначе она теряет смысл, но программисты не любят это делать. Так же конфигурационный файл локальной версии приложения как правило отличается от версии, хранящейся в системе контроля версий. Поэтому, когда в команду приходит новый сотрудник, начинаются проблемы с развертыванием локальной версии приложения, так как приходится по крупицам собирать изменения, которые не были внесены в документацию по установке.

Проблему настройки локальной среды разработки можно решить с помощью 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 для запуска локальной среды разработки?

Вливайтесь в общение

3 комментария

  1. Еще не юзал Docker Compose. Спасибо, надо попробовать.

  2. Пол года пользуюсь докером при разработке. Очень сильно облегчает жизнь при переустановке операционной системы на компьютере и подготовке рабочего окружения для новых разработчиков.

    P.S. В вашем случае я бы еще конейнер с базой добавил бы

    1. Для базы и redis уже используются отдельные контейнеры. Посмотрите содержимое docker-compose.yml

Оставьте комментарий

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

%d такие блоггеры, как: