Контейнеры и виртуальные машины находятся в разных областях применения. Выбор того или иного варианта зависит от задачи, которая стоит перед вами. При этом популярность контейнеров быстро растёт. Давайте разберёмся, почему это происходит.
Допустим, вы программист, и у вас есть задача разместить веб-сайт, бота или приложение.
Традиционно есть три основных варианта:
- Использовать собственный физический сервер
- Воспользоваться виртуальной машиной на хостинге
- Обратиться к облачным сервисам, например, Amazon EC2
Если вам нужна высокая производительность, вы понимаете, сколько вычислительных ресурсов вам требуется, и у вас есть специалист по администрированию, то аренда или покупка физического сервера может быть логичным выбором.
Если администратора серверов у вас нет, обратите внимание на облачные решения. Это может быть дорого, но они избавят от многих задач, не требуют наличия специалистов и выдерживают большие нагрузки.
Если ваш сервис не требует высокой производительности, у вас есть время на администрирование, то виртуальная машина может быть хорошим выбором. Это особенно удобно, если вы хотите разделить ресурсы с другими пользователями и не переплачивать за неиспользуемые.
Но что, если:
- Ваш проект недостаточно большой, чтобы платить за облачные решения типа Amazon
- У вас нет желания заниматься администрированием
- Вам нужна большая масштабируемость, нежели у физического сервера?
Здесь контейнеры могут быть полезными.
Контейнеры, как и виртуальные машины — инструменты виртуализации, которые позволяют абстрагироваться от физической инфраструктуры сервера.
Главное отличие между контейнерами и виртуальными машинами заключается в том, что изоляция происходит на уровне операционной системы / аппаратного оборудования. Контейнеры представляют собой изолированное окружение для приложения, в котором содержатся все необходимые компоненты для его работы, включая библиотеки, файлы и метаданные.
Идея контейнеризации существовала давно, но настоящий взлет произошел с появлением Docker. Это позволяет не писать сложные инструкции для развертывания сервисов на разных серверах, а еще избавляет от забот об ОС. Теперь код можно упаковать в контейнер, передать заказчику и быть уверенным, что всё запустится без проблем. (Docker — не единственное средство контейнеризации).
Единичный контейнер Docker — хорошо. А что, если их много? Здесь на помощь приходит Kubernetes, способный оркестрировать их.
Kubernetes управляет запуском сервисов и распределением нагрузки на серверы, обеспечивая оптимальное использование ресурсов. Это подобно контейнеровозу, который перевозит контейнеры и управляет их размещением. Программисту остается лишь загрузить контейнеры, а Kubernetes берет на себя все остальное.
Чем же контейнеры лучше виртуальных машин?
Задача контейнеров и виртуальных машин одна и та же, но они решают ее по-разному. Контейнеры обеспечивают виртуализацию на уровне операционной системы, в то время как виртуальные машины — на уровне аппаратного оборудования. Благодаря этому контейнерам требуется меньше места, их можно быстрее развертывать и масштабировать.
Контейнеры лучше инкапсулируют приложения. В ядре операционной системы контейнеры работают как отдельные процессы с собственным виртуальным адресным пространством.
Преимущества контейнеров перед виртуальными машинами:
- Экономят аппаратные ресурсы. ВМ с приложением — более тяжеловесный пакет, контейнер легче — его дешевле хранить и разворачивать.
- Обеспечивают изоляцию. Контейнеры производят изоляцию на уровне ОС средствами этой самой ОС, ВМ — изоляция происходит на аппаратном уровне.
- Оркестрация. Для оркестрации контейнеров есть Kubernetes — стандартное решение для любого облака или self hosted. А для ВМ и облаков такое писать надо самому на ansible и terraform. И под каждое облако решение будет разным.
С другой стороны, виртуальные машины позволяют использовать несколько операционных систем на одном физическом сервере. Неполадки и нарушения безопасности изолированы на уровне аппаратного оборудования. Систему можно восстановить из ранее созданных образов.
Из-за своей простоты и низких требований к аппаратным ресурсам контейнеры вытесняют виртуальные машины во многих задачах. Согласно исследованию компании DataDog, более 25% их клиентов уже используют Docker-контейнеры.
Однако стоит помнить, что контейнерная архитектура имеет свои нюансы: если один контейнер еще достаточно прост в использовании, то для управления Kubernetes требуется настройка и администрирование.
Так как упростить этот процесс?
Можно обратиться к услугам Managed Kubernetes у облачных провайдеров. Практически каждый крупный облачный провайдер предоставляет такие услуги. Тем не менее, настройка Kubernetes все равно потребует определенных усилий.