Netzwerkverbindung ausschließlich an Docker-Container binden

Netzwerkverbindung ausschließlich an Docker-Container binden

Ist es mit Docker möglich, eine Host-Netzwerkverbindung ausschließlich an einen Docker-Container zu binden?

Mit anderen Worten, es soll in einen Container verschoben werden eth1(oder was auch immer), sodass es nur für diesen Container verfügbar ist – weder der Host noch andere Container/virtuelle Maschinen usw., die auf dem Host ausgeführt werden, sollten darauf zugreifen können.

In Linux Containers (LXC) ist dies trivial, es gibt einen physNetzwerktyp, der genau dies tut:

physik:lxc.net.[i].linkDem Container wird eine bereits vorhandene, durch angegebene Schnittstelle zugewiesen .

Ich bin nichtFragen zur Weiterleitungoder mit macvlan oderandere Hacks.

Im Idealfall wäre dies mit Standard-Docker-Befehlen möglich, aber nach dem, was ich gelesen habe, befürchte ich, dass die Netzwerkimplementierung von Docker dies nicht unterstützt. Eine mögliche Umgehung mit ipBefehlen wäre besser als nichts.

Antwort1

Mit Standard-Netzwerkbefehlen ist dies nicht möglich. Funktionen, die dies erleichtern würden, wurden von Docker vor einigen Jahren explizit abgelehnt (https://github.com/moby/moby/pull/8216).

Sie können eine Schnittstelle natürlich manuell in den Netzwerk-Namespace eines Docker-Containers verschieben, aber das ist mit Problemen behaftet: Beispielsweise müssen Sie Ihr Netzwerk jedes Mal neu konfigurieren, wenn Sie den Container neu starten oder neu erstellen.


So fügen Sie dem Netzwerk-Namespace Ihres Containers eine Schnittstelle hinzu:

  1. Holen Sie sich die PID Ihres Containers:

    container_pid=$(docker inspect <container_name_or_id> -f '{{ .State.Pid }}')
    
  2. Weisen Sie die Schnittstelle dem Namespace des Containers zu:

    ip link set netns ${container_pid} dev ${device}
    

Und Sie sind fertig ... größtenteils.

Wenn Sie die Schnittstelle nach dem Hinzufügen zum Namespace konfigurieren möchten, müssen Sie entweder:

  • Führen Sie Ihren Container mit zusätzlichen Berechtigungen aus. Wahrscheinlich nur --cap-add=NET_ADMIN, obwohl Sie auch einfach verwenden können, --privilegedwährend Sie Dinge testen.

  • Verwenden Sie nsenter, um die Konfiguration von außerhalb des Containers durchzuführen:

    nsenter -t ${container_pid} -n ip addr ...
    

Obwohl das alles funktioniert, würde ich aufgrund der genannten Einschränkungen einfach beim macvtapTreiber bleiben, wenn ich aus irgendeinem Grund eine physische Schnittstelle innerhalb des Containers benötige. Oder verwenden Sie lxcein systemd-nspawnanderes Containerisierungstool, das diese spezielle Aufgabe erleichtert.

verwandte Informationen