답변:
받는 따르면 고정 표시기-작성 기준 ,
포트를 노출하십시오 . 두 포트 (HOST : CONTAINER)를 지정하거나 컨테이너 포트만 지정하십시오 (임의 호스트 포트가 선택됨).
내 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
. "EXPOSE 명령어는 실제로 포트를 게시하지 않습니다. 문서 유형으로 작동합니다 ..." docs.docker.com/engine/reference/builder/#expose
docker-compose run
포트 정의 docker-compose.yml
는 무시 됩니다. docker-compose up
매개 변수를 사용 하거나 제공하십시오--service-ports
포트 :
노출 :
포트이 섹션은 호스트 서버와 Docker 컨테이너 간의 매핑을 정의하는 데 사용됩니다.
ports:
- 10005:80
컨테이너 내부에서 실행되는 응용 프로그램이 포트 80에 노출되어 있음을 의미하지만 외부 시스템 / 엔터티가 액세스 할 수 없으므로 호스트 서버 포트에 매핑해야합니다.
참고 : 외부 엔터티가 응용 프로그램에 액세스 할 수 있도록 호스트 포트 10005를 열고 방화벽 규칙을 수정해야합니다.
그들은 사용할 수 있습니다
http : // {host IP} : 10005
이 같은
EXPOSE 독점적으로 도커 컨테이너 내에서 애플리케이션이 실행되는 포트를 정의하는 데 사용됩니다.
dockerfile에서도 정의 할 수 있습니다. 일반적으로 dockerfile 내부에서 EXPOSE를 정의하는 것이 좋고 널리 사용되는 방법입니다.
이 ports
섹션은 호스트에 포트를 게시합니다. Docker는 호스트 네트워크에서 컨테이너로 특정 포트에 대한 전달을 설정합니다. 기본적으로 이것은 docker-proxy
첫 번째 포트에서 수신 대기하고 컨테이너로 전달 하는 사용자 공간 프록시 프로세스 ( ) 로 구현되며 , 두 번째 지점에서 수신 대기해야합니다. 컨테이너가 대상 포트에서 수신 대기하지 않는 경우 여전히 호스트에서 수신 대기하는 것이 표시되지만 해당 호스트 포트에 연결하려고 시도하면 컨테이너에 대한 전달 실패에서 연결이 거부됩니다.
이 프록시는 컨테이너의 네트워크 네임 스페이스 내에서 실행되고 있지 않으며 컨테이너 내에서 127.0.0.1에 도달 할 수 없으므로 컨테이너는 모든 네트워크 인터페이스에서 수신 대기해야합니다. 이를위한 IPv4 방법은 응용 프로그램이 수신 대기하도록 구성하는 것입니다 0.0.0.0
.
또한 게시 된 포트는 반대 방향으로 작동하지 않습니다. 포트를 게시하여 컨테이너에서 호스트의 서비스에 연결할 수 없습니다. 대신 이미 사용중인 호스트 포트를 수신하려는 도커 오류가 있습니다.
노출은 문서입니다. 이미지 및 컨테이너에서 메타 데이터를 설정합니다. 일반적으로 Dockerfile에서 EXPOSE
지시 사항 과 함께 이것을 구성 하고 이미지를 실행하는 사용자를위한 문서 역할을하며 기본적으로 응용 프로그램이 수신 할 포트를 알 수 있습니다. 작성 파일로 구성하면이 메타 데이터는 컨테이너에서만 설정됩니다. docker inspect
이미지 또는 컨테이너에서 를 실행할 때 노출 된 포트를 볼 수 있습니다 .
노출 된 포트에 의존하는 몇 가지 도구가 있습니다. 도커에서 -P
플래그는 노출 된 모든 포트를 호스트의 임시 포트에 게시합니다. 컨테이너 포트를 명시 적으로 설정하지 않은 경우 애플리케이션에 트래픽을 전송할 때 노출 된 포트를 사용하도록 기본 설정되는 다양한 리버스 프록시도 있습니다.
이러한 외부 도구 이외의 노출은 컨테이너 간의 네트워킹에 전혀 영향을 미치지 않습니다. 한 컨테이너에서 다른 컨테이너에 액세스하려면 공통 도커 네트워크와 컨테이너 포트에 연결하기 만하면됩니다. 해당 네트워크를 사용자가 만든 경우 (예 : 기본 브리지 네트워크가 아닌 bridge
) DNS를 사용하여 다른 컨테이너에 연결할 수 있습니다.
나는 전에 답변에 전적으로 동의합니다. 노출과 포트의 차이점이 docker의 보안 개념의 일부라고 언급하고 싶습니다. 도커 의 네트워킹 과 밀접한 관련이 있습니다. 예를 들면 다음과 같습니다.
웹 프론트 엔드와 데이터베이스 백엔드가있는 애플리케이션을 상상해보십시오. 외부 세계는 웹 프론트 엔드 (아마 포트 80)에 액세스해야하지만 백엔드 자체 만 데이터베이스 호스트 및 포트에 액세스해야합니다. 사용자 정의 브리지를 사용하면 웹 포트만 열면되며 웹 프런트 엔드는 사용자 정의 브리지를 통해 포트에 연결할 수 있으므로 데이터베이스 응용 프로그램은 포트를 열 필요가 없습니다.
도커에서 네트워크 아키텍처를 설정할 때 일반적인 사용 사례입니다. 예를 들어 기본 브리지 네트워크에서는 외부 세계에서 포트에 액세스 할 수 없습니다. 따라서 "포트"를 사용하여 진입 점을 열 수 있습니다. "노출"을 사용하면 네트워크 내에서 통신을 정의 할 수 있습니다. 기본 포트를 노출하려면 docker-compose 파일에서 "노출"을 정의 할 필요가 없습니다.
expose
A의docker-compose
? 내가 알 수있는 한, 링크 된 서비스에서 포트에 액세스 할 수 있도록 노출을 지정하지 않아도됩니다.