programing

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

bestprogram 2023. 8. 15. 11:20

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

사이의 차이점은 무엇입니까?ports그리고.exposedocker-compose.yml?

도커-구성 참조에 따르면,

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

포트를 노출합니다.포트(호스트:컨테이너)를 모두 지정하거나 컨테이너 포트(임의 호스트 포트가 선택됨)만 지정합니다.

  • 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

편집

도커 파일의 최신 버전에서는EXPOSE더 이상 운영에 영향을 미치지 않습니다. 정보를 제공할 뿐입니다.(참고 항목)

포트:

  1. 컨테이너를 활성화하여 도커 외부의 지정된 포트(같은 호스트 시스템 또는 다른 시스템일 수 있음)와 도커 내부의 액세스 가능한 월드를 수신합니다.
  2. 둘 이상의 포트를 지정할 수 있습니다(이 때문에 포트가 포트가 아님).

enter image description here

노출:

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

enter image description here

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

ports:
   - 10005:80

즉, 컨테이너 내부에서 실행 중인 애플리케이션이 포트 80에서 노출됩니다.그러나 외부 시스템/엔티티가 액세스할 수 없으므로 호스트 서버 포트에 매핑해야 합니다.

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

사용할 수 있습니다.

http://{host IP}:10005

이와 같은 것

노출 도커 컨테이너 내부에서 응용 프로그램이 실행 중인 포트를 정의하는 데만 사용됩니다.

도커 파일에서도 정의할 수 있습니다.일반적으로 도커 파일 내부에 EXPLE을 정의하는 것이 좋으며 널리 사용되는 방법은 기본 80 포트가 아닌 다른 포트에서 실행하는 경우가 매우 드물기 때문입니다.

포트

ports섹션에서 호스트의 포트를 게시합니다.도커는 호스트 네트워크에서 컨테이너로 특정 포트에 대한 포워딩을 설정합니다. 프로세스사용자 공간 프록시 프로세스)로됩니다.docker-proxy첫 번째 포트에서 수신하고 두 번째 포인트에서 수신해야 하는 컨테이너로 전달합니다.컨테이너가 대상 포트에서 수신 중이 아닌 경우에도 호스트에서 수신 중인 무언가를 볼 수 있지만, 실패한 전달에서 컨테이너로 해당 호스트 포트에 연결하려고 하면 연결이 거부됩니다.

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

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

노출

노출은 설명서입니다.이미지에 메타데이터를 설정하고 실행 시 컨테이너에도 메타데이터를 설정합니다.에서 Docker 파일을 합니다.EXPOSE사용자가 기본적으로 응용 프로그램이 수신 중인 포트를 알 수 있도록 이미지를 실행하는 사용자를 위한 설명서 역할을 합니다.작성 파일로 구성된 경우 이 메타데이터는 컨테이너에서만 설정됩니다.를실 면노포볼수있다습니트를 할 수 .docker inspect이미지 또는 용기에 표시됩니다.

노출된 포트에 의존하는 몇 가지 도구가 있습니다.도커에서,-Pflag는 노출된 모든 포트를 호스트의 사용 후 삭제 포트에 게시합니다.또한 컨테이너 포트를 명시적으로 설정하지 않으면 응용 프로그램에 트래픽을 보낼 때 노출된 포트를 사용하도록 기본 설정되는 다양한 역방향 프록시가 있습니다.

이러한 외부 도구를 제외하고 노출은 컨테이너 간 네트워킹에 전혀 영향을 미치지 않습니다.하나의 컨테이너에 다른 컨테이너에서 액세스하려면 공통 도커 네트워크와 컨테이너 포트에 연결만 하면 됩니다.에 의해된 경우 기본 이 "" " " " " " " (" " " " " " " " " ")bridge할 수 .), DNS 파일은 다음과 같습니다.

저는 이전의 답변에 전적으로 동의합니다.노출과 포트의 차이가 도커의 보안 개념의 일부라는 점을 말씀드리고 싶습니다.그것은 도커의 네트워킹과 밀접하게 관련이 있습니다.예:

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

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

언급URL : https://stackoverflow.com/questions/40801772/what-is-the-difference-between-ports-and-expose-in-docker-compose