Ich möchte einen Hochleistungstest in einem Docker-Container durchführen und möchte nicht den Overhead der Überbrückung (damit die Rohrleitungen AFAIK nicht funktionieren). Ich möchte (zusätzlich zum normalen Docker-Veth-Gerät) eine physische 40-GbE-Netzwerkschnittstelle vom Host zu einem Docker-Container wie im lxc-Modus "phys" zuweisen. Dies sollte dazu führen, dass die physische Schnittstelle für den Host unsichtbar wird.
networking
docker
NeilenMarais
quelle
quelle
Bei meiner Suche bin ich auf alte Lösungen gestoßen, bei denen lxc-config-Parameter an Docker übergeben wurden. Neuere Versionen von Docker verwenden die lxc-Tools jedoch nicht mehr, sodass dies nicht funktioniert.
Dem Vorschlag hier folgend: https://groups.google.com/d/msg/docker-user/pL8wlmiuAEU/QfcoFcKI3kgJ wurde eine Lösung gefunden. Ich habe nicht versucht, das Pipework-Skript wie oben erwähnt zu ändern, sondern die erforderlichen Befehle direkt zu verwenden. Siehe auch den folgenden Blog-Beitrag: http://jason.digitalinertia.net/exposing-docker-containers-with-sr-iov/ .
Die folgenden Befehle des Netzwerk-Namespace-Tools auf niedriger Ebene (dh nicht Docker-spezifisch) können verwendet werden, um eine Schnittstelle vom Host in einen Docker-Container zu übertragen:
Eine kleine Einschränkung bei der Benennung der Benutzeroberfläche, wenn Ihr Host viele ethX-Geräte hat (meins hatte eth0 -> eth5). Angenommen, Sie verschieben eth3 als eth1 im Containernamensraum in den Container. Wenn Sie den Container stoppen, versucht der Kernel, das eth1-Gerät des Containers zurück auf den Host zu verschieben. Beachten Sie jedoch, dass bereits ein eth1-Gerät vorhanden ist. Anschließend wird die Schnittstelle in etwas Beliebiges umbenannt. Ich habe eine Weile gebraucht, um es wieder zu finden. Aus diesem Grund habe ich /etc/udev/rules.d/70-persistent-net.rules bearbeitet (ich denke, dieser Dateiname ist in den meisten gängigen Linux-Distributionen üblich; ich verwende Debian), um der fraglichen Schnittstelle einen eindeutigen, unverwechselbaren Namen zu geben und verwenden Sie dies sowohl im Container als auch auf dem Host.
Da wir für diese Konfiguration kein Docker verwenden, können die Standard-Docker-Lebenszyklus-Tools (z. B. Docker-Ausführung --restart = on-fail: 10 ...) nicht verwendet werden. Auf dem fraglichen Host-Computer wird Debian Wheezy ausgeführt, daher habe ich das folgende Init-Skript geschrieben:
Etwas hackig, aber es funktioniert :)
quelle
eth
? Macht Debian nicht konsistente Netzwerkgerätenamen?/var/run/netns/$PID
benötigt wird: Sie benötigen es, damit dieip netns exec $PID ...
Befehle funktionieren.Ich schreibe dazu ein Docker-Netzwerk-Plugin.
https://github.com/yunify/docker-plugin-hostnic
quelle