Eksperymentuję z plikami Docker i myślę, że rozumiem większość logiki. Jednak w tym kontekście nie widzę różnicy między „ujawnianiem” a „publikowaniem” portu.
Wszystkie samouczki, które widziałem najpierw, zawierają EXPOSE
polecenie w Dockerfile:
...
EXPOSE 8080
...
Następnie budują obraz z tego pliku Docker:
$ docker build -t an_image - < Dockerfile
A następnie opublikuj ten sam port co powyżej podczas uruchamiania obrazu:
$ docker run -d -p 8080 an_image
lub opublikuj wszystkie porty za pomocą
$ docker run -d -P an_image
Po co ujawniać port w Dockerfile, jeśli i tak zostanie opublikowany? Czy kiedykolwiek będzie trzeba najpierw ujawnić port, a nie opublikować go później? W efekcie chciałbym określić wszystkie porty, które będą używane w Dockerfile podczas tworzenia obrazu, a następnie nie zawracać sobie nimi głowy, uruchamiając je po prostu z:
$ docker run -d an_image
czy to możliwe?
EXPOSE
i-p
, a nie trzy wypunktowania precedented. Trochę mnie to pogubiło.EXPOSE
, ale nie określił-p
. Rozumiem, że jeśli zawsze używasz-p
i uruchamiasz pojedyncze kontenery, możeszEXPOSE
je pominąć, ale staje się ono użyteczne / konieczne przy użyciu-P
lub--link
. (A ponieważ nie wiesz, w jaki sposób inne osoby będą korzystać z Twojego obrazu,EXPOSE
należy to określić we wszystkich publicznych obrazach.)Krótka odpowiedź:
EXPOSE
jest sposobem dokumentowania--publish
(a-p
) jest sposobem odwzorowywania do portu hosta z systemem portu konteneraZauważ, że poniżej:
EXPOSE
jest związany zDockerfiles
( dokumentowanie )--publish
jest związanydocker run ...
( wykonanie / czas działania )Również,
Dostęp do usługi, gdy
EXPOSE
/--publish
nie są zdefiniowane:W odpowiedzi @Golo Roden stwierdzono, że:
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 innecontainers
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:I
build
obraz jako „testexpose” irun
nowy pojemnik z:Wewnątrz kontenera uruchamiam kilka przypadków
mini-httpd
:Jestem w stanie użyć
curl
z hosta lub innych kontenerów, aby pobrać stronę głównąmini-httpd
.źródło
172.17.0.2
) i wszystkich portów, o których mówię. Jeśli korzystasz z Docker na Maca / Windows, sieć jest inna. Nie madocker0
mostu.Zobacz oficjalne odniesienie do dokumentacji: https://docs.docker.com/engine/reference/builder/#expose
EXPOSE
Umożliwiają zdefiniowanie prywatnej (pojemnik) oraz publiczne porty (Host), aby odsłonić obraz w czasie kompilacji, gdy pojemnik jest uruchomiony , jeśli uruchomisz pojemnik-P
.Port publiczny i protokół są opcjonalne, jeśli nie określono portu publicznego, port losowy zostanie wybrany na hoście przez dokera, aby odsłonić określony port kontenera na Dockerfile.
Dobrą praktyką nie jest określanie portu publicznego, ponieważ ogranicza on tylko jeden kontener na host (drugi kontener wyrzuci port już używany).
Możesz użyć
-p
wdocker run
celu kontrolowania, który port publiczny będą dostępne dla odsłoniętych portów kontenerów.W każdym razie, jeśli nie użyjesz
EXPOSE
(z-P
uruchomionym dokerem) ani-p
żadne porty nie zostaną ujawnione.Jeśli zawsze używać
-p
codocker run
nie trzebaEXPOSE
, ale jeśli użyćEXPOSE
Twojegodocker run
polecenia może być bardziej proste,EXPOSE
może być przydatna, jeśli nie obchodzi, co port będzie wystawiać na gospodarza, lub jeśli jesteś pewny tylko jednego pojemnika zostanie załadowany.źródło
Ujawniasz porty za pomocą słowa kluczowego EXPOSE w pliku Docker lub flagi --expose, aby uruchomić okno dokowane. Ujawnianie portów to sposób na udokumentowanie, które porty są używane, ale w rzeczywistości nie mapują ani nie otwierają żadnych portów. Udostępnianie portów jest opcjonalne.
Źródło: github commit
źródło
Większość ludzi korzysta z dokera komponującego w sieci. W dokumentacji czytamy:
Co oznacza, że jeśli używasz sieci do komunikacji między kontenerami, nie musisz się martwić o ujawnienie portów.
źródło
EKSPOZYCJA służy do mapowania portu kontenera portu lokalnego, tj .: jeśli określisz ekspozycję w pliku dokera, takim jak
EXPOSE 8090
Co to zrobi, mapuje port 8090 hosta lokalnego na port kontenera 8090
źródło