도커 작성 포트와 노출의 차이점은 무엇입니까?


답변:


527

받는 따르면 고정 표시기-작성 기준 ,

포트 는 다음과 같이 정의됩니다.

포트를 노출하십시오 . 두 포트 (HOST : CONTAINER)를 지정하거나 컨테이너 포트만 지정하십시오 (임의 호스트 포트가 선택됨).

  • docker-compose.yml에 언급 된 포트는 docker-compose가 시작한 여러 서비스간에 공유됩니다.
  • 포트는 호스트 시스템의 임의 포트 또는 지정된 포트에 노출됩니다.

docker-compose.yml모습은 :

mysql:
  image: mysql:5.7
  ports:
    - "3306"

내가 docker-compose ps하면 다음과 같습니다.

  Name                     Command               State            Ports
-------------------------------------------------------------------------------------
  mysql_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:32769->3306/tcp

노출 은 다음과 같이 정의됩니다.

호스트 컴퓨터에 포트를 게시하지 않고 포트를 노출합니다. 링크 된 서비스에만 액세스 할 수 있습니다. 내부 포트만 지정할 수 있습니다.

포트는 호스트 시스템에 노출되지 않으며 다른 서비스에만 노출됩니다.

mysql:
  image: mysql:5.7
  expose:
    - "3306"

내가 docker-compose ps하면 다음과 같습니다.

  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp

24
지정에이 어떤 장점을 설명 에토 가능할 것이다 exposeA의 docker-compose? 내가 알 수있는 한, 링크 된 서비스에서 포트에 액세스 할 수 있도록 노출을 지정하지 않아도됩니다.
수분이 많은

3
노출 된 포트는 동일한 도커 네트워크의 서비스에서만 사용할 수 있다고 말해서는 안됩니다 (대부분의 경우 링크가 교체됩니다).
meow

8
@Juicy Dockerfiles와 비슷하다고 생각합니다 expose. "EXPOSE 명령어는 실제로 포트를 게시하지 않습니다. 문서 유형으로 작동합니다 ..." docs.docker.com/engine/reference/builder/#expose
tsauerwein

1
방화벽 수준에서 포트가 설정을 재정의합니까? 방금 방화벽에서 mysql의 포트를 열지 않았지만 원격으로 액세스 할 수 있음을 알았습니다. 노출 대신 포트를 "3306 : 3306"으로 설정했습니다.
TekiusFanatikus

3
를 사용하는 경우 기본적으로 docker-compose run포트 정의 docker-compose.yml무시 됩니다. docker-compose up매개 변수를 사용 하거나 제공하십시오--service-ports
Juha Untinen

177

포트 :

  1. 컨테이너를 활성화하여 도커 외부의 세계 (동일한 호스트 컴퓨터 또는 다른 컴퓨터 일 수 있음) 및 도커 내부의 액세스 가능한 세계에서 지정된 포트를 수신합니다.
  2. 둘 이상의 포트를 지정할 수 있습니다 ( 포트포트가 아닌 이유 )

여기에 이미지 설명을 입력하십시오

노출 :

  1. 컨테이너를 활성화하여 도커 내부의 세계에서만 특정 포트를 수신하고 도커 외부에서는 액세스 할 수없는 세계를 수신합니다.
  2. 하나 이상의 포트를 지정할 수 있습니다

여기에 이미지 설명을 입력하십시오


3
노출 것을 참고 여러 개의 포트를 허용 - docs.docker.com/compose/compose-file/#expose - 그러나 당신은 단지 내부 포트가 아닌 외부 + 내부 공급
스튜어트 무어

하지만 컨테이너에서 외부 세계에 액세스하려면 어떻게해야합니까? stackoverflow.com/questions/61322256/…
gstackoverflow

25

포트이 섹션은 호스트 서버와 Docker 컨테이너 간의 매핑을 정의하는 데 사용됩니다.

ports:
   - 10005:80

컨테이너 내부에서 실행되는 응용 프로그램이 포트 80에 노출되어 있음을 의미하지만 외부 시스템 / 엔터티가 액세스 할 수 없으므로 호스트 서버 포트에 매핑해야합니다.

참고 : 외부 엔터티가 응용 프로그램에 액세스 할 수 있도록 호스트 포트 10005를 열고 방화벽 규칙을 수정해야합니다.

그들은 사용할 수 있습니다

http : // {host IP} : 10005

이 같은

