Warum sollten Sie EXPOSE in Dockerfile verwenden, da Sie sowieso an alle Ports binden können?

23

Ich kann docker run -p 3000:3000 image ohne EXPOSE diesen Port in den Container (siehe unten). Wenn das stimmt, warum sollte man sich dann die Mühe machen, EXPOSE in die Docker-Datei zu schreiben? Ist es nur für die Kommunikation mit Bildnutzern? Weil ich keinen funktionalen Grund für EXPOSE-Ports kenne, wenn sie sowieso alle bindbar sind.


Hier sind die Schritte, die zeigen, wie ich mich an einen Hafen in einem Container binde, obwohl dieser nicht EXPOSEd ist

$ cat Dockerfile
FROM alpine
RUN apk add nodejs npm vim
COPY webserver /webserver
CMD [ "node", "/webserver/index.js" ]


$ docker build .
Sending build context to Docker daemon  1.931MB
Step 1/4 : FROM alpine
 ---> 11cd0b38bc3c
Step 2/4 : RUN apk add nodejs npm vim
 ---> Using cache
 ---> 4270f8bdb201
Step 3/4 : COPY webserver /webserver
 ---> Using cache
 ---> 67f4cda61ff0
Step 4/4 : CMD [ "node", "/webserver/index.js" ]
 ---> Using cache
 ---> 1df8f9024b85
Successfully built 1df8f9024b85


$ curl localhost:4400
curl: (7) Failed to connect to localhost port 4400: Connection refused


$ docker run -d -p 4400:3000 1df8f9024b85
7d0e6c56f8ad8827fe72830a30c1aac96821104b8ea111291ca39e6536aad8fd


$ curl localhost:4400
Hello World!


$
Alexander Bird
quelle

Antworten:

29

Dockers EXPOSE-Dokumentation befasst sich mit diesem speziellen Punkt:

Die EXPOSEAnweisung veröffentlicht den Port nicht tatsächlich. Es fungiert als eine Art Dokumentation zwischen der Person, die das Image erstellt, und der Person, die den Container ausführt, und darüber, welche Ports veröffentlicht werden sollen. Um den Port beim Ausführen des Containers tatsächlich zu veröffentlichen, verwenden Sie das -pFlag on docker run, um einen oder mehrere Ports zu veröffentlichen und zuzuordnen, oder das -PFlag, um alle exponierten Ports zu veröffentlichen und sie Ports höherer Ordnung zuzuordnen.

Achten Sie auf den letzten Satz, wenn Sie mehrere Ports -Pverfügbar machen, um zu vermeiden, dass -pin der Befehlszeile mehrere Ports festgelegt werden.

Tensibai
quelle
Die "Dokumentation" besteht aus Bildmetadaten. Neben der Verwendung des -PFlags können andere Dienstprogramme die ausgeführten Container nach diesen Metadaten abfragen. Dies ist hilfreich für Proxys, die ihre Weiterleitungsregeln dynamisch aktualisieren und diese offengelegten Ports als Standard verwenden.
BMitch
@BMitch absolut, ich dachte, es wäre eine fremde Information, die für das OP noch nicht nützlich ist, aber ich kann sie
gerne
EXPOSE ist Dokumentation
井上 智 文
4

Dies geschieht aus Gründen der Automatisierung. Sie können einen universellen Befehl docker run -Pausführen, um einen Container zu starten, und die Docker-Datei selbst wird verwendet, um anzugeben, welcher Container welchen Port verfügbar macht. Wenn Sie es mit Dutzenden oder Hunderten von Containern zu tun haben, die über eine Pipeline erstellt werden, ist dies sehr nützlich. Externe Details, die nicht in Dockerfile enthalten sind, zusammen mit dem Container von Stufe zu Stufe durch die Pipeline zu leiten, ist im Maßstab recht schwierig.

Jiri Klouda
quelle