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

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

Установка

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

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

 

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

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

  1. version: ‘2’
  2.  
  3. services:
  4. nginx:
  5. image: nginx:latest
  6. ports:
  7. «80:80»
  8. «443:443»
  9. links:
  10. app
  11. volumes:
  12. ./:/var/www
  13. ./app/config/nginx/blog.conf:/etc/nginx/conf.d/blog.conf
  14. restart: always
  15. mongo:
  16. image: mongo:latest
  17. restart: always
  18. ports:
  19. «27017:27017»
  20. volumes:
  21. ./var/data:/data/db
  22. ./var/dump:/data/dump
  23. elasticsearch:
  24. image: elasticsearch:1.7.5
  25. restart: always
  26. ports:
  27. «9200:9200»
  28. «9300:9300»
  29. volumes:
  30. ./var/esdata:/usr/share/elasticsearch/data
  31. memcached:
  32. image: memcached:latest
  33. restart: always
  34. ports:
  35. «11211:11211»
  36. app:
  37. build: app/config/docker
  38. depends_on:
  39. mongo
  40. memcached
  41. elasticsearch
  42. links:
  43. mongo
  44. memcached
  45. elasticsearch
  46. restart: always
  47. volumes:
  48. ./:/var/www
  49. working_dir: /var/www

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

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

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

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

  1. server {
  2. server_name blog.local;
  3. listen 80;
  4. root /var/www/web;
  5.  
  6. location / {
  7. # try to serve file directly, fallback to app.php
  8. try_files $uri /app_dev.php$is_args$args;
  9. }
  10. # DEV
  11. # This rule should only be placed on your development environment
  12. # In production, don’t include this and don’t deploy app_dev.php or config.php
  13. location ~ ^/(app_dev|config)\.php(/|$) {
  14. fastcgi_pass app:9000;
  15. fastcgi_split_path_info ^(.+\.php)(/.*)$;
  16. include fastcgi_params;
  17. fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
  18. fastcgi_param DOCUMENT_ROOT $realpath_root;
  19. }
  20. }

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

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

  1. FROM 4devs/phpfpm:5.6
  2.  
  3. RUN yum y install phppeclmongo && yum clean all
  4.  
  5. RUN yum y install nodejs npm jpegoptim gem \
  6. && npm install g uglifycss uglifyjs less \
  7. && gem install sass
  8.  
  9. # Add global binary directory to PATH and make sure to re-export it
  10. ENV PATH /composer/vendor/bin:$PATH
  11.  
  12. # Allow Composer to be run as root
  13. ENV COMPOSER_ALLOW_SUPERUSER 1
  14.  
  15. ENV COMPOSER_VERSION 1.2.0
  16.  
  17. RUN curl o /tmp/composersetup.php https://getcomposer.org/installer \
  18. && curl o /tmp/composersetup.sig https://composer.github.io/installer.sig \
  19. && 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); }»
  20.  
  21. # Install Composer
  22. RUN php /tmp/composersetup.php noansi installdir=/usr/local/bin filename=composer version=${COMPOSER_VERSION} && rm rf /tmp/composersetup.php
  23.  
  24. 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, тогда об этом появятся статьи, подписывайтесь на наш блог и следите за обновлениями.