Когда речь заходит о первых попытках виртуализации сервера, на ум приходят несколько компаний. Возможно, это не столь широко известно, но развитие виртуализации на самом деле началась еще в начале 1960-х годов и было внедрена такими компаниями, как General Electric (GE), Bell Labs и International Business Machines (IBM).
В начале 1960-х у IBM был широкий спектр систем, каждое поколение которых существенно отличалось от предыдущего. Это мешало клиентам успевать за изменениями и требованиями каждой новой системы. Кроме того, компьютеры могли обрабатывать только один процесс за за раз. Если вам нужно было выполнить две задачи, вам нужно было запускать процессы в пакетном режиме. Это требование пакетной обработки не представляло особой важности для IBM, поскольку большинство их пользователей были членами научного сообщества, и до этого времени пакетная обработка, казалось, удовлетворяла потребности клиентов.
Из-за широкого диапазона требований к оборудованию IBM начала работу над системой мэйнфрейма S/360, разработанной как широкая замена для многих других своих систем. Когда система была впервые разработана, она должна была стать однопользовательской для выполнения пакетных заданий.
Однако история виртуализации набрала ход в 63-ем году прошлого века, когда Массачусетский институт объявил о проекте, именуемом MAC. Проект MAC расшифровывался как «Математика и вычисления», но позже был переименован в «Компьютер с множественным доступом».
В рамках этого исследовательского гранта MIT нуждался в новом компьютерном оборудовании, способном работать более чем с одним пользователем одновременно, и запросил предложения от различных поставщиков компьютеров, включая GE и IBM. В то время IBM не желала брать на себя обязательства по созданию многопользовательского компьютера, тогда как MIT не хотел использовать специально модифицированную систему. GE, с другой стороны, была готова взять на себя обязательство создать такой компьютер. По этой причине MIT выбрал GE в качестве поставщика.
В ответ на потребности Массачусетского технологического института и Bell Labs IBM разработала мэйнфрейм CP-40. Первая виртуальная машина CP-40 использовалась только в лабораториях. CP-40 позже превратился в систему CP-67, ставшую первым коммерческим основным фреймом, поддерживающим виртуализацию. Операционная система, работающая на CP-67, называлась CP/CMS. Идея заключалась в том, что CP запускался на мэйнфрейме и создавал виртуальные машины, на которых работала CMS, с которым затем будет взаимодействовать пользователь.
Традиционный подход к компьютеру заключался в разделении памяти и других системных ресурсов между пользователями. Примером операционной системы с разделением времени из той эпохи является MultiCS.
Подход CP позволял каждому пользователю иметь свою собственную полную операционную систему, которая фактически давала каждому пользователю собственный компьютер.
Появление виртуальных машин позволило более эффективно использовать систему, поскольку виртуальные машины могли совместно использовать общие ресурсы мэйнфрейма вместо того, чтобы ресурсы распределялись поровну между всеми пользователями. Безопасность была выше, поскольку каждый пользователь работал в совершенно отдельной операционной системе. Таким образом, ни один пользователь не мог вывести из строя всю систему.
Unix - это пример виртуализации на уровне пользователя или рабочей области. Несколько пользователей используют один и тот же пул ресурсов ЦП, памяти, жесткого диска и так далее. Однако каждый имеет свой собственный профиль, отдельный от других пользователей в системе. В зависимости от того, как настроена система, пользователь может установить свой собственный набор приложений, а безопасность обеспечивается индивидуально для каждого пользователя. Unix был не только первым шагом к многопользовательским операционным системам, но и первым шагом к виртуализации приложений.
Unix не является примером виртуализации приложений, но он позволил пользователям значительно повысить портативность их приложений. До Unix почти все операционные системы были написаны на ассемблере. В качестве альтернативы, Unix был создан с использованием языка программирования C. Поскольку Unix был написан на C, только небольшие части операционной системы должны были быть настроены для данной аппаратной платформы, остальная часть операционной системы могла быть легко перекомпилирована для каждой аппаратной платформы с небольшими изменениями или вовсе без них.
Благодаря использованию компиляторов Unix и C опытный пользователь мог запускать практически любую программу на любой платформе, но для этого по-прежнему требовалось, чтобы пользователи компилировали все программное обеспечение на платформе, на которой они хотели бы работать. Для истинной портативности ПО вам нужна была своего рода виртуализация программного обеспечения.
В 1990 году Sun Microsystems начала проект, известный как «Стелс». Stealth - это проект, которым руководили инженеры, которые были разочарованы использованием Sun C/C++ API и чувствовали, что существует лучший способ писать и запускать приложения. В течение следующих нескольких лет проект несколько раз переименовывался и, наконец, в 1995 году проект был переименован в Java.
В 1994 году Java была нацелена на всемирную паутину, поскольку Sun рассматривала это как главную возможность роста. Интернет - это большая сеть компьютеров, работающих под управлением разных операционных систем, и в то время не было возможности для универсального запуска многофункциональных приложений, Java была ответом на эту проблему. История виртуализации получила продолжение, когда в январе 1996 года был выпущен Java Development Kit (JDK), позволяющий разработчикам писать приложения для платформы Java.
Java работает путем компиляции приложения в нечто, известное как байт-код Java. Байт-код Java - это промежуточный язык, который может быть прочитан только JRE. В то время, когда вы пишете свою программу, ваш Java-код не компилируется. Вместо этого он преобразуется в байт-код Java, пока программа не будет выполнена. Это похоже на то, как Unix произвела революцию в операционных системах, использовав язык программирования C. Поскольку JRE компилирует программное обеспечение непосредственно перед запуском, разработчику не нужно беспокоиться о том, на какой операционной системе или аппаратной платформе конечный пользователь будет запускать приложение, а пользователю не нужно знать, как скомпилировать программу, которая обрабатывается JRE.
JRE состоит из множества компонентов, наиболее важным из которых является виртуальная машина Java. Каждый раз, когда запускается приложение Java, она запускается внутри виртуальной машины Java. Можно посчитать, что виртуальная машина Java - это очень маленькая операционная система, созданная с единственной целью - запускать приложения Java. Поскольку Sun/Oracle пытается перенести виртуальную машину Java для работы в различных системах с вашего сотового телефона на серверы в вашем центре обработки данных, вам это не нужно. Вы можете написать приложение один раз и запускать где угодно.
В 2011 году CloudFoundry запустила Warden, используя LXC, а затем заменив его собственной реализацией. Warden может изолировать среды в любой операционной системе, работая как демон и предоставляя API для управления контейнерами. Он разработал модель клиент-сервер для управления набором контейнеров на нескольких хостах. Warden включает службу для управления контрольными группами, пространствами имен и жизненным циклом процесса.
В 2013 году LMCTFY (или Let Me Contain That For You) появился как версия стека контейнеров Google с открытым исходным кодом, предоставляющая контейнеры для приложений Linux. Приложения могут быть «осведомлены о контейнерах», создавая и управляя своими собственными вложенными контейнерами. Активное развертывание LMCTFY прекратилось в 2015 году после того, как Google начал вносить основные концепции LMCTFY в libcontainer, который теперь является частью Open Container Foundation.
В том же году появился Docker, и популярность контейнеров резко возросла. До сегодняшнего дня это не случайно, что рост использования Docker и контейнеров идет рука об руку. И сегодня это лидер в области виртуализации и контейнеризации.
Как и Warden, Docker также использовал LXC на начальных этапах, а позже заменил этот диспетчер контейнеров собственной библиотекой libcontainer. Но нет никаких сомнений в том, что Docker отделился от пакета, предложив целую экосистему для управления контейнерами.
Виртуальная машина работает через гипервизор (называемый также монитором виртуальных машин), который распределяет ее ресурсы. Однако управление контейнерами осуществляется с помощью так называемого «Container Engine». Одним из самых известных движков является «Docker».
Кроме того, виртуальная машина работает поверх собственной полной операционной системы. В то время как для контейнера требуется базовая операционная система, которая предоставляет базовые службы для всех контейнерных приложений.
Таким образом, контейнеры - это не только изоляция и сокращение использования ресурсов, они также предлагают множество преимуществ. Согласно недавнему исследованию, ожидается, что внедрение контейнеризации будет расти на 40% ежегодно, потому что контейнеры легки, безопасны и портативны. Вы можете копировать контейнеры с помощью снимков, называемых «образами», которые можно изменять, сохранять в «реестрах» и повторно использовать. Вы можете проверить концентратор докеров, где можно найти все общедоступные образы докеров всех приложений, которые вы только можете себе представить, таких как MySQL, Nginx и даже сам докер. Там можно найти официальные выпуски, а также индивидуальные образы, созданные сообществом докеров.
По мере роста индустрии контейнеризации многие функции добавлялись изо дня в день. Вы можете управлять межконтейнерной сетью, чтобы обеспечить их связь и изолировать их от других сетей. Вы также можете управлять томами и монтировать их, если вам нужно сохранить данные вне контейнеров. И это действительно важно для базы данных, чтобы предотвратить потерю данных при завершении работы контейнера. Вы даже можете создать кластер контейнеров, которые полностью связаны и зависят друг от друга. В настоящее время можно найти проекты, в которых работают тысячи контейнеров со сложной архитектурой. Чтобы справиться с этой сложностью, было изобретено нечто, называемое «оркестраторами», которые сделали виртуализацию и контейнеризацию еще лучше. Они принимают образы контейнеров и файлы конфигурации в качестве входных данных и делают всю работу за вас. Самым известным оркестратором на данный момент является Kubernetes (также называемый k8s), который разработан Google и используется им с длинным списком известных компаний, таких как Gitlab.
Компьютерная виртуализация имеет долгую историю, насчитывающую почти полвека. Его можно использовать для упрощения удаленного доступа к вашим приложениям, позволяя приложениям работать на большем количестве систем, чем предполагалось изначально, повышая стабильность и более эффективное использование ресурсов.
Некоторые технологии, такие как виртуальные рабочие столы, восходят к 60-м годам, а другие можно проследить лишь несколько лет назад, например, виртуализированные приложения. Развитие виртуализации однако продолжается и по сей день.