Размещая контейнеры Docker на выделенных серверах, организации получают переносимость и стабильность. Эксперт Кристофер Тоцци объясняет, почему выбор иногда стоит делать в пользу виртуальных машин.
Для чего вам могут понадобиться контейнеры, вы уже понимаете. Но знаете ли вы, какой тип сервера больше для них подходит? Действительно ли для хостинга платформ наподобие Docker или любой другой аналогичной среды по управлению контейнерами лучше пользоваться выделенными серверами, чем виртуальными машинами?
Ответ, естественно, зависит от множества параметров. В статье рассматриваются такие параметры, а также аргументы за и против использования контейнеров на выделенных серверах или виртуальных машинах. Я сосредоточусь на Docker, но выводы в целом распространяются на любую платформу по управлению контейнерами.
Выделенный сервер или виртуальная машина?
Сравнение плюсов и минусов выделенных серверов и виртуальных машин для хостинга программной среды — задача совсем не новая. Технические руководители об этом задумались еще когда виртуализация стала широко применяться в дата-центрах в 2000-х годах, задолго до появления Docker.
Вкратце, основные преимущества выделенного сервера следующие:
Сравнительно высокая скорость. Ресурсы системы не расходуются на эмуляцию аппаратных средств;
Ресурсы оборудования используются в полном объеме, поскольку оно не простаивает в период высокого спроса;
Упрощенное администрирование. Инфраструктура содержит меньше хостов, сетей и дисков.
С виртуальными машинами, в свою очередь, предлагают следующие преимущества:
Можно с легкостью перемещать приложения между, перемещая образы виртуальных машин с одного сервера на другой;
Изолирование приложений, работающих на разных виртуальных серверах. Это решает проблемы безопасности и помогает снизить сложность администрирования;
Возможность сохранить однородность программного окружения для всей инфраструктуры, разворачивая все приложения на одном типе виртуальных машин, даже если физические серверы отличаются.
Но с использованием виртуальных машин сопряжены и некоторые недостатки. К ним относятся следующие:
Ресурсы сервера могут использоваться не в полном объеме. Например, если вы выделите на сервере место под хранение образа виртуальной машины, то этот объем памяти уже нельзя будет использовать для других целей, даже если виртуальная машина, связанная с диском, не использует весь выделенный объем.
С помощью виртуальных машин нельзя работать с физическим оборудованием напрямую. К примеру, если вы захотите, чтобы вместо виртуальной машины вычислительные операции выполнялись GPU, то ничего не получится — по крайней мере, простыми способами — так как виртуальная машина работает вне связи с соответствующей средой сервера.
Как правило, виртуальные машины работают не так быстро, как физические серверы, поскольку их ресурсы расходуются на эмуляцию аппаратного средства для виртуального сервера.
Для преодоления этих ограничений системные администраторы могут прибегать к некоторым приемами на базе современных платформ виртуализации. Например, можно создать динамический образ диска, который будет расширяться в объеме по мере использования виртуальной машиной. То есть, объем памяти не будет заблокирован, пока он на самом деле не потребуется пользователю. Можно использовать транзитную передачу, чтобы в определенных случаях виртуальная машина имела прямой доступ к физическому оборудованию.
Тем не менее, эти уловки не всегда действенны. Применить такой подход можно не на всех видах хостов и гостевых операционных систем, и, в целом, все это вытекает в дополнительную нагрузку для администратора. Если для приложений, которыми вы собираетесь пользоваться, нужен непосредственный доступ к физическому оборудованию, то лучше сразу их запустить на таком оборудовании.
Квадратура круга: как работают контейнеры на выделенном сервере
Используя контейнеры на физическом сервере вы получаете многие из преимуществ виртуальных машин, при этом избегая недостатков виртуализации.
Контейнеры на выделенных серверах позволяют:
Получить доступ к аппаратным средствам, не прибегая к методам транзитной передачи. Приложение работает на той же операционной системе, что и сервер.
Эффективно использовать ресурсы системы. Хотя и можно ограничить ресурсы, отведенные контейнеру для вычисления, хранения и передачи данных, как правило, не требуется выделять эти ресурсы исключительно для работы одного конкретного контейнера. То есть сервер может распределять системные ресурсы по необходимости.
Получить производительность выделенного сервера для приложений из-за отсутствия уровня аппаратной эмуляции, отделяющей их от хост-сервера.
Кроме того, при использовании контейнеров с выделенным сервером, вам будут доступны и преимущества, которые, как правило, ассоциируются только с виртуальными машинами, а именно:
Возможность запускать приложения в перемещаемой среде, которую можно быстро переносить с одного хост-сервера на другой.
Изоляция приложений. Возможно, с помощью контейнеров вы не добьетесь такой же изоляции, как на виртуальной машине, но их функционал позволяет администраторам предотвращать взаимодействие приложений и ограничивать права и использование ресурсов для каждого контейнера.
В целом контейнеры на выделенном сервере позволяют впихнуть невпихуемое решить нерешаемую задачу. Вы получаете и плюсы выделенного сервера: скорость и непосредственный доступ к физическому серверу — и преимущества виртуальных машин: переносимость и возможность изоляции программ.
Почему не всегда следует размещать контейнеры на выделенном сервере. Вероятно, вам интересно, а почему бы контейнеры не запускать напрямую на выделенном сервере всегда? Если такой подход обеспечивает все преимущества, зачем нужен какой-либо иной?
Учитывайте следующие недостатки хостинга контейнера на выделенном сервере, а не на виртуальной машине:
Обновить физический сервер сложно. Если вы захотите заменить сервер на новый, то придется воссоздавать программную среду контейнера с нуля на новом сервере. Если бы программная среда контейнера входила в образ виртуальной машины, то можно было бы просто переместить его на новый сервер.
Большинство из облачных сервисов настаивают на использовании виртуальных машин. Есть и облачный хостинг с выделенными серверами, например, OnMetal от Rackspace или Bare Metal Cloud Service от Oracle. Но в общем и целом, работа с облаком подразумевает использование виртуальных машин. Если захотите воспользоваться облачной платформой для работы контейнеров, то придется использовать виртуальные машины.
Контейнеры поддерживают не все настройки оборудования и программного обеспечения. В наше время можно разместить почти любой вид операционной системы на платформе виртуализации наподобие VMware или на KVM, работающей почти на всех операционных системах и серверах. Но возможности Docker ограничены. При размещении на физическом сервере он работает только на Linux и некоторых серверах Windows. Это означает, что если ваш выделенный сервер использует, скажем, Windows Server 2012, а Docker его сейчас не поддерживает, и вы хотите разместить на нем Docker, то придется установить виртуальную машину в дополнение к Windows-серверу, чтобы соблюсти требования работы Docker.
Нельзя запустить Linux-контейнеры на Windows-сервере и наоборот. Этот недостаток означает, что контейнеры Linux работают только на Linux-серверах. Допустим, у вас выделенный сервер с Windows, и вы хотите запустить на нем контейнер Docker, чтобы разместить приложение, разработанное для Linux. Придется установить виртуальную машину Linux на Windows-сервере и использовать ее в качестве среды для размещения Docker.
На выделенном сервере нельзя вернуться к предыдущему состоянию. На большинстве современных платформ виртуализации реализована очень полезная функция: можно сделать снапшот виртуальной машины и вернуться к тому состоянию позже, если необходимо. На выделенном сервере так сделать не получится (технически, может быть, и получится использовать функции резервного копирования самой операционной системы или файловой системы, но этот процесс уже не такой гладкий, как на виртуальной машине). И в целом снапшоты, и возврат к предыдущему состоянию для контейнеров понятия бессмысленные. Контейнеры сами по себе нечто эфемерное, у них нет предыдущего состояния. В конце концов, самый простой возврат к предыдущему состоянию можно реализовать только на виртуальной машине.
Заключение
Не просто решить, размещать контейнеры на выделенном сервере или на виртуальной машине. Придется сопоставить все доводы «за» и «против», чтобы определить, какой вариант больше подходит для вашей организации.
Отрадно, что вне зависимости от того, где размещать контейнеры, вы все равно получите пользу от основных свойств контейнеризации, в том числе переносимость приложений, масштабируемость и динамичность.