Unterschied zwischen Expose und Ports in Docker

Isaac Tony 23 August 2022
  1. die DockerFile-Anweisung EXPOSE in Docker
  2. die Docker-Compose-Ports
Unterschied zwischen Expose und Ports in Docker

Nachdem wir in Docker einen Container mit docker create oder docker run erstellt haben, möchten wir möglicherweise, dass unser Container mit externen Diensten oder anderen externen Containern interagiert. Dazu müssen wir Häfen für die Außenwelt verfügbar machen.

In diesem Artikel stellen wir zwei wichtige Möglichkeiten vor, mit denen wir Ports in Docker verfügbar machen können. Wir werden auch besprechen, wie wir den Container-Port einem Host-Port zuordnen können und welche Unterschiede in den Methoden bestehen.

die DockerFile-Anweisung EXPOSE in Docker

Eine Docker-Datei ist einfach eine Textdatei, die Anweisungen zum Zusammenstellen eines Images mit dem Befehl docker build enthält. Dazu gehört die Anweisung EXPOSE.

Die Anweisung EXPOSE wird verwendet, um Docker mitzuteilen, dass der Container, den wir bauen, zur Laufzeit auf einem bestimmten Netzwerkport lauschen soll. Beachten Sie jedoch, dass diese Anweisung lediglich ein Bezugspunkt ist und den Container-Port nicht dem Host-Port zuordnet.

Syntax:

EXPOSE <port>/<protocol>

Wir müssen das Protokoll nicht angeben, da Docker das Standard-TCP-Protokoll verwenden kann. Wir können jedoch andere Protokolle bereitstellen, wie z. B. das UDP-Protokoll.

Der Docker verwendet das Standard-TCP-Protokoll, da das Protokoll nicht in der offiziellen Docker-Datei von Nginx angegeben ist.

COPY docker-entrypoint.sh /
COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d
COPY 20-envsubst-on-templates.sh /docker-entrypoint.d
COPY 30-tune-worker-processes.sh /docker-entrypoint.d
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 80
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]

Angenommen, wir ziehen das offizielle Nginx-Image aus der Docker-Registrierung, erstellen einen Container und führen den Container aus. In diesem Fall können wir schnell einige hilfreiche Informationen aus dem Container ermitteln, z. B. die Portnummer und das verwendete Protokoll.

~/isaac$ docker ps -a

Ausgabe:

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
99edfdea0443   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 2 minutes   80/tcp    nice_volhard

Die obige Ausgabe zeigt, dass der Nginx-Container auf Port 80 läuft, wie im Dockerfile und im TCP-Protokoll angegeben.

Alternativ können wir einen Port auch zur Laufzeit mit dem --expose-Tag beim Erstellen des Containers verfügbar machen, wie unten gezeigt.

docker run --expose 80 nginx

Binden Sie diesen Port nun an die Host-Portnummer. Wir müssen das Tag -P in Großbuchstaben oder das Tag -p in Kleinbuchstaben verwenden.

Obwohl wir die Ergebnisse mit beiden erzielen können, weisen diese Tags erhebliche Unterschiede auf.

Das großgeschriebene -P-Tag ermöglicht es uns, wenn es zur Laufzeit verwendet wird, alle exponierten Tags an zufällige Ports auf dem Host zu binden. Dadurch können wir Konflikte in Häfen vermeiden.

$ docker run -d -P nginx
006b88a06e51eac45895f13b33a89221676029e8fa654aaaccc79b81f74efb4d

Code:

isaac$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                   NAMES
006b88a06e51   nginx     "/docker-entrypoint.…"   27 seconds ago   Up 6 seconds   0.0.0.0:49153->80/tcp   angry_babbage

Wir können einen Container auch an einem bestimmten Port auf dem Host veröffentlichen, indem wir das kleine -p-Tag verwenden.

die Docker-Compose-Ports

Docker-compose ist ein Dienstprogramm, mit dem wir Multi-Container-Anwendungen auf Docker ausführen können.

Unter der Datei docker-compose.yml können wir angeben, wie unsere Container unter anderen Dateien konfiguriert sind, wie z. B. die Dienste, Version der Datei, verwendete Volumes und Netzwerke, die die Dienste verbinden.

So wie wir Portnummern in der Docker-Datei angegeben haben, müssen wir auch Portnummern in der Datei docker-compose.yml angeben. Wir können dies mit der Anweisung expose oder ports tun.

rabbitmq:
   image: rabbitmq
   expose: 
        - 3000
        - 5000

Die Anweisung expose ermöglicht es uns, Ports verfügbar zu machen, ohne sie zu veröffentlichen oder an die Host-Ports zu binden, d. h. Ports werden nicht für Host-Maschinen verfügbar gemacht, sondern nur für andere Dienste.

Andererseits erlaubt uns die Anweisung ports, sowohl Host- als auch Container-Portnummern anzugeben. Außerdem werden diese Ports von anderen Diensten gemeinsam genutzt und für den Hostcomputer einem zufälligen oder bestimmten Port ausgesetzt.

rabbitmq:
   image: rabbitmq
   ports: 
        - "8000:80"
        - "5000: 70"
Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn