LINUX.ORG.RU

Неявное указание порта в ядре. Как докер (и другие) это делает.

 , , ,


0

1

Пусть у нас работает два докер контейнера, один слушает входящие соединения на порте 60000 и другой тоже на порте 60000. Но докер ремапит их на разные порты хоста, например на 50001 и 50002.

Так вот вопрос. Когда процесс в контейнере делает сискол bind, ядро получает 60000. Какую еще переменную смотрит ядро чтобы узнать что порт на самом деле должен быть другой?

Как это вообще гуглить? Гугл выдает кучу ерунды о настройке докера. Буду благодарен за ссылку.

Самый простой вариант – биндиться на порт «0» – ядро вернёт первый свободный из динамического диапазона. Где-то это в манах в деталях прописано, но лень искать.

beastie ★★★★★
()

Какую еще переменную смотрит ядро чтобы узнать что порт на самом деле должен быть другой?

Никакую, ядро на самом деле биндится на 60000, но в отдельном netns.

А в init netns, который снаружи контнейнера, либо работает прокси, либо настраивается NAT через iptables, чтобы доставлять трафик в контейнер через vethpair, пересекающий границу между netns.

kmeaw ★★★
()

Докер юзает на хосте iptables и ipvs чтоб впустить трафик, промаркировать, и дальше отправить по этой метке до пункта назначения. Внутри контейнера используется netns

upcFrost ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.