2015-09-23 12 views
14

Ich muss die Ports auf dem Host den Ports auf dem Container zuordnen. Ich kann dies erreichen, indem Sie den Befehl "docker run" mit der Option -p ausführen. Wie erreiche ich dies durch die Dockerfile? die folgende Verwendung gibt ein "deprecated error"So veröffentlichen Sie Ports in Docker-Dateien

EXPOSE 80:8080 

Wie sonst kann ich die freiliegenden Anschlüsse Öffentlichkeit durch teh dockerfile machen?

Antwort

14

Sie können nicht. Welche Ports auf dem Docker-Host veröffentlicht werden, ist ausschließlich eine Entscheidung, die vom lokalen Administrator getroffen werden sollte, nicht von dem Image, das sie ausführen möchten. Das wäre (a) ein Sicherheitsproblem (hey, ich habe gerade den SSH-Zugriff auf Ihr System geöffnet!) und (b) anfällig für Fehler (mein Webserver-Container kann nicht an Port 80 binden, weil ich bereits einen Server auf dem Server betreibe Port 80).

Wenn Sie lange docker run Befehlszeilen vermeiden möchten, sollten Sie den Prozess mit etwas wie docker-compose automatisieren. Sie können dann passieren Docker-komponieren eine Konfiguration wie:

mywebserver: 
    image: myname/mywebserver 
    ports: 
    - 80:8080 

Und dann ein einfaches docker-compose up Ihre Container mit Containerhafen 8080 gebunden Host-Port 80.

aktualisieren 2017.03.11 starten

Als Reaktion auf Willa Kommentar:

  • docker-compose Verwendung wird nicht h elp mit dem Port-Kollisionsproblem. Das Port-Kollisionsproblem ist ein Grund, warum Bilder Host-Port-Bindungen nicht angeben dürfen. Ich bot einfach docker-compose als Alternative zu langen docker run Befehlszeilen mit mehreren Portbindungen an. Das Port-Kollisionsproblem würde es einem Container potenziell ermöglichen, einen Denial-of-Service-Angriff auf Ihren Host auszuführen: Wenn beispielsweise ein Container vor einem Apache-Server auf Ihrem Host (oder in einem anderen Container) gestartet und an Port 80 gebunden wird, dann Sie haben gerade Ihren Webservice verloren.

  • Zum Sicherheitsproblem: Wenn ein Image Host-Port-Bindungen angeben kann, können Container ohne Ihr Wissen Zugriff auf den Container eröffnen. Wenn Sie einem Remote-Benutzer den Zugriff auf einen Container auf Ihrem Host erlauben, können Sie eine Host-Kompromittierung durchführen, falls die Namespace-Funktionen im Kernel den Container nicht vollständig isolieren und selbst wenn Sie der Isolation völlig vertrauen zu möglichen rechtlichen Problemen, wenn dieser Behälter für illegale Zwecke verwendet wird. In jedem Fall ist es eine schlechte Idee.

+0

Danke! das hilft –

+0

Wie funktioniert das Verwenden von docker-compose das Potenzial für Port-Kollision obwohl? Außerdem können Sie etwas zum Sicherheitsproblem erklären? – Willa

10

Es gibt einen Unterschied zwischen aussetzen und veröffentlichen.

Expose bedeutet, den Port auf der Containerseite zu öffnen, publish bedeutet, es auf dem Docker-Host für die Außenwelt zu öffnen.

Wenn beispielsweise der Befehl docker run -p 80: 8080 lautet, wird der Port 8080 im Container und der Veröffentlichungsport 80 auf dem Host angezeigt.

Sie können nur wirklich Ports in der Dockerfile verfügbar machen, wenn Sie die Flexibilität haben, die Ports zu veröffentlichen, müssen Sie die Option -p mit Docker ausführen verwenden.

Verwandte Themen