Прочитав эту статью, вы узнаете, что такое контейнеры приложений, как они применяются в прикладном программировании и как с их помощью масштабируют информационные системы.
Виртуальный контейнер приложения — это изолирующая прослойка между программой и операционной системой, которая обеспечивает:
- приложению среду выполнения, отделённую от операционной системы и других приложений;
- управление параметрами рабочей среды приложения;
- упрощённый перенос приложения с одного компьютера на другой.
Этапы виртуализации
Когда-то информационные системы строились из «железных» кирпичиков: серверов, рабочих станций, маршрутизаторов и т. д. Такой подход не отличался высокой гибкостью. Кроме того, было очень сложно заранее угадать реальную нагрузку на систему, чтобы правильно запроектировать мощность её аппаратной части.
Гибкости добавила технология виртуальных машин. Если раньше операционные системы запускались непосредственно на аппаратной платформе сервера, то в дальнейшем между виртуальными машинами и «железом» был помещён гипервизор — специальное программное обеспечение, эмулирующее аппаратную часть. Это позволило переносить виртуальные машины с одного железного сервера на другой.
В результате повысилась эффективность использования оборудования. — Маневрируя виртуальными машинами и быстро изменяя их характеристики, можно полнее и эффективнее использовать имеющийся вычислительный потенциал.
На следующем этапе эволюция коснулась самих приложений. Раньше для изоляции их устанавливали на разные компьютеры. Конечно, характеристики этих машин можно оптимизировать, но на каждой из них требовалась своя операционная система, для работы которой нужны были дополнительные ресурсы: минимум, дополнительное дисковое пространство.
Возникла мысль изолировать приложения друг от друга внутри операционной системы, не разнося их по разным компьютерам.
В общем случае неважно, в каком компьютере работает операционная система: аппаратном или виртуальном.
Изоляция приложения
Суть изоляции приложения заключается в том, чтобы оно «не знало» о других программах, работающих в той же операционной системе одновременно с ним, чтобы оно «считало» себя единственным работающим.
Для каждого приложения во время его запуска создаётся, так называемая, среда выполнения. В неё входят: переменные окружения, дополнительные объекты, разделяемые библиотеки.
Кроме того, приложению выделяется оперативная память, оно взаимодействует с файловой системой, сетевым окружением и другими ресурсами компьютера.
Фактически, для изоляции приложения требуется создать управляющую прослойку между ним и операционной системой.
При этом подходе расчёт сделан на экономию ресурсов, потребляемых само́й операционной системой. В этом случае не нужно дублировать все системные файлы, как это происходит при изоляции с помощью разных виртуальных машин.
У изолированной программы должно быть собственное адресное пространство, собственное дисковое пространство, собственное пространство сетевых имён и т. д.
Не все типы приложений удаётся изолировать таким способом, но большинство — вполне можно.
Контейнер
На практике, чтобы полностью контролировать работу какого-то изолируемого приложения, его нужно запускать из другого — изолирующего — приложения.
Собственно, экземпляр изолирующей прослойки с запущенным в ней приложением и называется контейнером.
Однако изоляция приложения начинается не в момент запуска его контейнера, а раньше. Нужно не просто указать, какое приложение требуется запустить, но и описать для него среду выполнения.
Это описание часто называют образом приложения, хотя по смыслу, это — конфигурационный файл контейнера.
В этом файле указаны характеристики и параметры контейнера: программу, которую нужно в нём запустить; используемые процессоры; объём задействованной оперативной памяти, дисковое пространство; сетевые настройки и т. д.
Часто этот конфигурационный файл имеет формат XML или JSON и может быть просмотрен в самом простом текстовом редакторе.
Изначально в контейнере можно было запустить приложение, уже установленное в операционную систему. В дальнейшем появилась возможность добавлять к конфигурационному файлу контейнера «дистрибутив» для его запуска без предварительной установки.
Ресурсы приложения
Изолированной программе, также, как и любому другому, требуются процессор и оперативная память, а кроме них, могут потребоваться дисковое пространство или сетевые соединения.
Процессоры
По умолчанию, приложение, запущенное внутри контейнера, может использовать все процессоры, имеющиеся в системе.
При необходимости можно: ограничить число используемых процессоров, если их в системе несколько; указать конкретные процессоры, которые допустимо использовать определённым контейнером; задать период, в течение которого разрешено непрерывное использование процессора. Можно указать приоритет контейнера при доступе к процессорам.
Память
Изначально объём памяти, доступной контейнеру не лимитирован. Однако в большинстве случаев применения контейнеров ограничение использования ими оперативной памяти всё-таки желательно. Как правило, на одном компьютере одновременно работает не единственный контейнер, а несколько. Правильно конфигурируя контейнеры, можно оптимизировать использование оперативной памяти разными приложениями. Например, с учётом их особенностей можно запретить свопирование используемой ими оперативной памяти.
Дисковое пространство
Приложениям, работающим в контейнере, файловая система хостинговой машины напрямую недоступна. Для их дисковых операций чтения и записи (если таковые требуются) могут использовать, так называемые, тома, которые фактически являются виртуальными дисками.
Для хостинговой машины виртуальные диски — это обычные файлы её файловой системы.
Сеть
При запуске контейнера ему присваивается IP-адрес частной сети, посредством которого контейнеры, работающие в этой сети, могут пересылать данные между собой.
Для взаимодействия с приложениями, работающими в других сетях, на маршрутизаторе или сетевом экране нужно настроить соответствующее преобразование сетевых адресов (NAT, network address translation).
Управление контейнерами
Приложения в контейнерах можно запускать и останавливать вручную, но они нередко используются группами, управлять которыми вручную неудобно и нерационально.
Для автоматизированного управления контейнерами и их группами имеются специальные инструменты, которые обеспечивают: настройку параметров контейнеров, их запуск, перезапуск, остановку, перемещение на другой компьютер и пр.
Из-за неудачной кальки с английского языка такое автоматизированное управление часто называют оркестровкой (container orchestration).
В чём польза?
Контейнеры приложений принесли существенную пользу в двух, казалось бы, далёких друг от друга, областях: разработка программных продуктов и строительство высоконагруженных информационных систем.
Прикладное программирование
Если вы сами не занимались прикладным программированием, то не представляете, с какими трудностями сталкиваются разработчики сколь-нибудь тиражируемых продуктов, чтобы обеспечить их беспроблемную работу на разных компьютерах, в разных версиях операционной системы, с разным программным окружением. Ведь далеко не всегда возможно точно спрогнозировать, в какой программной среде будет запущен продукт.
Как уже было рассказано, контейнеры обеспечивают приложениям отдельную и настроенную среду выполнения, изолированную от операционной системы. То есть при переносе приложения с одного компьютера на другой контейнер обеспечит этому приложению стабильное программное окружение.
Появление контейнерных технологий дало новый импульс развитию методик организации разработки и эксплуатации программных продуктов. В английском языке эти методики кратко называются: DevOps (Development-and-Operations).
Высоконагруженные информационные системы
Контейнер, будучи отдельным и отделяемым элементом, может вступать в качестве кирпичика для строительства информационных систем.
Представим, что ваша информационная система имеет веб-интерфейс, работу которого обеспечивает… веб-сервер. Если нагрузка на систему возрастёт, можно начать использовать несколько веб-серверов, работающих параллельно. Такой способ изменения производительности называется горизонтальным масштабированием.
Где разместить эти веб-серверы? — Их можно установить на отдельные, в том числе, виртуальные машины. Но также можно поместить их в контейнеры. Во втором варианте вычислительные ресурсы будут использованы эффективнее.
Кроме того, повысится скорость корректировки производительности системы, так как контейнеры запускаются намного быстрее, чем виртуальные машины и операционные системы на них. Это обстоятельство может быть весьма важным, если нагрузка на информационную систему изменяется быстро.
При использовании контейнеров вы не привязаны к конкретным компьютерам. В зависимости от текущих потребностей, вы можете переносить контейнеры с одного на другой — без остановки всей информационной системы.
Именно, на основе контейнеров развивается концепция микросервисов.
Заключение
В той или иной степени, изоляция приложений между собой, конечно, присутствует в любой многозадачной операционной системе. Нынешние инструменты усилили эту изоляцию и упростили управление средой выполнения конкретных приложений.
Появление контейнеров позволило существенно облегчить процесс разработки и развёртывания приложений.
Использование контейнеров в информационных системах с высокой и нестабильной нагрузкой весьма расширило возможности горизонтального масштабирования этих систем.
P. S. Ещё немного интересных статей: