Экосистема Docker: введение в общие компоненты
Введение
Контейнеризация — это процесс распространения и развертывания приложений переносимым и предсказуемым способом. Это достигается за счет упаковки компонентов и их зависимостей в стандартизированные, изолированные и облегченные среды процессов, называемые контейнерами. Многие организации в настоящее время заинтересованы в разработке приложений и служб, которые можно легко развернуть в распределенных системах, что позволит системе легко масштабироваться и выдерживать сбои компьютеров и приложений. Docker, платформа контейнеризации, разработанная для упрощения и стандартизации развертывания в различных средах, в значительной степени способствовала принятию этого стиля проектирования и управления услугами. Для построения этой экосистемы распределенного управления контейнерами было создано большое количество программного обеспечения.
Докер и контейнеризация
Docker — наиболее распространенное программное обеспечение для контейнеризации, используемое сегодня. Хотя существуют и другие системы контейнеризации, Docker упрощает создание контейнеров и управление ими и интегрируется со многими проектами с открытым исходным кодом.
На этом изображении вы можете увидеть (в упрощенном виде), как контейнеры связаны с хост-системой. Контейнеры изолируют отдельные приложения и используют ресурсы операционной системы, которые были абстрагированы Docker. В разобранном виде справа мы видим, что контейнеры могут быть построены путем «расслоения», когда несколько контейнеров совместно используют базовые слои, уменьшая использование ресурсов.
Основные преимущества Докера:
- Легкое использование ресурсов: вместо виртуализации всей операционной системы контейнеры изолируются на уровне процессов и используют ядро хоста.
- Переносимость: все зависимости для контейнерного приложения объединяются внутри контейнера, что позволяет ему работать на любом хосте Docker.
- Предсказуемость. Хост не заботится о том, что выполняется внутри контейнера, а контейнеру все равно, на каком хосте он работает. Интерфейсы стандартизированы, а взаимодействия предсказуемы.
Как правило, при разработке приложения или службы для использования Docker лучше всего разбивать функциональность на отдельные контейнеры. Такое проектное решение известно как сервис-ориентированная архитектура. Это дает вам возможность легко масштабировать или обновлять компоненты независимо друг от друга в будущем. Такая гибкость — одна из многих причин, по которым люди интересуются Docker для разработки и развертывания.
Чтобы узнать больше о контейнеризации приложений с помощью Docker, нажмите здесь.
Обнаружение служб и глобальные хранилища конфигураций
Обнаружение служб — это один из компонентов общей стратегии, направленной на то, чтобы сделать развертывание контейнеров масштабируемым и гибким. Обнаружение служб используется для того, чтобы контейнеры могли узнать о среде, в которую они были введены, без вмешательства администратора. Они могут найти информацию о подключении для компонентов, с которыми они должны взаимодействовать, и они могут зарегистрироваться, чтобы другие инструменты знали, что они доступны. Эти инструменты также обычно функционируют как глобально распределенные хранилища конфигурации, в которых можно задать произвольные параметры конфигурации для служб, работающих в вашей инфраструктуре.
На изображении выше вы можете увидеть пример потока, в котором одно приложение регистрирует информацию о своем соединении с системой службы обнаружения. После регистрации другие приложения могут запрашивать службу обнаружения, чтобы узнать, как подключиться к приложению.
Эти инструменты часто реализуются как простые хранилища ключей и значений, которые распределяются между хостами в кластерной среде. Как правило, хранилища ключей и значений предоставляют HTTP API для доступа и настройки значений. Некоторые из них включают дополнительные меры безопасности, такие как зашифрованные записи или механизмы контроля доступа. Распределенные хранилища необходимы для управления кластерными хостами Docker в дополнение к их основной функции предоставления сведений о самонастройке для новых контейнеров.
Вот некоторые из обязанностей хранилищ обнаружения служб:
- Предоставление приложениям возможности получать данные, необходимые для подключения к службам, от которых они зависят.
- Разрешение службам регистрировать информацию о подключении для указанной выше цели.
- Предоставление доступного по всему миру места для хранения произвольных данных конфигурации.
- Сохранение информации об элементах кластера, необходимой любому программному обеспечению для управления кластером.
Некоторые популярные инструменты обнаружения сервисов и связанные с ними проекты:
- etcd: обнаружение сервисов/глобальное хранилище ключей и значений
- consul: обнаружение сервисов/глобальное хранилище ключей и значений
- zookeeper: обнаружение сервисов/глобальное хранилище ключей и значений
- crypt: проект для шифрования записей etcd
- confd: отслеживает изменения в хранилище пар ключ-значение и запускает перенастройку служб с новыми значениями.
Чтобы узнать больше об обнаружении сервисов с помощью Docker, посетите наше руководство здесь.
Сетевые инструменты
Контейнерные приложения поддаются сервисно-ориентированному дизайну, который поощряет разбиение функциональности на отдельные компоненты. Хотя это упрощает управление и масштабирование, требуется еще больше уверенности в отношении функциональности и надежности сетевого взаимодействия между компонентами. Сам Docker предоставляет базовые сетевые структуры, необходимые для связи между контейнерами и между контейнерами и хостами.
Собственные сетевые возможности Docker предоставляют два механизма для объединения контейнеров. Во-первых, открыть порты контейнера и, при необходимости, сопоставить хост-систему для внешней маршрутизации. Вы можете выбрать порт хоста для сопоставления или позволить Docker случайным образом выбрать высокий неиспользуемый порт. Это общий способ предоставления доступа к контейнеру, который подходит для большинства целей.
Другой метод заключается в том, чтобы позволить контейнерам обмениваться данными с помощью «ссылок» Docker. Связанный контейнер получит информацию о подключении к своему аналогу, что позволит ему автоматически подключаться, если он настроен на учет этих переменных. Это позволяет контактировать между контейнерами на один и тот же хост без необходимости заранее знать порт или адрес, где будет находиться служба.
Этот базовый уровень сети подходит для сред с одним хостом или тесно управляемых сред. Однако в экосистеме Docker реализовано множество проектов, направленных на расширение сетевых функций, доступных операторам и разработчикам. Некоторые дополнительные сетевые возможности, доступные через дополнительные инструменты, включают:
- Наложение сетей для упрощения и унификации адресного пространства на нескольких хостах.
- Виртуальные частные сети адаптированы для обеспечения безопасной связи между различными компонентами.
- Назначение подсетей для хоста или приложения
- Установка интерфейсов macvlan для связи
- Настройка пользовательских MAC-адресов, шлюзов и т. д. для ваших контейнеров.
Некоторые проекты, связанные с улучшением сети Docker:
- flannel: оверлейная сеть, предоставляющая каждому хосту отдельную подсеть.
- weave: наложенная сеть, отображающая все контейнеры в одной сети.
- pipework: расширенный набор сетевых инструментов для произвольно расширенных сетевых конфигураций.
Для более подробного ознакомления с различными подходами к работе в сети с помощью Docker нажмите здесь.
Планирование, управление кластером и оркестрация
Еще один компонент, необходимый при построении среды кластерного контейнера, — это планировщик. Планировщики отвечают за запуск контейнеров на доступных хостах.
Изображение выше демонстрирует упрощенное решение о планировании. Запрос предоставляется через API или инструмент управления. Отсюда планировщик оценивает условия запроса и состояние доступных хостов. В этом примере он извлекает информацию о плотности контейнера из распределенного хранилища данных/службы обнаружения (как обсуждалось выше), чтобы разместить новое приложение на наименее загруженном узле.
Этот процесс выбора хоста является одной из основных обязанностей планировщика. Обычно в нем есть функции, которые автоматизируют этот процесс, а администратор может указать определенные ограничения. Некоторые из этих ограничений могут быть:
- Запланируйте контейнер на том же хосте, что и другой заданный контейнер.
- Убедитесь, что контейнер не размещен на том же хосте, что и другой заданный контейнер.
- Поместите контейнер на хост с соответствующей меткой или метаданными.
- Разместите контейнер на наименее загруженном узле.
- Запустите контейнер на каждом хосте в кластере.
Планировщик отвечает за загрузку контейнеров на соответствующие хосты, а также за запуск, остановку и управление жизненным циклом процесса.
Поскольку планировщик должен взаимодействовать с каждым хостом в группе, обычно также включаются функции управления кластером. Они позволяют планировщику получать информацию об участниках и выполнять административные задачи. Оркестрация в этом контексте обычно относится к комбинации планирования контейнеров и управления узлами.
Некоторые популярные проекты, которые функционируют как планировщики и инструменты управления автопарком:
- fleet: планировщик и инструмент управления кластером.
- marathon: планировщик и инструмент управления услугами.
- Swarm: планировщик и инструмент управления службами.
- mesos: служба абстрагирования хоста, которая объединяет ресурсы хоста для планировщика.
- kubernetes: расширенный планировщик, способный управлять группами контейнеров.
- compose: инструмент управления контейнерами для создания групп контейнеров.
Чтобы узнать больше о программном обеспечении для базового планирования, группировки контейнеров и управления кластерами для Docker, нажмите здесь.
Заключение
К настоящему времени вы должны быть знакомы с общими функциями большей части программного обеспечения, связанного с экосистемой Docker. Сам Docker, наряду со всеми поддерживающими проектами, обеспечивает стратегию управления, проектирования и развертывания программного обеспечения, обеспечивающую масштабную масштабируемость. Понимая и используя возможности различных проектов, вы можете выполнять сложные развертывания приложений, достаточно гибкие для учета меняющихся операционных требований.