Wie verwalte ich eine große Anzahl von Ports?

Wie verwalte ich eine große Anzahl von Ports?

Ich betreibe viele Dienste (die meisten werden von Docker verwaltet). Ich habe Probleme, die Portnummern für alle zu verwalten. Das Problem entsteht, wenn ich z. B. einen neuen HTTP-Server starten möchte. Ich muss nach einer Portnummer suchen, die noch nicht von anderen Diensten belegt ist. Wenn ich derzeit einen neuen Server starten möchte, suche ich nach allen belegten Ports in . docker psWenn die belegten Ports beispielsweise 8001, 8002, 8003, ... 8051 sind, weise ich Port 8052 zu. Das funktioniert einwandfrei, bis ein Dienst vorübergehend ausfällt und daher nicht in angezeigt wird. docker psIch weise seinen Port einem neuen Dienst zu. Wenn der alte wiederhergestellt ist, kommt es zu einer Portkollision.

Ich verwende Nginx bereits als Reverse-Proxy, um meine Server dem öffentlichen Netzwerk zugänglich zu machen. Aber das löst mein Problem nicht. Ich muss immer noch irgendwie die neueste, nicht verwendete Portnummer finden, und weder das eine nginx.confnoch das andere docker psist in dieser Situation die einzige Quelle der Wahrheit.

Gibt es eine Lösung zur Verwaltung der Ports? Eine Art Registrierung?

Antwort1

Lassen Sie Docker beim Erstellen des Containers einen freien Port für Sie finden.

Ausdie Dokumentation:

Sie können einen Bereich von Host-Ports angeben, an den ein Container-Port gebunden werden soll, der sich vom standardmäßigen flüchtigen Portbereich unterscheidet:

$ docker run -d -p 8000-9000:5000 training/webapp python app.py

Dadurch wird Port 5000 im Container an einen zufällig verfügbaren Port zwischen 8000 und 9000 auf dem Host gebunden.

Den freigegebenen Port kannst du anschließend docker inspectbeispielsweise wie folgt abrufen:

docker inspect --format '{{ range .HostConfig.PortBindings }}{{ range . }}{{ . }}{{ end }}{{ end }}' container
{127.0.0.1 8095}

Konfiguration meines Testcontainers:

"PortBindings": {
    "8080/tcp": [
        {
            "HostIp": "127.0.0.1",
            "HostPort": "8095"
        }
    ]
}

Antwort2

Ich verschiebe meine Antwort vom ursprünglichen Beitrag

Bei http-basierten Diensten ist dies mit einem Reverse-Proxy einfacher. Sie haben einen Dienst, der auf Port 80/443 lauscht, und können dann mithilfe eines Platzhalter-DNS alle Hostnamen dem Docker-Host zuordnen und auf jeden Dienst mit einem eindeutigen Hostnamen zugreifen. Sie können auch pfadbasiertes Routing verwenden, aber das wird schwieriger, wenn die bereitgestellte App nicht mit relativen Pfaden geschrieben ist.

Beispiele für Reverse-Proxys sind nginx, haproxy und traefik. Ich bevorzuge traefik, da es so konzipiert ist, dass es sich automatisch basierend auf laufenden Containern neu konfiguriert. Diese Proxys laufen in Docker, verwenden ein gemeinsam genutztes Docker-Netzwerk und nur der Proxy hat einen veröffentlichten Port. Auf die restlichen Dienste wird über das Docker-Netzwerk über den Proxy zugegriffen.

Beachten Sie, dass dieser Proxy von dem Proxy getrennt ist, den Sie möglicherweise außerhalb von Docker ausführen. Beide können nebeneinander bestehen, wenn Sie andere externe Anfragen an andere Server im Netzwerk haben. Für alle Anfragen an Container auf dem Docker-Host sendet der externe Proxy Anfragen an den Docker-basierten Proxy.

verwandte Informationen