Этот туториал является 1-ой частью из 5-ти в серии статей Экосистема Docker.
Контейнеризация - это процесс распространения и развёртывания приложений портируемым и предсказуемым образом. Это достигается путём упаковывания компонентов и их зависимостей в стандартные, изолированные и лёгкие окружения (process environments), называемые контейнерами. В настоящее время многие организации заинтересованы в создании приложений и сервисов, которые могут быть легко развёрнуты на распределенных системах, позволяя системе легко масштабироваться и оставаться работоспособной при отказе отдельных машин или приложения. Docker - платформа для контейнеризации, разработанная для упрощения и стандартизации развертывания в разных окружениях, в значительной степени помог распространению данной практики проектирования и управления сервисами. Разработано большое количество программного обеспечения, работающего на основе данной экосистемы распределённого управления контейнерами.
На сегодняшний день Docker является самым распространённым программным обеспечением для контейнеризации. Хотя существуют и другие системы контейнеризации, Docker делает создание и управление контейнерами простым и легко интегрируется с многими open-source проектами.
На картинке выше Вы можете увидеть (в упрощенном виде), как контейнеры соотносятся с хост-системой. Контейнеры изолируют отдельные приложения и используют ресурсы операционной системы с помощью Docker. В развёрнутом виде на картинке справа можно видеть, что контейнеры построены при помощи “слоев”, при этом несколько контейнеров могут иметь общие нижние слои, уменьшая использование ресурсов.
Основные преимущества Docker:
Обычно на этапе проектирования приложения или сервиса, в котором будет использоваться Docker, лучше всего разнести функциональность по разным контейнерам, такой подход называется сервисно-ориентированной архитектурой. Он дает возможность в последствии легко масштабировать или обновлять компоненты независимо друг от друга. Наличие такой гибкости - одна из множества причин, по которым люди заинтересованы в Docker для разработки и развертывания приложений.
Узнать больше о контейнеризации приложений при помощи Docker можно из следующей статьи данного цикла.
Обнаружение служб (Service discovery) является одним из компонентов общей стратегии, направленной на то, чтобы развёртывание контейнеров было гибким и масштабируемым. Обнаружение служб используется для того, чтобы контейнеры могли узнавать об окружении, в котором они находятся, без участия администратора. Контейнеры могут находить информацию о подключении к компонентами, с которыми они должны взаимодействовать, а также регистрировать себя таким образом, чтобы остальные инструменты знали о их доступности. Эти инструменты также обычно функционируют как глобально распределенные хранилища конфигураций (globally distributed configuration stores), позволяющие устанавливаться специальные настройки конфигурации для Вашей инфраструктуры.
На картинке выше Вы можете видеть пример того, как приложение регистрирует себя в системе обнаружения служб. После этого другие приложения при помощи системы обнаружения служб могут находить информацию о том, как подключиться к зарегистрированному ранее приложению.
Эти инструменты обычно реализованы как простые хранилища типа “ключ-значение” (key-value), распределенные по хостам в кластеризованном окружении. Обычно такие хранилища предоставляют HTTP API для доступа и изменения значений. Некоторые имеют дополнительные меры безопасности, например, шифрование и механизмы контроля доступа. Распределённые хранилища необходимы для управления кластеризованными Docker-хостами в дополнении к их основной функции - предоставлению информации для конфигурирования новых контейнеров.
Некоторые задачи хранилищ обнаружения служб:
Некоторые популярные инструменты обнаружения служб и соответствующие проекты:
Узнать больше об обнаружении служб в Docker можно из соответствующей статьи данного цикла.
Контейнеризованные приложения поддаются сервис-ориентированному дизайну, который поощряет разделение функционала на отдельные компоненты. Хотя это делает управление и масштабирование проще, в то же время требует большей уверенности в надёжной работе сети между компонентами. Docker предоставляет основные сетевые структуры, необходимые для соединений “контейнер-контейнер” и “контейнер-хост”.
Встроенные сетевые возможности Docker предоставляют два механизма связывания контейнеров. Первый - открыть порты контейнера и настроить их для работы с хостом для внешней маршрутизации. Вы можете задать порт на хосте или позволить Docker случайно выбрать неиспользуемый порт с большим номером. Это универсальный способ предоставления доступа к контейнеру, который работает для большинства случаев.
Второй метод - позволить контейнерам общаться при помощи Docker “ссылок”. Связанный с их помощью контейнер будет получать информацию о подключении к контейнеру на другой стороне связи, что позволит ему автоматически подключаться, если он настроен для отслеживания изменений. Это позволяет устанавливать взаимодействие между контейнерами на одном хосте без необходимости заранее знать порт или адрес расположения сервиса.
Такой базовый уровень сетевого взаимодействия подходит для окружений, например, с одним хостом. Однако экосистема Docker породила множество проектов, которые фокусируются на расширении сетевой функциональности, доступной для операторов и разработчиков. Такие инструменты дают некоторые дополнительные возможности:
Некоторые проекты, улучшающие работу с сетью для Docker:
Узнать больше о разных подходах к работе с сетью в Docker можно из соответствующей статьи данного цикла.
Ещё одним компонентом, необходимым для построения кластеризованной контейнерной среды, является планировщик (Scheduler). Планировщики ответственны за запуск контейнеров на доступных хостах.
Изображение выше демонстрирует упрощенной процесс принятия решения по планированию работы приложения. Запрос посылается через API или специальное приложение по управлению приложениями. Далее Планировщик оценивает условия запроса и состояние доступных хостов. В данном примере, он получает информацию о плотности размещения контейнеров из распределенного хранилища данных / инструмента обнаружения служб (как рассматривалось выше), чтобы разместить новое приложение на наименее загруженном хосте.
Этот процесс выбора хоста является одной из ключевых задач Планировщика. Обычно в него встроены функции автоматизации данного процесса, при этом администратор имеет возможность задать некоторые ограничения. Примеры таких ограничений:
Планировщик отвечает за загрузку контейнеров на соответствующие хосты, а также их запуск, остановку и управление жизненным циклом процесса.
Поскольку Планировщик должен взаимодействовать с каждым хостом в группе, он также обычно несет на себе функции управления кластером. Это позволяет Планировщику получать информацию о членах кластера и выполнять административные задачи. Оркестровкой (Orchestration), в данном контексте, обычно называется комбинация функций планирования контейнеров и управления хостами.
Некоторые популярные проекты, которые функционируют как планировщики и инструменты управления хостами:
Узнать больше о планировании, группировке контейнеров и программном обеспечении для управления кластерами для Docker можно из соответствующей статьи данного цикла.
Теперь Вы знакомы с основными функциями большинства программного обеспечения, связанного с экосистемой Docker. Сам Docker, как и все его сопутствующие проекты, продвигает стратегию управления программным обеспечением, дизайна и развертывания приложений, которая дает высокую степень масштабируемости. Понимая и используя возможности разных проектов, Вы можете выполнить развертывание сложных приложений, достаточно гибких для учета разнообразных требований к эксплуатации.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
Экосистема Docker
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!