Krótka odpowiedź:
EXPOSE
jest sposobem dokumentowania
--publish
(a -p
) jest sposobem odwzorowywania do portu hosta z systemem portu kontenera
Zauważ, że poniżej:
EXPOSE
jest związany z Dockerfiles
( dokumentowanie )
--publish
jest związany docker run ...
( wykonanie / czas działania )
Ujawnianie i publikowanie portów
W sieci Docker istnieją dwa różne mechanizmy, które bezpośrednio dotyczą portów sieciowych: ujawnianie i publikowanie portów. Dotyczy to domyślnej sieci mostów i sieci mostów zdefiniowanych przez użytkownika.
EXPOSE
Udostępniasz porty za pomocą słowa kluczowego w pliku Docker lub --expose
flagi do uruchomienia dokera . Ujawnianie portów to sposób na udokumentowanie używanych portów, ale w rzeczywistości nie mapuje ani nie otwiera żadnych portów . Udostępnianie portów jest opcjonalne.
Porty publikujesz za pomocą flagi --publish
lub --publish-all
do docker run
. To informuje Dockera, które porty należy otworzyć w interfejsie sieciowym kontenera. Kiedy port jest publikowany, jest mapowany na dostępny port wyższego rzędu (wyższy niż 30000
) na maszynie hosta, chyba że określisz port do mapowania na maszynie hosta w czasie wykonywania. Nie można określić portu do mapowania na komputerze hosta podczas tworzenia obrazu (w pliku Docker), ponieważ nie ma sposobu, aby zagwarantować, że port będzie dostępny na komputerze hosta, na którym uruchomiono obraz .
from: Docker networking networking
Aktualizacja z października 2019 r . : powyższego tekstu nie ma już w dokumentach, ale dostępna jest jego zarchiwizowana wersja: docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publishing-ports
Być może aktualna dokumentacja jest następująca:
Opublikowane porty
Domyślnie podczas tworzenia kontenera nie publikuje on żadnych swoich portów w świecie zewnętrznym. Aby udostępnić port usługom poza Docker lub kontenerom Docker, które nie są podłączone do sieci kontenera, użyj flagi --publish
lub -p
. Spowoduje to utworzenie reguły zapory, która mapuje port kontenera na port na hoście Docker.
i można je znaleźć tutaj: docs.docker.com/config/containers/container-networking/#published-ports
Również,
EXPOSE
... EXPOSE
Instrukcja faktycznie nie publikuje portu . Działa jako rodzaj dokumentacji między osobą, która buduje obraz, a osobą, która zarządza kontenerem, o których portach ma zostać opublikowana.
from: Odwołanie do pliku Dockerfile
Dostęp do usługi, gdy EXPOSE
/ --publish
nie są zdefiniowane:
W odpowiedzi @Golo Roden stwierdzono, że:
„Jeśli nie określisz żadnego z nich, usługa w kontenerze będzie niedostępna z dowolnego miejsca, z wyjątkiem samego kontenera”.
Być może tak było w czasie, gdy pisano odpowiedź, ale teraz wydaje się, że nawet jeśli nie używasz EXPOSE
lub --publish
, host
i inne containers
z tej samej sieci będą mogły uzyskać dostęp do usługi, którą możesz uruchomić w tym kontenerze.
Jak to przetestować:
Użyłem następujących Dockerfile
. Zasadniczo, zaczynam od Ubuntu i instaluję mały serwer WWW:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
I build
obraz jako „testexpose” i run
nowy pojemnik z:
docker run --rm -it testexpose bash
Wewnątrz kontenera uruchamiam kilka przypadków mini-httpd
:
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
Jestem w stanie użyć curl
z hosta lub innych kontenerów, aby pobrać stronę główną mini-httpd
.