Wat is het verschil tussen het blootleggen en publiceren van een Docker-poort?

0
65
Michael Vi/Shutterstock.com< /figuur>

Blootgestelde en gepubliceerde containerpoorten zijn twee verschillende, maar verwante concepten in Docker. Blootgestelde poorten worden in uw Dockerfile gedefinieerd als eenvoudige metadata. U moet ze publiceren wanneer uw container start als u toegang van buitenaf wilt inschakelen.

Een poort vrijgeven

Poorten worden weergegeven via EXPOSE-instructies in een image’s Dockerfile:

EXPOSE 80

Het vrijgeven van een poort heeft echter geen onmiddellijk effect. De verklaring communiceert alleen dat de toepassing in de container luistert op poort 80. Het opent die poort niet voor de wereld en biedt geen expliciete toegang tot andere containers.

Als auteur van afbeeldingen helpt het weergeven van poorten die door uw werklast worden gebruikt met EXPOSE gebruikers bij het configureren van de juiste regels voor poortdoorschakeling wanneer ze een container starten. Dit is met name belangrijk wanneer niet-standaard poorten worden gebruikt: hoewel van een webserver kan worden verwacht dat deze op poort 80 luistert, kunnen gebruikers niet raden welke poort door een aangepaste socketserver wordt gebruikt.

Blootgestelde poorten zijn zichtbaar wanneer u uw containers vermeldt met docker ps. Ze verschijnen in de PORTS-kolom, ook al zijn ze niet echt toegankelijk buiten de container. Dit geeft u een eenvoudige manier om te controleren op welke poorten de software in een container luistert.

U kunt poorten inspecteren die worden weergegeven door een afbeelding zonder een container te starten met behulp van docker inspect. Vervang de tag of ID van uw afbeelding in plaats van demo-image:

docker inspect –format=”{{json .Config.ExposedPorts}}” demo-image

Poorten publiceren

Door een poort te publiceren, wordt deze toegankelijk van buiten de container. Hiermee kun je een poort nemen die je hebt ontdekt door een EXPOSE-instructie, en er vervolgens een hostpoort aan binden.

Advertentie

Poorten worden weergegeven met de vlag -p voor de opdracht docker run:

docker run -d -p 8080:80 httpd:latest

Deze opdracht bindt poort 8080 op uw Docker-host aan 80 in uw nieuwe container. Nu kunt u http://localhost:8080 bezoeken om toegang te krijgen tot de poort van de container. Als u docker ps uitvoert, ziet u dat de kolom POORTEN nu deze toewijzing toont. De blootgestelde containerpoort 80 is gepubliceerd op de host.

De vlag -p kan worden gebruikt zonder een poort te specificeren om aan te binden:

docker run -d -p 80 httpd:latest

Deze variant zal poort 80 in de container binden aan een willekeurige poort op de host. U kunt de toegewezen poort controleren door docker ps uit te voeren.

-p ondersteunt ook het publiceren van een poort naar specifieke netwerkinterfaces:

docker run -d -p 127.0.0.1:8080:80 httpd:latest Advertisement

Hier is de containerpoort 80 alleen toegankelijk via poort 8080 op het lokale loopback-adres van de host. Dit beschermt uw container tegen netwerkaanroepen van uw andere apparaten.

Alle blootgestelde poorten publiceren

U kunt een container starten met de vlag –publish-all om Docker automatisch alle blootgestelde poorten te laten publiceren die worden vermeld in het Docker-bestand van de afbeelding:

docker run -d –publish-all httpd:latest

Hiermee worden willekeurige vrije poorten op uw host toegewezen aan elke blootgestelde poort in de container. Gebruik de opdracht docker ps om de gemaakte poorttoewijzingen te zien. Dit vereenvoudigt het starten van een nieuwe container vanaf een image waarvoor verschillende niet-standaard poorten moeten worden geopend.

U kunt –publish-all combineren met expliciete -p-toewijzingen. In dit geval overschrijft een toewijzing die is gemaakt door een vlag -p de willekeurige poort die is toegewezen door –publish-all.

Als u geen poort hoeft te publiceren

U hoeft alleen containerpoorten met -p te publiceren als u ze wilt openen vanaf uw Docker-host of een ander apparaat op uw fysieke netwerk. Docker-netwerken zijn de geprefereerde alternatieve benadering voor verkeer tussen containers.

Containers die een netwerk delen, kunnen altijd met elkaar communiceren, zelfs als hun poorten niet expliciet zijn gepubliceerd.

docker netwerk demo-netwerk aanmaken docker run -d –network demo-network –name web web:latest docker run -d –network demo-network –name database database:latest Advertisement

In dit voorbeeld , kan de webcontainer verbinding maken met een MySQL-server die wordt uitgevoerd op poort 3306 in de databasecontainer met behulp van het database:3306-adres. Docker stelt automatisch routeringstabellen in voor de containernamen in het netwerk.

Poortbereiken gebruiken

Docker kan volledige poortbereiken weergeven en publiceren wanneer u meerdere poorten beschikbaar moet hebben:

EXPOSE 8000-8100 docker run –publish-all docker run -p 6000-6100:8000-8100

In het eerste geval , –publish-all wijst 100 willekeurige poorten toe aan uw host en wijst deze toe aan het bereik van de container. De tweede vorm bindt expliciet een hostbereik aan een containerbereik zoals normaal. De prestaties kunnen worden beïnvloed als u een zeer groot aantal poorten gebruikt, aangezien er voor elke poort een iptables-regel wordt gemaakt.

Samenvatting

Blootgestelde poorten zijn stukjes metadata die de poorten definiëren waarnaar wordt geluisterd door software in een containerimage. De aanwezigheid van blootgestelde poorten maakt ze niet toegankelijk, tenzij u ze handmatig publiceert. In die zin is het werkwoord “blootstellen” is een verkeerde benaming, omdat veel mensen aannemen dat het een actieve actie is, terwijl het in feite een informatieve verklaring is. EXPOSE moet worden behandeld als documentatie, terwijl de vlag -p een functionerende poorttoewijzing creëert.

Docker biedt wel wat extra gedrag op basis van EXPOSE-instructies. U kunt de blootgestelde poorten van een container bekijken met docker ps, ongeacht of ze zijn gepubliceerd. Er is ook de vlag –publish-all die de blootgestelde poorten van een afbeelding publiceert naar willekeurige hostpoorten.

U hoeft poorten alleen te publiceren als u van buitenaf toegang wilt tot een container een Docker-netwerk. Communicatie tussen containers in hetzelfde netwerk is altijd ongehinderd, ongeacht of de betrokken havens zijn blootgesteld of gepubliceerd.