Docker установка и настройка

При разработке используется множество технологий. К примеру данный блог использует php(Symfony 2), mongodb, elastic, nginx это основные но также используется nodejs к примеру для минификации css, js. При разработке приходится настраивать все технологии как показано в статье. Но что делать если проектов несколько или они используют разные технологии, например другой проект использует MySQL, или еще могут использовать разные версии php или других библиотек. Для разработки и поддержки проектов на разных технологиях можно использовать Виртуальную машину и поставить на нее к примеру centos, но это не совсем удобно, надо все равно настраивать подобное окружение как на сервере и на других машинах разработчиков. Мы будет использовать контейнеры, такие как Docker. Настроем блог разработчиков чтобы использовать Docker для разработки.

Установка

Для установки надо перейти на официальный сайт и следовать инструкциям, в моем случае это установка на OSx.

Устанавливаем и запускаем, в панели уведомления появится значок Docker и его минимальные настройки.

Настройка проекта

Для настройки в корневой папке создадим файл docker-compose.yml с таким содержимым

version: '2'

services:
    nginx:
        image: nginx:latest
        ports:
            - "80:80"
            - "443:443"
        links:
            - app
        volumes:
            - ./:/var/www
            - ./app/config/nginx/blog.conf:/etc/nginx/conf.d/blog.conf
        restart: always
    mongo:
        image: mongo:latest
        restart: always
        ports:
            - "27017:27017"
        volumes:
            - ./var/data:/data/db
            - ./var/dump:/data/dump
    elasticsearch:
        image: elasticsearch:1.7.5
        restart: always
        ports:
            - "9200:9200"
            - "9300:9300"
        volumes:
            - ./var/esdata:/usr/share/elasticsearch/data
    memcached:
        image: memcached:latest
        restart: always
        ports:
            - "11211:11211"
    app:
        build: app/config/docker
        depends_on:
            - mongo
            - memcached
            - elasticsearch
        links:
            - mongo
            - memcached
            - elasticsearch
        restart: always
        volumes:
          - ./:/var/www
        working_dir: /var/www

Для проекта мы используем синтаксис docker-compose второй версии. В разделе services перечислены все сервисы необходимые для работы проекта. Многие сервисы использует официальные образы, например nginx, mongo, elasticsearch. Это указано параметром image через двоеточие указана версия образа, к примеру elastic использует версию 1.7.5. 

Параметр links указывает на связи между сервисами, указываем название сервиса. 

Параметр ports указывает какие порты необходимо пробрасывать, Например сервис nginx доступен на порте 80 нашего компьютера.

Volumes указывает какие папки или файлы из локальной системы должны быть доступны в контейнере, например nginx указывает настройки на настройки сервера для работы блога, в файле проекта /app/config/nginx/blog.conf с такими настройками

server {
    server_name blog.local;
    listen 80;
    root /var/www/web;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /app_dev.php$is_args$args;
    }
    # DEV
    # This rule should only be placed on your development environment
    # In production, don't include this and don't deploy app_dev.php or config.php
    location ~ ^/(app_dev|config)\.php(/|$) {
        fastcgi_pass app:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
    }
}

Параметр restart указывает что когда в контейнере произойдет ошибка при работе с сервисом, docker перезапустит контейнер. Поэтому стоит придерживаться правила один сервис один контейнер.

Подробнее остановимся на сервисе app, там находится наш код и запускается php-fpm. Данный сервис имеет дополнительные пакеты необходимые для разработки проекта. поэтому он использует свои настройки в файле app/config/docker/Dockerfile такого содержимого:

FROM 4devs/phpfpm:5.6

RUN yum -y install php-pecl-mongo && yum clean all

RUN yum -y install nodejs npm jpegoptim gem \
    && npm install -g uglifycss uglify-js less \
    && gem install sass

# Add global binary directory to PATH and make sure to re-export it
ENV PATH /composer/vendor/bin:$PATH

# Allow Composer to be run as root
ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_VERSION 1.2.0

RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer \
  && curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig \
  && php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }"

# Install Composer
RUN php /tmp/composer-setup.php --no-ansi --install-dir=/usr/local/bin --filename=composer --version=${COMPOSER_VERSION} && rm -rf /tmp/composer-setup.php

WORKDIR /var/www

Команда FROM указывает образ которые использовать в качестве основы, можно указать любой образ из hub.docker.com.

Далее мы устанавливаем расширение php - mongo. Следующей строкой RUN устанавливаем пакеты  nodejs npm и так далее. Любая команда RUN написаная в таком формате исполняется в контейнере как команда в рабочей строке как /bin/sh -c  <command>

Параметром ENV мы настраиваем рабочее окружение в контейнере.