EXPOSE 독점적으로 도커 컨테이너 내에서 애플리케이션이 실행되는 포트를 정의하는 데 사용됩니다.

dockerfile에서도 정의 할 수 있습니다. 일반적으로 dockerfile 내부에서 EXPOSE를 정의하는 것이 좋고 널리 사용되는 방법입니다.


19

포트

ports섹션은 호스트에 포트를 게시합니다. Docker는 호스트 네트워크에서 컨테이너로 특정 포트에 대한 전달을 설정합니다. 기본적으로 이것은 docker-proxy첫 번째 포트에서 수신 대기하고 컨테이너로 전달 하는 사용자 공간 프록시 프로세스 ( ) 로 구현되며 , 두 번째 지점에서 수신 대기해야합니다. 컨테이너가 대상 포트에서 수신 대기하지 않는 경우 여전히 호스트에서 수신 대기하는 것이 표시되지만 해당 호스트 포트에 연결하려고 시도하면 컨테이너에 대한 전달 실패에서 연결이 거부됩니다.

이 프록시는 컨테이너의 네트워크 네임 스페이스 내에서 실행되고 있지 않으며 컨테이너 내에서 127.0.0.1에 도달 할 수 없으므로 컨테이너는 모든 네트워크 인터페이스에서 수신 대기해야합니다. 이를위한 IPv4 방법은 응용 프로그램이 수신 대기하도록 구성하는 것입니다 0.0.0.0.

또한 게시 된 포트는 반대 방향으로 작동하지 않습니다. 포트를 게시하여 컨테이너에서 호스트의 서비스에 연결할 수 없습니다. 대신 이미 사용중인 호스트 포트를 수신하려는 도커 오류가 있습니다.

폭로

노출은 문서입니다. 이미지 및 컨테이너에서 메타 데이터를 설정합니다. 일반적으로 Dockerfile에서 EXPOSE지시 사항 과 함께 이것을 구성 하고 이미지를 실행하는 사용자를위한 문서 역할을하며 기본적으로 응용 프로그램이 수신 할 포트를 알 수 있습니다. 작성 파일로 구성하면이 메타 데이터는 컨테이너에서만 설정됩니다. docker inspect이미지 또는 컨테이너에서 를 실행할 때 노출 된 포트를 볼 수 있습니다 .

노출 된 포트에 의존하는 몇 가지 도구가 있습니다. 도커에서 -P플래그는 노출 된 모든 포트를 호스트의 임시 포트에 게시합니다. 컨테이너 포트를 명시 적으로 설정하지 않은 경우 애플리케이션에 트래픽을 전송할 때 노출 된 포트를 사용하도록 기본 설정되는 다양한 리버스 프록시도 있습니다.

이러한 외부 도구 이외의 노출은 컨테이너 간의 네트워킹에 전혀 영향을 미치지 않습니다. 한 컨테이너에서 다른 컨테이너에 액세스하려면 공통 도커 네트워크와 컨테이너 포트에 연결하기 만하면됩니다. 해당 네트워크를 사용자가 만든 경우 (예 : 기본 브리지 네트워크가 아닌 bridge) DNS를 사용하여 다른 컨테이너에 연결할 수 있습니다.


3

나는 전에 답변에 전적으로 동의합니다. 노출과 포트의 차이점이 docker의 보안 개념의 일부라고 언급하고 싶습니다. 도커 의 네트워킹 과 밀접한 관련이 있습니다. 예를 들면 다음과 같습니다.

웹 프론트 엔드와 데이터베이스 백엔드가있는 애플리케이션을 상상해보십시오. 외부 세계는 웹 프론트 엔드 (아마 포트 80)에 액세스해야하지만 백엔드 자체 만 데이터베이스 호스트 및 포트에 액세스해야합니다. 사용자 정의 브리지를 사용하면 웹 포트만 열면되며 웹 프런트 엔드는 사용자 정의 브리지를 통해 포트에 연결할 수 있으므로 데이터베이스 응용 프로그램은 포트를 열 필요가 없습니다.

도커에서 네트워크 아키텍처를 설정할 때 일반적인 사용 사례입니다. 예를 들어 기본 브리지 네트워크에서는 외부 세계에서 포트에 액세스 할 수 없습니다. 따라서 "포트"를 사용하여 진입 점을 열 수 있습니다. "노출"을 사용하면 네트워크 내에서 통신을 정의 할 수 있습니다. 기본 포트를 노출하려면 docker-compose 파일에서 "노출"을 정의 할 필요가 없습니다.

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