0

Ich versuche, ein Docker Bild von innen Google Cloud Shell (dh auf Höflichkeit Google Compute Engine-Instanz) zu laufen, wie folgt:Docker Lauf kann nicht Portbereich trotz netstat veröffentlichen zeigt an, dass die Ports verfügbar sind

docker run -d -p 20000-30000:10000-20000 -it <image-id> bash -c bash 

Zurück sieht

Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 
tcp  0  0 127.0.0.1:8998   0.0.0.0:*    LISTEN  249/python  
tcp  0  0 0.0.0.0:80    0.0.0.0:*    LISTEN  -    
tcp  0  0 0.0.0.0:22    0.0.0.0:*    LISTEN  -    
tcp  0  0 0.0.0.0:13080   0.0.0.0:*    LISTEN  -    
tcp  0  0 0.0.0.0:13081   0.0.0.0:*    LISTEN  -    
tcp  0  0 127.0.0.1:34490   0.0.0.0:*    LISTEN  -    
tcp  0  0 0.0.0.0:13082   0.0.0.0:*    LISTEN  -    
tcp  0  0 0.0.0.0:13083   0.0.0.0:*    LISTEN  -    
tcp  0  0 0.0.0.0:13084   0.0.0.0:*    LISTEN  -    
tcp  0  0 127.0.0.1:34490   127.0.0.1:48161   ESTABLISHED -    
tcp  0 252 172.17.0.2:22   173.194.92.34:49424  ESTABLISHED -    
tcp  0  0 127.0.0.1:48161   127.0.0.1:34490   ESTABLISHED 15784/python  
tcp6  0  0 :::22     :::*     LISTEN  -  

so ist es mir, als ob alle Ports zwischen 20000 und 30000 sind vorhanden, aber der Lauf mit der folgenden Fehlermeldung wird jedoch beendet: zu diesem Schritt wird die folgende netstat -tuapn berichtet

Fehlerreaktion von Daemon: Kann nicht Container starten: Proxy Starten des Userland-Proxy-Timed out

hier

Was ist los: Endpunkt auf Netzwerkbrücke erstellen gescheitert? Wie kann ich mehr Diagnoseinformationen erhalten und letztendlich das Problem lösen (z. B. dass mein Docker-Image mit dem gesamten verfügbaren Port-Bereich ausgeführt wird).

Antwort

1

Das Öffnen von Ports in einem Bereich lässt sich in Docker derzeit nicht gut skalieren. Dies führt dazu, dass 10.000 Docker-Proxy-Prozesse zur Unterstützung jedes Ports generiert werden, einschließlich aller Dateideskriptoren, die zur Unterstützung all dieser Prozesse benötigt werden, sowie eine lange Liste von Firewall-Regeln, die hinzugefügt werden. Irgendwann werden Sie ein Ressourcenlimit für Dateideskriptoren oder Prozesse erreichen. Weitere Informationen finden Sie unter issue 11185 on github.

Die einzige Problemumgehung bei der Ausführung auf einem Host, den Sie steuern, besteht darin, die Ports nicht zuzuweisen und die Firewallregeln manuell zu aktualisieren. Nicht sicher, dass das bei GCE überhaupt möglich ist. Die beste Lösung wird sein, Ihre Anforderungen neu zu gestalten, um den Portbereich klein zu halten. Die letzte Option besteht darin, das Brückennetzwerk vollständig zu umgehen und auf dem Host-Netzwerk zu laufen, wo keine Proxy- und Firewall-Regeln mehr mit --net=host vorliegen. Das spätere entfernt jede Netzwerkisolation, die Sie in dem Container haben, wird daher gegen empfohlen.

+0

+1 Thx für die Erklärung. Ich sollte in der Lage sein, meine Anforderungen neu zu gestalten, um den Portbereich klein (er) zu halten. Aber das scheint unabhängig von dem Problem zu sein, wo Docker sich über einen Port im Bereich 10000-20000 zu beschweren scheint, während "netstat" das nicht glaubt. Wie kann ich sicher sein, dass dies auch bei einer kleineren Port-Bandbreite nicht passieren wird? – Drux

+0

Ich habe jetzt meine Anforderungen (und Dockerfile) umgestaltet, um eine Reihe von 10 Ports anstelle von 10000 zu verwenden (was für jetzt tun sollte), und das Problem ist "magisch" verschwunden: 'docker run' produziert keine Fehler mehr. – Drux

+0

"Zeitgesteuerter Proxy, der den Userland-Proxy startet" sieht nicht wie eine Beschwerde aus, dass ein Port genommen wird, sondern es sagt, es hat zu lange gedauert, einen "Docker-Proxy" -Prozess zu starten. Es könnte zu lange dauern, da 9.999 andere Prozesse gleichzeitig starten oder ein Nebeneffekt sein könnten, dass keine Dateideskriptoren oder andere Ressourcen mehr vorhanden sind. – BMitch

Verwandte Themen