Далее мы устанавливаем composer и рабочих директорию параметром WORKDIR.

На данном этапе все наши настойки закончились.

Запуск проекта

В корне проекта запускаем команду docker-compose build. и ждем пока docker скачает и соберет контейнеры. Для того чтобы запустить проект используется команда docker-compose up, мы увидем вывод log примерно такой

Для открытия проекта из браузера добавим в файл /etc/hosts строку с таким содержанием 127.0.0.1 blog.local andrey.blog.local

В работе с проектом через Docker и текущем окружении есть различия к примеру локально нам не доступен mongo. Разные пути к проекту у нас локальном может даже быть не установлено и не настроено ничего кроме docker. Для работы в проекте необходимо подключится к контейнеру app для этого надо использовать команду docker exec -it blog_app_1 /bin/bash . Мы попадаем в рабочее окружение проекта и нам доступно все что мы устанавливали ранее также доступна консоль Symfony2.

Чтобы остановить проект необходимо использовать команду docker-compose down

Если вы по другому назвали файл конфигурации или расположили его в другой папке то можно использовать ключ с параметром -f docker-compose.yml Можно использовать несколько конфигураций с разными файлами, также миксовать файлы, об этом подробнее можно прочитать в документации.

Заключение

Можно настроить разные проекты которые используют разные технологии, разные версии пакетов. К примеру можно будет перевести данный блог на PHP7 при этом остальные проекты могут использовать другие версии php.

Единственное замечание, я использовал версию docker для версии OS X 10.10.3 Yosemite и выше. Если у вас более старая версия системы, в данном случае есть альтернативная установка но вам прийдется самим запускать демон и определить ip адрес сервиса(к примеру с nginx).

Пока docker я использую только для разработки, для deploy использую capifony, возможно в дальнейшем на рабочем севере тоже будет docker, тогда об этом появятся статьи, подписывайтесь на наш блог и следите за обновлениями.

Читайте также:

Как использовать произвольное хранилище пользователей в FOSUserBundle

Практически все используют FOSUserBundle в своих Symfony проектах т.к. он ускоряет разработку и обладает хорошим набором функциональности для управления пользователями. Бандл предоставляет несколько готовых реализаций хранилищ данных: Propel и несколько для Doctrine (ORM и ODM). Это здорово, но иногда возникает необходимость работы с другими хранилищами данных. FOSUserBundle достаточно гибок и позволяет реализовать, и использовать произвольное хранилище. Для того, чтобы использовать все возможности FOSUserBundle Вам достаточно будет написать свой менеджер пользователей под конкретного провайдера.

Интеграция Paysera в Symfony

Сегодня сложно представить себе серьезный проект, где не понадобилась бы интеграция с платежными системами. Не смотря на то что существует множество популярных систем и аггрегаторов, таких как PayPal, RBKMoney, Paymentwall, Robokassa и т.д., я хочу рассказать о Paysera. Это еще одна, довольно новая платежная система. Они позиционируют себя как выгодных с точки зрения комиссий за их услуги. Paysera позволяет вашим пользователям расплачиваться карточками, SMS и т.д. Интеграция довольно простая, однако имеет некоторые неочевидные моменты, которые я и хочу осветить.

Настройка php, MySQL, nodejs, nginx и mongodb в OS X El Capitan

Недавно вышла OS X El Capitan, давайте обновим систему. Систему будем устанавливать с usb-flash. Из рабочего окружения мы поставим  php, nginx, mariadb, mongodb, elasticsearch, nodejs используя brew и настроем проект на symfony2.

Создание сайта “Обратный отсчет” на Symfony2

Мы иногда видим сайты с обратным отсчетом, проект стартует через … Его сделать достаточно просто, и не займет много времени. Мы воспользуемся проектом fdevs/coming-soon, который основан на Symfony2. Также будем сохранять введеный пользователями адреса электронной почтой в базу данных MongoDB. У нас есть настроенное рабочее окружение Osx, о настройке можно прочитать в статье Yosemite настройка рабочего окружения. Но главное версия php не меньше 5.4. В проекте можно также использовать реляционную базу данных типа MySQL. По умолчанию в проекте вообще не используется база данных, а введеный email отправляется на почту.

Автоматический deploy Symfony 2 используя Capifony

При разработке, и тем более поддержке действующего проекта на Symfony 2 одной из задач, которые приходится постоянно делать, это выгрузка изменений на сервер: рабочей или тестовой. Но так как программисты народ достаточно ленивый, чтобы автоматизировать повторяющиеся монотонные задачи, есть достаточное количество инструментов для облегчения данного процесса. Для Symfony2 мы используем Сapifony. Он основан на Capistrano но оптимизирован для Symfony.