Ich experimentiere mit Dockerfiles und glaube, ich verstehe den größten Teil der Logik. In diesem Zusammenhang sehe ich jedoch keinen Unterschied zwischen dem "Offenlegen" und dem "Veröffentlichen" eines Ports.
Alle Tutorials, die ich zuerst gesehen habe, enthalten den EXPOSE
Befehl in der Docker-Datei:
...
EXPOSE 8080
...
Sie erstellen dann ein Image aus dieser Docker-Datei:
$ docker build -t an_image - < Dockerfile
Veröffentlichen Sie dann denselben Port wie oben, wenn Sie das Image ausführen:
$ docker run -d -p 8080 an_image
oder veröffentlichen Sie alle Ports mit
$ docker run -d -P an_image
Was bringt es, einen Port in der Docker-Datei verfügbar zu machen, wenn er trotzdem veröffentlicht wird? Wäre es jemals notwendig, einen Port zuerst verfügbar zu machen und später nicht zu veröffentlichen? Tatsächlich möchte ich alle Ports angeben, die ich in der Docker-Datei beim Erstellen des Images verwenden werde, und mich dann nicht erneut mit ihnen befassen, sondern sie einfach ausführen mit:
$ docker run -d an_image
Ist das möglich?
EXPOSE
und-p
und nicht die die drei Aufzählungspunkte dagewesene. Habe mich da ein bisschen verwirrt.EXPOSE
, aber Sie haben angegeben-p
. Nach meinem Verständnis ist es in Ordnung , wenn Sie immer-p
einzelne Container verwenden und ausführenEXPOSE
, dies wegzulassen, aber es wird nützlich / notwendig, wenn Sie-P
oder verwenden--link
. (Und da Sie nicht wissen, wie andere Personen Ihr Bild verwenden,EXPOSE
sollte in allen öffentlichen Bildern angegeben werden.)Kurze Antwort:
EXPOSE
ist eine Art zu dokumentieren--publish
(oder-p
) ist ein Weg , der die Abbildung eines Host - Port zu einem laufenden ContainerhafenBeachten Sie darunter:
EXPOSE
bezieht sich aufDockerfiles
( dokumentieren )--publish
bezieht sich aufdocker run ...
( Ausführung / Laufzeit )Ebenfalls,
Servicezugriff, wenn
EXPOSE
/--publish
nicht definiert sind:Bei der Antwort von @Golo Roden heißt es:
Vielleicht war das zu der Zeit der Fall, als die Antwort geschrieben wurde, aber jetzt scheint es, dass selbst wenn Sie nicht verwenden,
EXPOSE
oder--publish
, dashost
und anderecontainers
aus dem gleichen Netzwerk einen Dienst zugreifen können wird Ihnen innerhalb dieser Behälter beginnen kann.So testen Sie dies:
Ich habe folgendes verwendet
Dockerfile
. Grundsätzlich beginne ich mit Ubuntu und installiere einen winzigen Webserver:Ich habe
build
das Bild als "testexpose" undrun
einen neuen Container mit:Innerhalb des Containers starte ich einige Instanzen von
mini-httpd
:Ich kann dann
curl
vom Host oder anderen Containern die Homepage von abrufenmini-httpd
.quelle
172.17.0.2
) und alle Ports verwendet, die ich erwähne. Wenn Sie Docker für Mac / Windows verwenden, ist das Netzwerk anders. Es gibt keinedocker0
Brücke.Siehe die offizielle Dokumentationsreferenz: https://docs.docker.com/engine/reference/builder/#expose
Mit dieser
EXPOSE
Option können Sie private (Container) und öffentliche (Host) Ports definieren, die zum Zeitpunkt der Image-Erstellung verfügbar gemacht werden sollen, wenn der Container ausgeführt wird, wenn Sie den Container mit ausführen-P
.Der öffentliche Port und das Protokoll sind optional. Wenn kein öffentlicher Port angegeben ist, wird vom Docker ein zufälliger Port auf dem Host ausgewählt, um den angegebenen Container-Port in Dockerfile verfügbar zu machen.
Eine gute Übung ist, keinen öffentlichen Port anzugeben, da nur ein Container pro Host begrenzt ist (ein zweiter Container wirft einen bereits verwendeten Port).
Sie können mit
-p
indocker run
kontrollieren , was öffentlich - Port die freiliegenden Containerhäfen verbindbar sein.Auf jeden Fall werden keine Ports verfügbar gemacht, wenn Sie weder
EXPOSE
(mit einem-P
Docker-Lauf) noch verwenden-p
.Wenn Sie immer
-p
beidocker run
verwenden, brauchen Sie nicht,EXPOSE
aber wenn SieEXPOSE
Ihrendocker run
Befehl verwenden, kann dies einfacher sein,EXPOSE
kann nützlich sein, wenn Sie sich nicht darum kümmern, welcher Port auf dem Host verfügbar gemacht wird, oder wenn Sie sicher sind, dass nur ein Container geladen wird.quelle
Sie machen Ports mit dem Schlüsselwort EXPOSE in der Docker-Datei oder dem Flag --expose für die Docker-Ausführung verfügbar. Durch das Anzeigen von Ports wird dokumentiert, welche Ports verwendet werden, es werden jedoch keine Ports zugeordnet oder geöffnet. Das Freilegen von Ports ist optional.
Quelle: Github Commit
quelle
Die meisten Leute verwenden Docker Compose mit Netzwerken. In der Dokumentation heißt es:
Wenn Sie also Netzwerke für die Kommunikation zwischen Containern verwenden, müssen Sie sich keine Gedanken über die Freigabe von Ports machen.
quelle
EXPOSE wird verwendet, um den Port des lokalen Portcontainers zuzuordnen, dh wenn Sie in der Docker-Datei wie expose angeben
EXPOSE 8090
Durch den Vorgang wird der lokale Host-Port 8090 dem Container-Port 8090 zugeordnet
quelle