Tutorial

Экосистема Docker: знакомство с общими компонентами

Published on June 29, 2015
Русский
Экосистема Docker: знакомство с общими компонентами

Серия туториалов

Этот туториал является 1-ой частью из 5-ти в серии статей Экосистема Docker.

Введение

Контейнеризация - это процесс распространения и развёртывания приложений портируемым и предсказуемым образом. Это достигается путём упаковывания компонентов и их зависимостей в стандартные, изолированные и лёгкие окружения (process environments), называемые контейнерами. В настоящее время многие организации заинтересованы в создании приложений и сервисов, которые могут быть легко развёрнуты на распределенных системах, позволяя системе легко масштабироваться и оставаться работоспособной при отказе отдельных машин или приложения. Docker - платформа для контейнеризации, разработанная для упрощения и стандартизации развертывания в разных окружениях, в значительной степени помог распространению данной практики проектирования и управления сервисами. Разработано большое количество программного обеспечения, работающего на основе данной экосистемы распределённого управления контейнерами.

Docker и контейнеризация

На сегодняшний день Docker является самым распространённым программным обеспечением для контейнеризации. Хотя существуют и другие системы контейнеризации, Docker делает создание и управление контейнерами простым и легко интегрируется с многими open-source проектами.

Контейнеризация с Docker

На картинке выше Вы можете увидеть (в упрощенном виде), как контейнеры соотносятся с хост-системой. Контейнеры изолируют отдельные приложения и используют ресурсы операционной системы с помощью Docker. В развёрнутом виде на картинке справа можно видеть, что контейнеры построены при помощи “слоев”, при этом несколько контейнеров могут иметь общие нижние слои, уменьшая использование ресурсов.

Основные преимущества Docker:

  • Использование меньшего количества ресурсов: Вместо виртуализации всей операционной системы контейнеры изолируют все на уровне процесса и используют ядро хоста.
  • Портируемость: Все зависимости контейнеризованного приложения находятся внутри контейнера, что позволяет запускать его на любом Docker-хосте.
  • Предсказуемость: Хосту все равно, что запущено внутри контейнера, а контейнеру все равно, на каком хосте он работает. Интерфейсы стандартизованы и взаимодействия предсказуемы.

Обычно на этапе проектирования приложения или сервиса, в котором будет использоваться Docker, лучше всего разнести функциональность по разным контейнерам, такой подход называется сервисно-ориентированной архитектурой. Он дает возможность в последствии легко масштабировать или обновлять компоненты независимо друг от друга. Наличие такой гибкости - одна из множества причин, по которым люди заинтересованы в Docker для разработки и развертывания приложений.

Узнать больше о контейнеризации приложений при помощи Docker можно из следующей статьи данного цикла.

Service Discovery и Global Configuration Stores

Обнаружение служб (Service discovery) является одним из компонентов общей стратегии, направленной на то, чтобы развёртывание контейнеров было гибким и масштабируемым. Обнаружение служб используется для того, чтобы контейнеры могли узнавать об окружении, в котором они находятся, без участия администратора. Контейнеры могут находить информацию о подключении к компонентами, с которыми они должны взаимодействовать, а также регистрировать себя таким образом, чтобы остальные инструменты знали о их доступности. Эти инструменты также обычно функционируют как глобально распределенные хранилища конфигураций (globally distributed configuration stores), позволяющие устанавливаться специальные настройки конфигурации для Вашей инфраструктуры.

Обнаружение служб Docker

На картинке выше Вы можете видеть пример того, как приложение регистрирует себя в системе обнаружения служб. После этого другие приложения при помощи системы обнаружения служб могут находить информацию о том, как подключиться к зарегистрированному ранее приложению.

Эти инструменты обычно реализованы как простые хранилища типа “ключ-значение” (key-value), распределенные по хостам в кластеризованном окружении. Обычно такие хранилища предоставляют HTTP API для доступа и изменения значений. Некоторые имеют дополнительные меры безопасности, например, шифрование и механизмы контроля доступа. Распределённые хранилища необходимы для управления кластеризованными Docker-хостами в дополнении к их основной функции - предоставлению информации для конфигурирования новых контейнеров.

Некоторые задачи хранилищ обнаружения служб:

  • Передача (по запросу) приложениям данных, необходимых для подключения к службам, от которых они зависят.
  • Регистрация (по запросу) информации о подключении к сервису (для целей, указанных в предыдущем пункте).
  • Предоставление глобально доступного хранилища для разных конфигурационных данных.
  • Хранение информации о членах кластера, необходимой программному обеспечению по управлению кластером.

Некоторые популярные инструменты обнаружения служб и соответствующие проекты:

  • etcd: обнаружение служб / глобально распределённое хранилище “key-value”;
  • consul: обнаружение служб / глобально распределенное хранилище “key-value”;
  • zookeeper: обнаружение служб / глобально распределенное хранилище “key-value”;
  • crypt: проект для шифрования записей etcd;
  • confd: наблюдает за “key-value” хранилищами и запускает переконфигурацию сервисов с новыми значениями.

Узнать больше об обнаружении служб в Docker можно из соответствующей статьи данного цикла.

Инструменты работы с сетью (networking tools)

