2014-07-07 9 views
29

Ich versuche zu verstehen, was passiert unter der Haube zu einem Netzwerk-Paket von der Leitung mit dem Host-Rechner verbunden und an eine Anwendung in einem Docker-Container geleitet.Hat ein Docker-Container einen eigenen TCP/IP-Stack?

Wenn es eine klassische VM wäre, weiß ich, dass ein auf dem Host ankommendes Paket vom Hypervisor (sagen wir VMware, VBox usw.) zur virtuellen NIC der VM und von dort über den TCP/IP-Stack übertragen würde des Gastbetriebssystems, das schließlich die Anwendung erreicht.

Im Fall von Docker, ich weiß, dass ein Paket auf der Hostmaschine aus Richtung der Netzwerkschnittstelle des Host an die Brücke docker0 weitergeleitet wird, dass auf ein veth Paar verbunden ist, auf der virtuellen Schnittstelle eth0 im Innern des Behälters enden . Aber danach? Da alle Docker-Container den Host-Kernel verwenden, ist es richtig anzunehmen, dass das Paket vom TCP/IP-Stack des Host-Kernels verarbeitet wird? Wenn das so ist, wie?

Ich würde wirklich gerne eine detaillierte Erklärung lesen (oder wenn Sie eine Ressource kennen, fühlen Sie sich frei, es zu verbinden) darüber, was wirklich unter der Haube geschieht. Ich lese bereits sorgfältig this Seite, aber es sagt nicht alles.

Vielen Dank im Voraus für Ihre Antwort.

+1

Ja, der Host-TCP/IP-Stack wird verwendet. Nachdem Sie die Seite gelesen haben, auf die Sie verlinkt sind, ist es schwierig, viel mehr hinzuzufügen, außer den Linux-Kernel und den Docker-Quellcode zu lesen. Haben Sie spezielle Fragen? – nos

+0

Danke für Ihren Kommentar. Nun, zum Beispiel ist es mir unklar, wie die Daten von der "docker0" -Brücke zum 'eth0' des Host-Rechners übertragen werden: Ich habe versucht, wireshark zu verwenden, aber ich sehe nur Pakete von' docker0' und '' vethXYZ'; Ich nehme auch an, dass zwischen 'docker0' und' eth0' ein NAT existiert, da Adressen sich ändern, aber ich habe keine Dokumentation darüber gefunden. –

+0

Richtig, das meiste davon, einschließlich der von Docker verwendeten NAT-Regeln, wird in diesem Dokument erklärt. – nos

Antwort

9

Der Netzwerk-Stack, wie in "der Code", ist definitiv nicht im Container, es ist in dem Kernel, von denen nur einer vom Host und allen Containern geteilt wird (das wussten Sie bereits). Was jeder Container hat ist sein eigenes separates Netzwerk Namespace, was bedeutet, dass es seine eigenen Netzwerkschnittstellen und Routing-Tabellen hat.

Hier ist ein kurzer Artikel, den Begriff mit einigen Beispielen Einführung: http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/ und ich habe diesen Artikel hilfreich zu: http://containerops.org/2013/11/19/lxc-networking/

Ich hoffe, das Sie genügend Hinweise gibt, tiefer zu graben.