Docker에서 "노출"과 "게시"의 차이점은 무엇입니까?



1 Answers

짧은 답변:

  • EXPOSE문서화 방법입니다 .
  • --publish호스트 포트를 컨테이너 포트에 매핑 하는 방법입니다.

다음 간의 연결에 유의하십시오.

  • DockerfileDockerfile
  • --publish 및 실행 시간 ( docker run ... )

포트 노출 및 게시

Docker 네트워킹에는 네트워크 포트와 직접 관련되는 두 가지 메커니즘 (노출 및 게시 포트)이 있습니다. 기본 브리지 네트워크 및 사용자 정의 브리지 네트워크에 적용됩니다.

  • Dockerfile의 EXPOSE 키워드 또는 --expose 플래그를 사용하여 포트를 노출합니다. 포트 노출은 사용되는 포트를 문서화하는 방법이지만 실제로 포트를 매핑하거나 열지는 않습니다. 노출 포트는 선택 사항 입니다.

  • docker run--publish 또는 --publish-all 플래그를 사용하여 포트를 게시 docker run . 이것은 Docker에게 컨테이너의 네트워크 인터페이스에서 열려야하는 포트를 알려줍니다. 포트가 공개되면 런타임시 호스트 시스템에 매핑 할 포트를 지정하지 않으면 호스트 시스템에서 사용 가능한 고 순서 포트 ( 30000 이상)에 매핑됩니다. 포트를 이미지를 실행하는 호스트 시스템에서 사용할 수 있음을 보장 할 방법이 없으므로 이미지를 빌드 할 때 (Dockerfile에서) 호스트 시스템에 맵핑 할 포트를 지정할 수 없습니다 .

출처 : Docker 컨테이너 네트워킹

또한,

폭로

EXPOSE 명령은 실제로 포트를 게시하지 않습니다. 이미지를 만드는 사람과 컨테이너를 실행하는 사람 사이의 문서 유형으로, 어떤 포트가 게시 될 것인지에 대한 기능을 합니다.

from : documentation

EXPOSE / - --publish 가 정의되지 않은 경우 서비스 액세스 :

대답은 다음과 같습니다 :

"당신이 그 중 하나를 지정하지 않으면 , 컨테이너 자체의 내부를 제외한 어디서나 컨테이너의 서비스에 액세스 할 수 없습니다 ."

어쩌면 대답이 쓰여졌을 때의 경우일지도 모르지만 이제는 EXPOSE 또는 - --publish 사용하지 않더라도 동일한 네트워크의 host 와 다른 containers 가 시작할 수있는 서비스에 액세스 할 수 있습니다 그 용기 안에 .

테스트를 위해 다음 Dockerfile 사용했습니다. 기본적으로 우분투에서 시작하여 작은 웹 서버를 설치합니다.

FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd

"testexpose"로 이미지를 build 하고 run 하여 새 컨테이너를 run 합니다.

docker run --rm -it testexpose bash

컨테이너 내부에서 mini-httpd 의 몇 가지 인스턴스를 시작합니다.

root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090

그런 다음 호스트 나 다른 컨테이너에서 curl 을 사용하여 mini-httpd 의 홈 페이지를 가져올 수 있습니다.

Question

나는 Dockerfiles를 실험하고 있는데, 나는 대부분의 논리를 이해하고 있다고 생각한다. 그러나이 컨텍스트에서 포트를 "노출하는"것과 "게시하는"차이점은 없습니다.

필자가 보았던 모든 자습서에는 Dockerfile의 EXPOSE 명령이 포함되어 있습니다.

...
EXPOSE 8080
...

그런 다음이 Dockerfile에서 이미지를 만듭니다.

$ docker build -t an_image - < Dockerfile

그런 다음 이미지를 실행할 때 위와 동일한 포트를 게시 하십시오.

$ docker run -d -p 8080 an_image

다음을 사용하여 모든 포트를 게시하십시오.

$ docker run -d -P an_image

어쨌든 Dockerfile에 포트가 노출되는 지점은 무엇입니까? 항구를 먼저 노출하고 나중에 공개 하지 않아도 됩니까? 효과적으로 이미지를 만들 때 Dockerfile에서 사용할 모든 포트를 지정하고 다시 포트 번호를 지정하지 않고 다음 포트를 사용하여 간단하게 포트를 지정하려고합니다.

$ docker run -d an_image

이것이 가능한가?




대부분의 사람들은 도커가 네트워크로 작성하는 것을 사용합니다. documentation 상태 :

Docker 네트워크 기능은 네트워크 내의 포트를 노출 할 필요없이 네트워크 생성을 지원하므로 자세한 내용은이 기능 개요를 참조하십시오.

즉, 컨테이너 간의 통신을 위해 네트워크를 사용하는 경우 포트 노출에 대해 걱정할 필요가 없습니다.






Related



Tags

docker docker