docker - 통신 - 리눅스 컨테이너




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

포트

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

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

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

폭로

노출은 문서입니다. 이미지 및 컨테이너에서 메타 데이터를 설정합니다. 일반적으로 EXPOSE 명령을 사용하여 Dockerfile에서이를 구성하고 이미지를 실행하는 사용자를위한 문서 역할을하며 기본적으로 애플리케이션이 청취 할 포트를 알 수 있습니다. 작성 파일로 구성하면이 메타 데이터는 컨테이너에서만 설정됩니다. 이미지 또는 컨테이너에서 docker inspect 를 실행할 때 노출 된 포트를 볼 수 있습니다.

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

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

docker-compose.yml 에서 portsexpose 옵션의 차이점은 무엇입니까 docker-compose.yml


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

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

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


포트 :

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

노출 :

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


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

ports:
   - 10005:80

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

참고 : 외부 엔티티가 애플리케이션에 액세스 할 수 있도록 호스트 포트 10005를 열고 방화벽 규칙을 수정해야합니다.

그들은 사용할 수 있습니다

http : // {host IP} : 10005

이 같은

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

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





docker-compose