Po co używać EXPOSE w Dockerfile - skoro i tak można powiązać wszystkie porty

23

Mogę docker run -p 3000:3000 image bez wprowadzania EXPOSE tego portu w kontenerze (patrz poniżej). Jeśli to prawda, to po co zawracać sobie głowy umieszczaniem EKSPOZYCJI w Dockerfile? Czy służy to wyłącznie komunikacji z użytkownikami obrazów? Ponieważ nie znam funkcjonalnego powodu na EKSPOZYCJĘ portów, jeśli i tak można je przypisać.


Oto kroki pokazujące mi powiązanie z portem w kontenerze, mimo że nie jest to EXPOSEd

$ cat Dockerfile
FROM alpine
RUN apk add nodejs npm vim
COPY webserver /webserver
CMD [ "node", "/webserver/index.js" ]


$ docker build .
Sending build context to Docker daemon  1.931MB
Step 1/4 : FROM alpine
 ---> 11cd0b38bc3c
Step 2/4 : RUN apk add nodejs npm vim
 ---> Using cache
 ---> 4270f8bdb201
Step 3/4 : COPY webserver /webserver
 ---> Using cache
 ---> 67f4cda61ff0
Step 4/4 : CMD [ "node", "/webserver/index.js" ]
 ---> Using cache
 ---> 1df8f9024b85
Successfully built 1df8f9024b85


$ curl localhost:4400
curl: (7) Failed to connect to localhost port 4400: Connection refused


$ docker run -d -p 4400:3000 1df8f9024b85
7d0e6c56f8ad8827fe72830a30c1aac96821104b8ea111291ca39e6536aad8fd


$ curl localhost:4400
Hello World!


$
Alexander Bird
źródło

Odpowiedzi:

29

Docker jest EXPOSE dokumentacyjne rozwiązuje ten konkretny punkt:

EXPOSEInstrukcja 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. Aby faktycznie opublikować port podczas uruchamiania kontenera, użyj -pflagi on, docker runaby opublikować i zamapować jeden lub więcej portów, lub -Pflagi, aby opublikować wszystkie odsłonięte porty i zamapować je na porty wysokiego poziomu.

Zwróć uwagę na ostatnie zdanie, jeśli ujawnisz wiele portów, wówczas -Pprzydatne będzie uniknięcie ustawiania wielu portów -pw linii poleceń.

Tensibai
źródło
„Dokumentacja” ma postać metadanych obrazu. Oprócz użyteczności dla -Pflagi, inne narzędzia mogą sprawdzać działające kontenery dla tych metadanych, co jest przydatne w serwerach proxy, które dynamicznie aktualizują swoje reguły przekazywania, używając tych domyślnych portów.
BMitch
@Bitch absolutnie, czułem, że była to obca informacja, która nie była jeszcze przydatna dla OP, ale możesz ją edytować.
Tensibai
EKSPOZYCJA
4

Odbywa się to ze względu na automatyzację. Możesz mieć uniwersalne polecenie uruchamiające się w docker run -Pcelu uruchomienia kontenera, a sam plik Docker służy do określania, który kontener ujawnia który port. W przypadku, gdy masz do czynienia z dziesiątkami lub setkami kontenerów budowanych przez rurociąg, jest to bardzo przydatne. Przekazywanie zewnętrznych detali nie zawartych w Dockerfile wraz z kontenerem przez rurociąg z jednego etapu na drugi jest dość trudne w skali.

Jiri Klouda
źródło