Vad är skillnaden mellan att exponera och publicera en Docker Port?

0
52
Michael Vi/Shutterstock.com< /figure>

Exponerade och publicerade containerportar är två olika men relaterade koncept i Docker. Exponerade portar definieras i din Dockerfile som enkel metadata. Du måste publicera dem när din behållare startar om du vill aktivera extern åtkomst.

Exponera en port

Portar exponeras via EXPOSE-instruktioner i en image’s Dockerfile:

EXPOSE 80

Att exponera en port har dock ingen omedelbar effekt. Uttalandet kommunicerar bara att applikationen inuti behållaren lyssnar på port 80. Den öppnar inte den porten för världen eller ger uttryckligen åtkomst till andra behållare.

Som bildförfattare hjälper EXPOSE användarna att konfigurera lämpliga regler för vidarebefordran av portar när de startar en container. Detta är särskilt viktigt när icke-standardiserade portar används: medan en webbserver kan förväntas lyssna på port 80, kommer användare inte att kunna gissa porten som används av en anpassad socket-server.

Exponerade portar är synliga när du listar dina containrar med docker ps. De kommer att visas i kolumnen PORTS, även om de faktiskt inte kommer att vara tillgängliga utanför behållaren. Detta ger dig ett enkelt sätt att kontrollera vilka portar programvaran inuti en behållare lyssnar på.

Du kan inspektera portar som exponeras av en bild utan att starta en container genom att använda docker inspect. Byt ut din bilds tagg eller ID istället för demo-image:

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

Publiceringsportar

Genom att publicera en port blir den tillgänglig från utsidan av behållaren. Den låter dig ta en port som du har upptäckt av en EXPOSE-instruktion och sedan binda en värdport till den.

Annons

Portar exponeras med flaggan -p för kommandot docker run:

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

Detta kommando binder port 8080 på din Docker-värd till 80 i din nya behållare. Nu kan du besöka http://localhost:8080 för att komma åt containerns port. Om du kör docker ps ser du att kolumnen PORTS nu visar denna mappning. Den exponerade containerporten 80 har publicerats till värden.

-p-flaggan kan användas utan att ange en port att binda till:

docker run -d -p 80 httpd:latest

Denna variant kommer att binda port 80 i behållaren till en slumpmässig port på värden. Du kan kontrollera porten som har tilldelats genom att köra docker ps.

-p stöder även publicering av en port till specifika nätverksgränssnitt:

docker run -d -p 127.0.0.1:8080:80 httpd:senaste annons

Här kommer containerport 80 endast att vara tillgänglig via port 8080 på värdens lokala loopback-adress. Detta skyddar din behållare från nätverkssamtal från dina andra enheter.

Publicera alla exponerade portar

Du kan starta en behållare med flaggan –publish-all för att få Docker att automatiskt publicera alla exponerade portar som anges i bildens Dockerfile:

docker run -d –publish-all httpd:senaste

Detta kommer att tilldela slumpmässiga lediga portar på din värd till varje exponerad port i behållaren. Använd kommandot docker ps för att se porttilldelningarna som har gjorts. Detta förenklar att starta en ny behållare från en bild som kräver flera icke-standardiserade portar för att öppnas.

Du kan kombinera –publish-all med explicita -p-mappningar. I det här fallet kommer en mappning skapad av en -p-flagga att åsidosätta den slumpmässiga porten som tilldelats av –publish-all.

När du inte behöver publicera en port

Du behöver bara publicera containerportar med -p om du vill komma åt dem från din Docker-värd eller en annan enhet på ditt fysiska nätverk. Docker-nätverk är det alternativa tillvägagångssättet för intercontainertrafik.

Behållare som delar ett nätverk kan alltid kommunicera med varandra, även om deras portar inte har publicerats explicit.

docker-nätverk skapa demo-nätverk docker run -d –nätverk demo-nätverk –namn webb webb: senaste docker körning -d –nätverk demo-nätverk –namn databas databas: senaste Annons

I detta exempel , kan webbbehållaren ansluta till en MySQL-server som körs på port 3306 i databasbehållaren med databasen:3306-adressen. Docker ställer automatiskt upp routningstabeller för behållarnamnen i nätverket.

Använda portintervall

Docker kan exponera och publicera hela portintervall när du behöver ha flera portar tillgängliga:

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

I det första fallet , –publish-all kommer att tilldela 100 slumpmässiga portar på din värd och mappa dem till containerns intervall. Den andra formen binder uttryckligen ett värdområde till ett behållarintervall som normalt. Prestanda kan påverkas om du använder ett mycket stort antal portar eftersom en iptables-regel kommer att skapas för var och en.

Sammanfattning

Exponerade portar är bitar av metadata som definierar portarna som programvaran lyssnar på i en containerbild. Närvaron av exponerade portar gör dem inte tillgängliga om du inte publicerar dem manuellt. I denna mening är verbet “exponera” är en felaktig benämning, eftersom många människor antar att det är en aktiv handling när det i själva verket är ett informationsuttalande. EXPOSE bör behandlas som dokumentation medan -p-flaggan skapar en fungerande portmappning.

Docker tillhandahåller lite extra beteende baserat på EXPOSE-instruktioner. Du kan se en containers exponerade portar med docker-ps oavsett om de har publicerats. Det finns också flaggan –publish-all som publicerar en bilds exponerade portar till slumpmässiga värdportar.

Du behöver bara publicera portar när du vill komma åt en behållare utifrån ett Docker-nätverk. Kommunikation mellan containrar i samma nätverk är alltid ohämmad, oavsett om de inblandade hamnarna har exponerats eller publicerats.