Поиск по сайту:

Экосистема 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, наряду со всеми поддерживающими проектами, обеспечивает стратегию управления, проектирования и развертывания программного обеспечения, обеспечивающую масштабную масштабируемость. Понимая и используя возможности различных проектов, вы можете выполнять сложные развертывания приложений, достаточно гибкие для учета меняющихся операционных требований.