понедельник, 10 августа 2015 г.

Docker для PHP Разработчка. Часть 1 - Теоретическая.

Навеяно этим Docker for PHP Developers и Run a Symfony application using Docker and docker-compose

Первое, что приходит на ум, если говорить о виртуализации локальных окружений - Vagrant. Vagrant - это, согласно официальной документации, утилита, для создания и конфгурирования легковесных, легко воспроизводимых и портативных дев окружений. В основном Vagrant поможет вам создать витруальную машину с уникальной комбинацией ПО, сконигурированного индивидуально для каждого проекта. Этот подход предлагает решить 3 вещи:
  1. Vagrant изолирует окружение для избежания конфликтов версий ПО.
  2. Vagrant сохраняет конфигурации и версии одинаковые для каждого члена команды.
  3. Vagrant можно настроить максимально похожим к продакшен окружению.
Но, у Vagrant есть большой недостаток - он эмулирует аппаратную часть.
Это значит, что каждая виртуальная машина - это целая Операционная система с большим оверхедом системных ресурсов (таких как CPU, ОЗУ и гигабайты дискового пространства). И, уверяю, если у вас много виртуальных машин, вы часто будете видеть системное сообщение Your startup disk is almost full.

Логичное решение - это запускать несколько проектов в одной Vagrant виртуальной машине. Laravel Homestead - популярный Vagrant box использует эту стратегию. Но в таком случаем вы жертвуете изоляцией и не можете сконфигурировать стек ПО для каждого проекта отдельно.

Есть другое решение! Слышали про Docker? Docker - это общее название нескольких компонентов. Вместе, эти компоненты агрегируют инфрастуктуру логических частей ПО (контейнеров). Вы можете использовать их вместе или отдельно, чтобы сэмулировать дев, тест или прод окружение.

Что такое контейнер (Docker Container)?

Контейнер - это один сервис большого приложения. Для примера, если мы настраиваем PHP приложение, на нужен web-сервер (apache, nginx), сервер приложения (php-fpm), база данных (MySQL). Каждый из этих сервисов может быть обернуть в отдельный контейнер. А три сервиса, связанные вместе - образуют окружение.

Что такое образ (Docker Image)?

Представьте, что образ - это PHP класс. От одного класа можно инициировать множесто уникальных объектов - так же используя образ можно развернуть множество уникальных контенеров. Для примера: мы можем повторно использовать php-fpm образ, чтобы создавать разные конфигурации контейнеров.

В чем отличие Docker от Vagrant?

Чем Docker лучше Vagrant, если мы запускаем множество контейнеров для каждого проекта? Это не хуже, чем запускать виртуальную машину на Vagrant? Нет, и вот почему

Docker образы наследуются

Docker образы похожи на PHP классы, т.к. они наследуются от родительского образа. Напр., nginx docker образ наследуется от phusion/baseimage, который в свою очередь наследуется от популярного ubuntu образа. Каждый образ содержит лишь разницу от родительского контейнера. Это значит, что большинство популярных  ubuntu  образов содержат только минимальную Ubuntu ОС, а  phusion/baseimage  содержит только утилиты для нормальной работы Ubuntu в контейнере, а nginx образ только nginx web-сервер и конфигурацию. Таким образом ubuntu:14.04 образ будет присутствовать у вас в системе только один раз, т.к. он общий для перечисленных выше.

Docker конетйнеры легковесные

Контейнеры легковесные и требуют минимальное к-во локальных ресурсов. Запуск контейнера из образа занимает секунды. В то время как  vagrant up --provision  может запускаться 15-30 мин.

Docker работает на низкоуровневой библиотекой libcontainer. Эта утилита позволяет изолировать системные процессы и ограничивать их доступы к системным ресурсам. Но Docker, это не только libcontainer, он использует много системных утилит для создания и работы контенеров.

Docker - это лучшее из 2х миров виртуализации. Vagrant концентрируется на аппаратной виртуализации, Docker больше концентрируется на изоляции процессов. Оба инструмента - Vagrant и Docker - это средства для создания изолированных окружений, но на данный момент Docker делает это более эффективно.

Комментариев нет: