컨테이너에 해당 포트를 연결 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!
$
-P
플래그 에 유용 할뿐만 아니라 다른 유틸리티는이 메타 데이터에 대해 실행중인 컨테이너를 쿼리 할 수 있습니다. 이는 노출 된 포트를 기본값으로 사용하여 전달 규칙을 동적으로 업데이트하는 프록시에 유용합니다.