Unterschied zwischen ports und expose in docker-compose
Was ist der Unterschied zwischen "ports" und "expose" in docker-compose docker-compose.yml?
- EXPOSE dient nur der Dokumentation, es werden keine Ports offengelegt.


Was ist der Unterschied zwischen "ports" und "expose" in docker-compose docker-compose.yml?
In einer Docker Compose-Datei dienen die Optionen ports und expose unterschiedlichen Zwecken.
Die Option ports wird verwendet, um Ports vom Container auf den Host abzubilden. Sie definiert eine Liste von Port-Zuordnungen im Format HOST_PORT:CONTAINER_PORT. Die folgende Ports-Konfiguration ordnet zum Beispiel Port 80 auf dem Host dem Port 8080 im Container zu:
services:
web:
image: nginx
ports:
- "80:8080"
Mit dieser Konfiguration kann man unter http://localhost:80 auf dem Hostrechner auf den im Container ausgeführten Webserver zugreifen.
Andererseits wird die Option expose verwendet, um Ports aus dem Container für andere Container im selben Netzwerk verfügbar zu machen. Es definiert eine Liste von Ports, die offengelegt, aber nicht dem Host zugeordnet sind. Die folgende Expose-Konfiguration macht beispielsweise Port 8080 im Container verfügbar:
services:
web:
image: nginx
expose:
- "8080"
Mit dieser Konfiguration können andere Container im selben Netzwerk auf den Webserver zugreifen, der innerhalb des Containers unter http://web:8080 läuft.
Also nochmal zusammengefasst:
Wie ich schon im Kommentar geschrieben habe, dient EXPOSE im Dockerfile nur zur Dokumentation:
The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published.
Die Ports, die mit EXPOSE definiert sind, werden dann mit docker run -P ...
im Host veröffentlicht.
Bei expose in Docker Compose werden die Ports auch nicht im Host offengelegt, aber innerhalb der in der Compose-Datei festgelegten Services verfügbar.