Docker Ecosystem: сеть и связь

Вступление

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

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

Реализация Native Docker Networking

Сам Docker предоставляет многие из основ сети, необходимых для связи контейнер-контейнер и контейнер-хост.

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

Когда Docker запускает контейнер, создается новый виртуальный интерфейс, которому присваивается адрес в пределах диапазона подсети моста. IP-адрес подключается к внутренней сети контейнера, предоставляя сети контейнера путь к мостуdocker0 в хост-системе. Docker автоматически настраивает правилаiptables, чтобы разрешить пересылку, и настраивает маскировку NAT для трафика, исходящего изdocker0 и предназначенного для внешнего мира.

Как контейнеры предоставляют услуги потребителям?

Другие контейнеры на том же хосте могут получать доступ к услугам, предоставляемым их соседями, без какой-либо дополнительной настройки. Хост-система просто направит запросы, исходящие и предназначенные для интерфейсаdocker0, в соответствующее место.

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

В чем разница между выставлением и публикацией порта?

При создании образов контейнера или запуске контейнера у вас есть возможность выставить порты или опубликовать порты. Разница между ними значительна, но может быть не сразу заметна.

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

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

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

Docker предоставляет механизм, называемый «Docker links» для настройки связи между контейнерами. Если новый контейнер связан с существующим контейнером, новый контейнер получит информацию о соединении для существующего контейнера через переменные среды.

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

Проекты по расширению сетевых возможностей Docker

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

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

Создание оверлейных сетей для абстрагирования основной топологии

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

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

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

Расширенная настройка сети

Другие проекты расширяют сетевые возможности Docker, обеспечивая большую гибкость.

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

Дополнительная функциональность обеспечивается за счет дополнительных «сантехнических» возможностей. Эти проекты не предоставляют готовую конфигурацию, но они позволяют вручную соединять части и создавать сложные сетевые сценарии. Некоторые из возможностей, которые вы можете получить, варьируются от простого установления частной сети между определенными хостами до настройки мостов, vlans, пользовательских подсетей и шлюзов.

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

Каковы некоторые общие проекты по улучшению сети Docker?

Существует несколько различных проектов, направленных на создание оверлейных сетей для хостов Docker. Общие из них:

  • flannel: Разработанный командой CoreOS, этот проект изначально был разработан для предоставления каждой хост-системе своей собственной подсети общей сети. Это условие, необходимое для работы инструмента оркестровки Google kubernetes, но оно полезно в других ситуациях.

  • weave: Weave создает виртуальную сеть, которая соединяет все хост-машины вместе. Это упрощает маршрутизацию приложений, поскольку создает видимость каждого контейнера, подключаемого к одному сетевому коммутатору.

Что касается продвинутых сетей, следующий проект направлен на заполнение этой вакансии путем предоставления дополнительных сантехнических услуг:

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

Одним из соответствующих примеров существующего программного обеспечения, использованного для добавления функциональности в Docker, является:

  • tinc: Tinc - это легкое программное обеспечение VPN, которое реализовано с использованием туннелей и шифрования. Tinc - это надежное решение, которое может сделать частную сеть прозрачной для любых приложений.

Заключение

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

Вnext guide мы обсудим, как планировщики и инструменты оркестрации строятся на этой основе для обеспечения функциональности кластерного управления контейнерами.

Related