Контейнеризованные приложения поддаются сервис-ориентированному дизайну, который поощряет разделение функционала на отдельные компоненты. Хотя это делает управление и масштабирование проще, в то же время требует большей уверенности в надёжной работе сети между компонентами. Docker предоставляет основные сетевые структуры, необходимые для соединений “контейнер-контейнер” и “контейнер-хост”.

Встроенные сетевые возможности Docker предоставляют два механизма связывания контейнеров. Первый - открыть порты контейнера и настроить их для работы с хостом для внешней маршрутизации. Вы можете задать порт на хосте или позволить Docker случайно выбрать неиспользуемый порт с большим номером. Это универсальный способ предоставления доступа к контейнеру, который работает для большинства случаев.

Второй метод - позволить контейнерам общаться при помощи Docker “ссылок”. Связанный с их помощью контейнер будет получать информацию о подключении к контейнеру на другой стороне связи, что позволит ему автоматически подключаться, если он настроен для отслеживания изменений. Это позволяет устанавливать взаимодействие между контейнерами на одном хосте без необходимости заранее знать порт или адрес расположения сервиса.

Такой базовый уровень сетевого взаимодействия подходит для окружений, например, с одним хостом. Однако экосистема Docker породила множество проектов, которые фокусируются на расширении сетевой функциональности, доступной для операторов и разработчиков. Такие инструменты дают некоторые дополнительные возможности:

  • Перекрытие сетей для упрощения и унификации адресного пространства на нескольких хостах.
  • Bиртуальные частные сети (VPN), адаптированные для предоставления безопасных связей между различными компонентами.
  • Назначение подсетей для каждого хоста или приложения.
  • Установка macvlan интерфейсов для взаимодействия.
  • Настройка кастомных MAC-адресов, шлюзов и т.д. для Ваших контейнеров.

Некоторые проекты, улучшающие работу с сетью для Docker:

  • flannel: Перекрытие сетей, обеспечивающее каждый хост отдельной подсетью.
  • weave: Перекрытие сетей, объединяющее все контейнеры в одну сеть.
  • pipework: Расширенный набор инструментов для работы с сетью, позволяющий настройку произвольных сетевых конфигураций.

Узнать больше о разных подходах к работе с сетью в Docker можно из соответствующей статьи данного цикла.

Планирование, управление кластером и оркестровка

Ещё одним компонентом, необходимым для построения кластеризованной контейнерной среды, является планировщик (Scheduler). Планировщики ответственны за запуск контейнеров на доступных хостах.

Планирование работы приложений

Изображение выше демонстрирует упрощенной процесс принятия решения по планированию работы приложения. Запрос посылается через API или специальное приложение по управлению приложениями. Далее Планировщик оценивает условия запроса и состояние доступных хостов. В данном примере, он получает информацию о плотности размещения контейнеров из распределенного хранилища данных / инструмента обнаружения служб (как рассматривалось выше), чтобы разместить новое приложение на наименее загруженном хосте.

Этот процесс выбора хоста является одной из ключевых задач Планировщика. Обычно в него встроены функции автоматизации данного процесса, при этом администратор имеет возможность задать некоторые ограничения. Примеры таких ограничений:

  • Поместить контейнер на тот же хост, что и другой указанный контейнер.
  • Убедиться, что контейнер не будет помещен на тот же хост, что и другой указанный контейнер.
  • Поместить контейнер на хост с соответствующим названием или мета-информацией.
  • Поместить контейнер на наименее загруженный хост.
  • Запустить контейнер на всех хостах кластера.

Планировщик отвечает за загрузку контейнеров на соответствующие хосты, а также их запуск, остановку и управление жизненным циклом процесса.

Поскольку Планировщик должен взаимодействовать с каждым хостом в группе, он также обычно несет на себе функции управления кластером. Это позволяет Планировщику получать информацию о членах кластера и выполнять административные задачи. Оркестровкой (Orchestration), в данном контексте, обычно называется комбинация функций планирования контейнеров и управления хостами.

Некоторые популярные проекты, которые функционируют как планировщики и инструменты управления хостами:

  • fleet: планировщик и инструмент управления кластером.
  • marathon: планировщик и инструмент управления службами.
  • Swarm: планировщик и инструмент управления службами.
  • mesos: сервис абстракции хостов, объединяющий ресурсы хоста для планировщика.
  • kubernetes: расширенный планировщик, способный управлять группами контейнеров.
  • compose: инструмент контейнерной оркестровки для создания групп контейнеров.

Узнать больше о планировании, группировке контейнеров и программном обеспечении для управления кластерами для Docker можно из соответствующей статьи данного цикла.

Заключение

Теперь Вы знакомы с основными функциями большинства программного обеспечения, связанного с экосистемой Docker. Сам Docker, как и все его сопутствующие проекты, продвигает стратегию управления программным обеспечением, дизайна и развертывания приложений, которая дает высокую степень масштабируемости. Понимая и используя возможности разных проектов, Вы можете выполнить развертывание сложных приложений, достаточно гибких для учета разнообразных требований к эксплуатации.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


Tutorial Series: Экосистема Docker

Экосистема Docker

About the authors

Default avatar
maxmikheev

translator


Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel