2015-09-30 2 views
2

Я пытаюсь понять взаимосвязь между:Docker Networking

  • eth0 на хост-машине; и
  • docker0 мост; и
  • eth0 интерфейс на каждом контейнере

Это мой понимание что Docker:

  1. Создает docker0 мост, а затем присваивает ему доступную подсеть, которая не противоречит ни с чем работает на гостья; затем
  2. Докер связывает docker0 - eth0 работает на хосте; затем
  3. Docker связывает каждый новый контейнер он раскручивает до docker0, таким образом, что интерфейс контейнера eth0 подключается к docker0 на хосте, который в свою очередь соединен с eth0 на хосте

Таким образом, когда что-то внешнее хост пытается связаться с контейнером, он должен отправить сообщение в порт на IP-адресе хоста, который затем отправляется на мост docker0, который затем транслируется во все контейнеры, запущенные на хосте, да?

Кроме того, таким образом, когда контейнер должен связываться с чем-то вне хоста, он имеет свой собственный IP-адрес (арендованный из подсети docker0), и поэтому удаленный вызывающий объект увидит сообщение как имеющее IP-адрес контейнера.

Так что если что-либо, о чем я говорил выше, неверно, , пожалуйста, начните с уточнения для меня!

Предполагая, что я более или менее правильно, мои главные задачи:

  • Когда удаленные услуги «заехать» в контейнер, все контейнеры получают транслировались то же сообщение, что создает много трафика/noise, но также может быть угрозой безопасности (где только контейнер 1 должен быть получателем некоторого сообщения, но все остальные контейнеры, работающие на нем, также получают сообщение); и
  • Что происходит, когда Docker выбирает идентичные подсети на разных хостах? В этом случае контейнер 1, живущий на хосте 1, может иметь тот же IP-адрес, что и контейнер 2, живущий на хосте 2. Если контейнеру 1 необходимо «вызывать» какую-либо внешнюю/удаленную систему (не проживая на хосте), то как что удаленная система различает контейнер 1 и контейнер 2 (оба будут показывать один и тот же выход IP)?
+0

Посмотрите veth (ваша концепция «bind» не совсем правильная) и NAT с IP-таблицами (masquerade). –

+0

Вы можете установить конкретный порт для вашего контейнера для подключения внешнего хост-компьютера докера. Вы можете найти хорошее объяснение здесь http://stackoverflow.com/questions/26539727/giving-a-docker-container-a-routable-ip-address – Victor

+0

Это не создает много трафика/шума, у него есть NAT и точно знает, куда идет этот пакет. Это риск безопасности в сети моста по умолчанию. Вот почему Docker создал концепцию сети. Он позволяет отделить трафик с контейнерами, которые должны быть обмениваться: https://docs.docker.com/engine/userguide/networking/dockeretworks/ Ничего плохого не происходит, если они выбирают одинаковые подсоединительные сети, на самом деле они выполняют default: что-то вроде 172.17.255.255. 2 хоста имеют 2 отдельных NAT, поэтому каждый отвечает за правильную маршрутизацию. Внешне они используют интерфейсы HOST (eth0), которые являются уникальными –

ответ

0

Я не буду говорить, что вы поняли концепцию сетей в Докере. Поясню эту часть первая:

Так вот как это идет:

  1. Docker использует особенность ядра Linux под названием пространства имен, чтобы классифицировать/разделить ресурсы.
  2. Когда контейнер запускается, Docker создает набор пространств имен для этого контейнера.
  3. Это обеспечивает слой изоляции.
  4. Одним из них является «чистое пространство имен»: используется для управления сетевыми интерфейсами.

Теперь говорим немного о сети Namespaces:

Net имен,

  • Позволяет каждый контейнер имеет свои собственные ресурсы сети, собственный сетевой стек.
    • Это собственные сетевые интерфейсы.
    • Это собственные таблицы маршрутизации.
    • Это собственные правила iptables.
    • свои собственные гнезда (сс, NetStat)
  • Мы можем переместить через сетевой интерфейс чистых пространств имен.
  • Итак, мы можем создать netns где-нибудь и использовать его в другом контейнере.
  • Обычно используются два виртуальных интерфейса, которые действуют как перекрестный кабель.
  • Eth0 @ container netNS, который сопряжен с виртуальным интерфейсом vethXXX в хосте network ns. ➔ Все виртуальные интерфейсы vethXXX соединяются вместе. (Использование моста docker0)

Теперь, помимо пространств имен, в ядре Linux есть вторая функция, которая делает возможным создание контейнеров: c-группы (или группы управления).

  • Контрольные группы позволяют нам осуществлять измерение и ограничение:
    • памяти
    • CPU
    • Block I/O
    • Сеть

TL/DL

Вкратце: Контейнеры стало возможным из-за 2 основные особенности ядра: Пространства имен и C-групп.

Cgroups ---> Ограничивает, сколько вы можете использовать.

Пространства имён ---> Ограничивает то, что вы можете видеть.

И вы не можете повлиять на то, что не видите.


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

Итак, я думаю, что это отвечает на оба ваших вопроса.

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

P.S .:

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

спасибо.

 Смежные вопросы

  • Нет связанных вопросов^_^