У контейнера докеров есть собственный стек TCP/IP?
Я пытаюсь понять, что происходит под капотом, к сетевому пакету, идущему от провода, подключенного к главной машине, и направленному на приложение внутри контейнера Docker.
Если это классическая виртуальная машина, я знаю, что пакет, поступающий на хост, будет передаваться гипервизором (скажем, VMware, VBox и т.д.) виртуальному сетевому адаптеру виртуальной машины и оттуда через стек TCP/IP гостевой ОС, наконец, добравшись до приложения.
В случае Docker я знаю, что пакет, поступающий на хост-машину, пересылается из сетевого интерфейса хоста на мост docker0
, который подключен к паре veth
, заканчивающейся на виртуальном интерфейсе eth0
внутри контейнера. Но после этого? Поскольку все контейнеры Docker используют ядро хоста, правильно ли предположить, что пакет обрабатывается стеком TCP/IP ядра ядра? Если да, то как?
Мне бы очень хотелось прочитать объяснение подробное (или если вы знаете, что ресурс не стесняйтесь связывать его) о том, что на самом деле происходит под капотом. Я уже внимательно прочитал эту страницу, но он не сказал все.
Заранее благодарим за ваш ответ.
Ответы
Ответ 1
Сетевой стек, как и в "коде", определенно не находится в контейнере, в ядре которого есть только один, разделяемый хостом и всеми контейнерами (вы уже это знали). Каждый контейнер имеет свое собственное пространство имен в сети, что означает, что он имеет свои собственные сетевые интерфейсы и таблицы маршрутизации.
Вот краткая статья, представляющая понятие с некоторыми примерами: http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/
и я нашел эту статью полезной также:
http://containerops.org/2013/11/19/lxc-networking/
Надеюсь, это даст вам достаточно указателей, чтобы копать глубже.