짧은 답변:
EXPOSE
문서화 하는 방법입니다
--publish
(나 -p
)의 방법 으로 매핑 호스트 포트를 실행에 컨테이너 포트
아래에 주목하십시오 :
EXPOSE
관련 Dockerfiles
( 문서화 )
--publish
관련 docker run ...
( 실행 / 런타임 )
포트 노출 및 게시
Docker 네트워킹에는 네트워크 포트를 직접 포함하는 두 가지 메커니즘, 즉 포트 노출 및 게시가 있습니다. 이는 기본 브리지 네트워크 및 사용자 정의 브리지 네트워크에 적용됩니다.
EXPOSE
Dockerfile 의 키워드 또는 --expose
docker run 의 플래그를 사용하여 포트를 노출 합니다. 포트 노출 은 사용되는 포트 를 문서화 하는 방법 이지만 실제로 포트를 매핑하거나 열지는 않습니다 . 포트 노출은 선택 사항입니다.
--publish
또는 --publish-all
플래그를 사용하여 포트를 게시 합니다 docker run
. 이것은 Docker에게 컨테이너의 네트워크 인터페이스에서 열 포트를 알려줍니다. 포트가 게시 될 때 30000
런타임에 호스트 시스템에 매핑 할 포트를 지정하지 않는 한 포트는 호스트 시스템에서 사용 가능한 상위 포트 (보다 큼 )에 매핑됩니다. 이미지를 빌드 할 때 (Dockerfile에서) 이미지를 실행하는 호스트 시스템에서 포트를 사용할 수 있는지 보장 할 방법 이 없기 때문에 호스트 시스템에서 맵핑 할 포트를 지정할 수 없습니다 .
from : 도커 컨테이너 네트워킹
2019 년 10 월 업데이트 : 위의 텍스트는 더 이상 문서에 없지만 보관 된 버전은 다음과 같습니다. docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publishing-ports
현재 문서는 다음과 같습니다.
게시 된 포트
기본적으로 컨테이너를 만들면 해당 컨테이너의 포트가 외부에 게시되지 않습니다. Docker 외부의 서비스 또는 컨테이너 네트워크에 연결되지 않은 Docker 컨테이너에서 포트를 사용 가능하게하려면 --publish
또는 -p
플래그를 사용하십시오 . 컨테이너 포트를 Docker 호스트의 포트에 매핑하는 방화벽 규칙을 만듭니다.
docs.docker.com/config/containers/container-networking/#published-ports 에서 찾을 수 있습니다.
또한,
폭로
... EXPOSE
명령 은 실제로 포트를 게시하지 않습니다 . 이미지를 작성하는 사람과 컨테이너를 실행하는 사람 사이에서 공개 할 포트에 대한 문서 유형으로 작동합니다.
from : Dockerfile 참조
EXPOSE
/ --publish
가 정의되지 않은 경우 서비스 액세스 :
에서 @Golo 로덴의 대답은 그것은 것을 주장한다 ::
"이 중 하나를 지정하지 않으면 컨테이너 내부의 서비스를 제외하고는 컨테이너의 서비스에 액세스 할 수 없습니다."
어쩌면 답이 기록되는 당시 사건이었다,하지만 지금은 사용하지 않는 경우에도 것 같습니다 EXPOSE
또는 --publish
의 host
다른 containers
같은 네트워크의 사용자가 해당 컨테이너 안에 시작할 수있는 서비스에 액세스 할 수 있습니다.
이것을 테스트하는 방법 :
나는 다음을 사용했다 Dockerfile
. 기본적으로 우분투로 시작하여 작은 웹 서버를 설치합니다.
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
나는 build
"testexpose"라는 이미지 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
있습니다.