도커에서 "노출"과 "공개"의 차이점은 무엇입니까?
저는 도커 파일로 실험을 하고 있는데, 대부분의 논리를 이해한다고 생각합니다.그러나 이러한 맥락에서 포트를 "공개"하는 것과 "게시"하는 것의 차이는 보이지 않습니다.
처음 본 모든 튜토리얼은 다음이 포함되어 있습니다.EXPOSE
Docker 파일의 명령:
...
EXPOSE 8080
...
그런 다음 다음 다음 도커 파일에서 이미지를 만듭니다.
$ docker build -t an_image - < Dockerfile
그런 다음 이미지를 실행할 때 위와 동일한 포트를 게시합니다.
$ docker run -d -p 8080 an_image
또는 다음을 사용하여 모든 포트 게시
$ docker run -d -P an_image
도커 파일에서 포트가 게시될 경우 포트를 노출하는 이유는 무엇입니까?포트를 먼저 노출하고 나중에 게시하지 않을 필요가 있습니까?이미지를 생성할 때 Docker 파일에서 사용할 모든 포트를 지정한 후 다음과 같이 간단하게 실행하여 다시 사용할 포트를 지정하고 싶습니다.
$ docker run -d an_image
이것이 가능합니까?
기본적으로 세 가지 옵션이 있습니다.
- 다 지하않을 지정하지 .
EXPOSE
도 아니다-p
- 만 합니다.
EXPOSE
- 를 지정합니다.
EXPOSE
그리고.-p
- 만 합니다.
-p
암시적으로 하는 것은.EXPOSE
다 하지 않은
EXPOSE
도 아니다-p
컨테이너 내부의 서비스는 컨테이너 내부에서만 액세스할 수 있습니다.네가 만약
EXPOSE
포트, 컨테이너 내 서비스는 도커 외부에서 액세스할 수 없지만 다른 도커 컨테이너 내부에서 액세스할 수 있습니다.따라서 컨테이너 간 통신에 적합합니다.네가 만약
EXPOSE
그리고.-p
포트, 컨테이너 내 서비스는 도커 외부에서도 어디서나 액세스할 수 있습니다.네가 한다면.
-p
하지만 하지 마EXPOSE
도커가 암시적으로 합니다.EXPOSE
포트가 일반에 열려 있으면 다른 도커 컨테이너에도 자동으로 열려 있기 때문입니다.이런 이유로-p
를 포함합니다.EXPOSE
이는 사실상 3)과 동일합니다.
둘 다 분리된 이유는 IMHO 때문입니다.
- 호스트 포트 선택은 호스트에 따라 다르므로 Docker 파일에 속하지 않습니다(그렇지 않으면 호스트에 따라 다름).
- 또한 컨테이너의 서비스가 다른 컨테이너에서 액세스할 수 있는 경우에도 충분합니다.
설명서에는 다음이 명시되어 있습니다.
그
EXPOSE
명령은 링크 내에서 사용할 포트를 표시합니다.
또한 컨테이너를 연결하는 방법(레거시 기능)도 알려주는데, 기본적으로 제가 말씀드린 컨테이너 간 통신입니다.
단답:
EXPOSE
를 문서화하는 방법입니다.--publish
(또는)-p
)는 호스트 포트를 실행 중인 컨테이너 포트에 매핑하는 방법입니다.
아래의 주의 사항:
EXPOSE
와 .Dockerfiles
(문서화)--publish
와 .docker run ...
(실행 / 런타임)
포트 노출 및 게시
도커 네트워킹에서는 네트워크 포트와 직접 관련된 두 가지 메커니즘, 즉 포트 노출 및 게시가 있습니다.이는 기본 브리지 네트워크 및 사용자 정의 브리지 네트워크에 적용됩니다.
는 사하여노다를 합니다.
EXPOSE
파일 파일의--expose
플래그에서 도커 실행.포트 노출은 사용되는 포트를 문서화하는 방법이지만 실제로 포트를 매핑하거나 열지는 않습니다.포트 노출은 선택 사항입니다.는 사하여게다를 합니다.
--publish
또는--publish-all
에 깃발을 내미는.docker run
컨테이너의 네트워크 인터페이스에서 열 포트를 도커에 알려줍니다.포트에 ("에.30000
런타임에 호스트 시스템에서 매핑할 포트를 지정하지 않는 한 호스트 시스템에서 ).이미지를 빌드할 때(도커 파일) 호스트 시스템에서 매핑할 포트를 지정할 수 없습니다. 이미지를 실행하는 호스트 시스템에서 포트를 사용할 수 있는지 보장할 방법이 없기 때문입니다.원본:
도커 컨테이너 네트워킹2019년 10월 업데이트: 위의 텍스트는 더 이상 문서에 없지만 보관된 버전은 여기에 있습니다. docs.docker.com/v17.09/engine/userguide/networking/ #delay-and-delay-ports
현재 문서는 다음과 같습니다.
게시된 포트
기본적으로 컨테이너를 생성할 때 컨테이너는 해당 포트를 외부에 게시하지 않습니다.를 사용할 수 있도록 , 「 」를 합니다.
--publish
또는-p
플래그. 컨테이너 포트를 도커 호스트의 포트에 매핑하는 방화벽 규칙을 만듭니다.다음 사이트에서 확인할 수 있습니다. docs.docker.com/config/containers/container-networking/ #http-ports
또한.
노출
...더...더...더...더...더...더.
EXPOSE
명령이 실제로 포트를 게시하지 않습니다.이미지를 빌드하는 사용자와 컨테이너를 실행하는 사용자 간에 게시할 포트에 대한 문서 유형으로 작동합니다.원본: 도커 파일 참조
과 같은 경우 :EXPOSE
/--publish
정의되지 않음:
@Golo Roden의 대답은 다음과 같습니다.
"이러한 항목을 지정하지 않으면 컨테이너 내부를 제외하고는 컨테이너 내의 서비스에 액세스할 수 없습니다."
아마도 그 당시에는 답이 쓰여지고 있었을 것이지만, 지금은 당신이 사용하지 않더라도 그렇게 보입니다.EXPOSE
또는--publish
,host
타기containers
동일한 네트워크의 경우 해당 컨테이너 내에서 시작할 수 있는 서비스에 액세스할 수 있습니다.
테스트 방법:
의 다을사습다니를 Dockerfile
기본적으로 unbuntu에서 시작하여 작은 웹 서버를 설치합니다.
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
I build
를 " 노출" 및 "테스트 로 표시합니다.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
.
진일보한 내용
이반 페펠른작의 이 주제에 대한 매우 상세한 기사들:
공식 설명서 참조: https://docs.docker.com/engine/reference/builder/ #http://# 를 참조하십시오.
그EXPOSE
에서 컨테이너를 실행하는 경우 컨테이너가 실행 중일 때 이미지 빌드 시 노출할 개인(호스트) 포트 및 공용(호스트) 포트를 정의할 수 있습니다.-P
.
$ docker help run
...
-P, --publish-all Publish all exposed ports to random ports
...
공용 포트 및 프로토콜은 선택 사항이며, 공용 포트가 지정되지 않은 경우 도커가 호스트에서 임의 포트를 선택하여 도커 파일의 지정된 컨테이너 포트를 노출시킵니다.
호스트당 하나의 컨테이너만 제한하므로 공용 포트를 지정하지 않는 것이 좋습니다(두 번째 컨테이너는 이미 사용 중인 포트를 던집니다).
사용할 수 있습니다.-p
docker run
노출된 컨테이너 포트를 연결할 수 있는 공용 포트를 제어합니다.
어쨌든, 만약 당신이 사용하지 않는다면.EXPOSE
(와 함께)-P
주행 시) 도커 주행 시-p
포트가 노출되지 않습니다.
당신이 항상 경우는하용사를 한다면.-p
docker run
은 필요없다니가 필요하지 .EXPOSE
하지만 만약 당신이 사용한다면.EXPOSE
당신의.docker run
은 더할 수 .EXPOSE
호스트에서 노출되는 포트가 무엇이든 상관없거나 하나의 컨테이너만 로드되는 경우 유용할 수 있습니다.
도커 파일의 EXPLE 키워드 또는 --exposure 플래그를 사용하여 도커 실행에 포트를 노출할 수 있습니다.포트 노출은 사용되는 포트를 문서화하는 방법이지만 실제로 포트를 매핑하거나 열지는 않습니다.포트 노출은 선택 사항입니다.
소스: github 커밋
대부분의 사람들은 네트워크와 함께 도커 컴포지트를 사용합니다.설명서에는 다음이 명시되어 있습니다.
도커 네트워크 기능은 네트워크 내에서 포트를 노출할 필요 없이 네트워크를 생성할 수 있도록 지원합니다. 자세한 내용은 이 기능의 개요를 참조하십시오.
즉, 컨테이너 간의 통신에 네트워크를 사용하는 경우 포트 노출에 대해 걱정할 필요가 없습니다.
EXPLOESS 키워드를 사용하면 소유자가 컨테이너에서 주로 사용할 포트를 다른 사용자에게 알릴 수 있습니다.
노출에 포트를 지정하지 않더라도 모든 포트를 게시할 수 있습니다.
예를 들어 포트 1234를 노출하는 nginx 이미지로 도커 파일을 생성합니다.
FROM nginx:latest
EXPOSE 1234
그리고 그것을 구축합니다.
도커 빌드 - t 포트 테스트.
80 포트를 localhost:80에 게시하여 실행합니다.
도커 실행 -p 80:80 포트 테스트
localhost:80으로 이동하면 nginx 기본 페이지가 나타납니다.Nginx 기본 페이지
- 노출 - 특정 포트만 컨테이너와 연결할 수 있으며 "컨테이너 간 통신"으로만 사용됩니다.
- -p(publish )는 호스트 포트를 컨테이너 포트(1단계 또는 도커 파일에서 이미 노출됨)와 매핑하며, 노출되면 해당 포트를 매핑하여 게시를 사용하도록 해야 합니다. 그러면 해당 포트는 월드/인터넷 외부의 컨테이너에 액세스합니다.
EXPLE은 로컬 포트 컨테이너 포트를 매핑하는 데 사용됩니다. 도커 파일에서 다음과 같이 노출을 지정하는 경우
EXPOSE 8090
localhost 포트 8090을 컨테이너 포트 8090에 매핑하는 방법은 무엇입니까?
언급URL : https://stackoverflow.com/questions/22111060/what-is-the-difference-between-expose-and-publish-in-docker
'source' 카테고리의 다른 글
숫자가 나올 때까지 타임리프 루프 (0) | 2023.08.05 |
---|---|
Swift의 UIViewController에서 기본 super.init()를 호출할 수 없는 이유는 무엇입니까? (0) | 2023.08.05 |
회로 차단기와 벌크헤드 패턴의 차이점은 무엇입니까? (0) | 2023.08.05 |
IPython 종료 확인 사용 안 함 (0) | 2023.08.05 |
web.config asp.net 의 오라클 데이터베이스 연결 (0) | 2023.07.31 |