При разработке используется множество технологий. К примеру данный блог использует 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, тогда об этом появятся статьи, подписывайтесь на наш блог и следите за обновлениями.