Dockerfile에서 EXPOSE를 사용하는 이유 — 모든 포트에 바인딩 할 수 있기 때문에


23

컨테이너에 해당 포트를 연결 docker run -p 3000:3000 image 하지 않고 할 수 있습니다 EXPOSE(아래 참조). 그것이 사실이라면 왜 EXPOSE를 Dockerfile에 넣는 것을 귀찮게합니까? 이미지 사용자와의 커뮤니케이션만을위한 것입니까? 어쨌든 EXPOSE 포트가 모두 바인딩 가능한 경우 기능상의 이유를 알 수 없기 때문입니다.


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!


$

답변:


29

Docker의 EXPOSE 설명서는 다음과 같은 특정 사항을 다룹니다.

EXPOSE명령은 실제로 포트를 게시하지 않습니다. 이미지를 작성하는 사람과 컨테이너를 실행하는 사람 사이에서 공개 할 포트에 대한 문서 유형으로 작동합니다. 컨테이너를 실행할 때 실제로 포트를 게시하려면 -p플래그를 사용하여 docker run하나 이상의 포트를 게시 및 매핑하거나 -P플래그를 사용하여 노출 된 모든 포트를 게시하고 상위 포트에 매핑하십시오.

마지막 포트에주의를 기울이십시오. 여러 포트를 노출 한 경우 명령 행에서 여러 포트를 -P설정하지 않는 것이 -p좋습니다.


"문서"는 이미지 메타 데이터 형식입니다. -P플래그 에 유용 할뿐만 아니라 다른 유틸리티는이 메타 데이터에 대해 실행중인 컨테이너를 쿼리 할 수 ​​있습니다. 이는 노출 된 포트를 기본값으로 사용하여 전달 규칙을 동적으로 업데이트하는 프록시에 유용합니다.
BMitch

@BMitch 절대적으로, 그것이 OP에 아직 유용하지 않은 관련 정보라고 생각했지만 자유롭게 편집 할 수 있습니다.
Tensibai

에 노출 문서입니다
井上智文

4

이것은 자동화를 위해 수행됩니다. docker run -P컨테이너를 시작하기 위해 실행되는 범용 명령을 가질 수 있으며 Dockerfile 자체는 어떤 컨테이너가 어떤 포트를 노출하는지 지정하는 데 사용됩니다. 파이프 라인을 통해 구축되는 수십 또는 수백 개의 컨테이너를 처리하는 경우 매우 유용합니다. Dockerfile에 포함되지 않은 외부 세부 정보를 컨테이너와 함께 파이프 라인을 통해 단계별로 전달하는 것은 매우 어렵습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.