Я пытаюсь понять взаимосвязь между:Docker Networking
eth0
на хост-машине; иdocker0
мост; иeth0
интерфейс на каждом контейнере
Это мой понимание что Docker:
- Создает
docker0
мост, а затем присваивает ему доступную подсеть, которая не противоречит ни с чем работает на гостья; затем - Докер связывает
docker0
-eth0
работает на хосте; затем - Docker связывает каждый новый контейнер он раскручивает до
docker0
, таким образом, что интерфейс контейнераeth0
подключается кdocker0
на хосте, который в свою очередь соединен сeth0
на хосте
Таким образом, когда что-то внешнее хост пытается связаться с контейнером, он должен отправить сообщение в порт на IP-адресе хоста, который затем отправляется на мост docker0
, который затем транслируется во все контейнеры, запущенные на хосте, да?
Кроме того, таким образом, когда контейнер должен связываться с чем-то вне хоста, он имеет свой собственный IP-адрес (арендованный из подсети docker0
), и поэтому удаленный вызывающий объект увидит сообщение как имеющее IP-адрес контейнера.
Так что если что-либо, о чем я говорил выше, неверно, , пожалуйста, начните с уточнения для меня!
Предполагая, что я более или менее правильно, мои главные задачи:
- Когда удаленные услуги «заехать» в контейнер, все контейнеры получают транслировались то же сообщение, что создает много трафика/noise, но также может быть угрозой безопасности (где только контейнер 1 должен быть получателем некоторого сообщения, но все остальные контейнеры, работающие на нем, также получают сообщение); и
- Что происходит, когда Docker выбирает идентичные подсети на разных хостах? В этом случае контейнер 1, живущий на хосте 1, может иметь тот же IP-адрес, что и контейнер 2, живущий на хосте 2. Если контейнеру 1 необходимо «вызывать» какую-либо внешнюю/удаленную систему (не проживая на хосте), то как что удаленная система различает контейнер 1 и контейнер 2 (оба будут показывать один и тот же выход IP)?
Посмотрите veth (ваша концепция «bind» не совсем правильная) и NAT с IP-таблицами (masquerade). –
Вы можете установить конкретный порт для вашего контейнера для подключения внешнего хост-компьютера докера. Вы можете найти хорошее объяснение здесь http://stackoverflow.com/questions/26539727/giving-a-docker-container-a-routable-ip-address – Victor
Это не создает много трафика/шума, у него есть NAT и точно знает, куда идет этот пакет. Это риск безопасности в сети моста по умолчанию. Вот почему Docker создал концепцию сети. Он позволяет отделить трафик с контейнерами, которые должны быть обмениваться: https://docs.docker.com/engine/userguide/networking/dockeretworks/ Ничего плохого не происходит, если они выбирают одинаковые подсоединительные сети, на самом деле они выполняют default: что-то вроде 172.17.255.255. 2 хоста имеют 2 отдельных NAT, поэтому каждый отвечает за правильную маршрутизацию. Внешне они используют интерфейсы HOST (eth0), которые являются уникальными –