Docker и в принципе контейнеризация  — одни из самых замечательных разработок в сфере DevOps за последние несколько лет. Они сильно упрощают развертывание проекта за счет управления параметрами среды и, таким образом, упрощают перенос проектов между операционными системами.

Контейнеры (в частности докер-контейнеры) легко разворачиваются, поэтому, если у вас есть проект, вам не придется много над этим работать. В общем, Docker звучит как отличный вариант, но действительно ли с ним все так просто?

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

В чем Docker плох

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

Запуск приложений с графическим интерфейсом. Docker был специально разработан как решение для размещения приложений. Есть несколько решений этой проблемы (одно из них — пересылка X11), но в целом они довольно неуклюжие. Вы также можете запустить контейнеризацию в качестве веб-интерфейса, но раздражающие ограничения все равно будут. В любом случае, если вам нужен графический интерфейс как часть контейнеризации, я бы поискал его в другом месте.

Повышение скорости. Докер-контейнеры меньше виртуальной машины с базой данных и сервером и, соответственно, требуют меньше ресурсов. Тем не менее, Docker использует ровно столько системных ресурсов, сколько позволяет планировщик ядра (kernel scheduler). Так что Docker не сильно ускорит ваше приложение. Не ожидайте от него значительного повышения скорости.

Кросс-платформенная совместимость. У докер-контейнеров странные и непонятные отношения с кросс-платформенной совместимостью, как бы вы ни пытались решить эту проблему. Docker требует Linux в качестве операционной системы, и если все члены команды используют Linux — проблем нет. Но когда команда использует несколько ОС одновременно, всплывают всякие нехорошие штуки. На виртуальные машины, однако, это ограничение не распространяется. Контейнеры на самом деле не выполняют настоящую виртуализацию. Так что, например, запустить windows-контейнер на Linux не получится.

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

И Docker, и виртуальные машины можно использовать для упаковки и распространения ПО. Однако контейнеры, как правило, намного меньше и работают быстрее, что делает их гораздо более подходящими для «быстрых циклов» разработки. При этом контейнеры не выполняют настоящую виртуализацию: вы не можете запустить windows-контейнер на Linux.

Несколько компаний сейчас пытаются создать инструменты для упрощенных виртуальных машин, чтобы использовать преимущества обоих решений. И такие инструменты уже есть: hyper.sh, Intel Clear Containers и vSphere Integrated Containers.

Короче говоря, не обманывайтесь: Docker пока не может удовлетворить все ваши потребности.

Перевод статьи: When Not to Use Docker