인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

limjs730님의 프로필 이미지

작성한 질문수

비전공자도 이해할 수 있는 Docker 입문/실전

EXPOSE : 컨테이너 내부에서 사용 중인 포트를 문서화하기

컨테이너 내부에서 사용하는 포트를 어떻게 지정하나요?

작성

·

50

0

공부를 하다가 궁금해진건데 예를 들어서 MYSQL을 사용하면 3306 포트를 호스트에 노출 시켜서 run하는 시점에

docker run -p 3306:3306 이렇게 매핑을 한다 쳤을 때 컨테이너 내부의 3306은 어떤 기준으로 열리게 된건지가 궁금합니다.

 

처음에는 프로그램마다 다를거라고 생각을 했습니다. MYSQL은 3306 포트를 열게하는 설정이 있다. 그리고

자바로 치면 application.yml을 보고 server.port을 참고하여 포트를 열어버린다? 근데 이렇게 생각하니까 외부 프로그램이 포트를 연다라는 발상을 하게 되는데 좀 이상한 것 같습니다.

 

또한 어떤 기준으로 포트가 열리는지 궁금합니다.

답변 2

1

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

안녕하세요 limjs730님! 좋은 질문 주셨네요👍

차근차근 설명드려볼게요!

 

컴퓨터에서는 어떤 프로그램을 실행시키든, 실행시키는 순간 컴퓨터의 특정 포트에서 실행되게 됩니다.

이 때, 프로그램을 만드는 사람이 별도의 포트 번호를 지정해두면

그 포트 번호에서 프로그램을 실행시키게 됩니다.

예를 들어, MySQL은 MySQL이라는 프로그램을 만든 사람들이

기본적으로 3306이라는 포트에서 실행시키게끔 코딩을 해두었습니다.

만약 프로그램을 만드는 사람들이 3306과 같이 특정 포트를 지정해두지 않으면

컴퓨터의 포트들 중에서 남은 포트 번호에서 프로그램을 실행시키게 됩니다.

 

비유를 들어서 설명드려볼게요.

집(컴퓨터)에 전기 콘센트(포트)가 65536개(실제 한 컴퓨터의 포트 개수) 있어요.

여기서 전자 제품(프로그램)은 비어 있는 콘센트라면 어디든 꼽아서 작동시킬 수 있어요.

하지만 MySQL이라는 전자 제품은 별도의 설정을 하지 않는 이상

기본적으로 3306번째 콘센트에 꼽게끔 구성되어 있어요.

이 때, 도커 컨테이너의 외부에서 MySQL이라는 전자 제품을 찾아가려면

MySQL이 몇 번째 콘센트(포트)에 꽂혀있는 지 알고 있어야 돼요.

하지만 MySQL은 기본적으로 3306번째 콘센트에 꽂혀있다는 걸

공식문서를 통해 알 수 있어요.

그러다보니 도커 컨테이너 외부에서 MySQL이라는 전자 제품을 찾아가기 위해

도커 컨테이너의 3306번째 콘센트를 찾아 나서는 겁니다.

그리고 도커 컨테이너에서 3306(컨테이너 외부 = 호스트 컴퓨터):3306(컨테이너 내부)을 연결시킴으로써

컨테이너 외부의 3306번 포트로 접근하면 컨테이너 내부의 3306번 포트로 접근할 수 있게

구성한 것입니다.

 

혹시 이 설명을 듣고 이해 안 되시는 점이 있다면 또 댓글 남겨주세요~~~

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. limjs730님.

컨테이너의 포트 매핑과 내부 포트 사용에 대한 질문을 주셨네요. Docker에서 컨테이너 내부의 포트가 어떤 기준으로 열리는지는 주로 사용되는 애플리케이션의 설정과 이미지의 기본 설정에 따라 결정됩니다. 아래에서 조금 더 상세히 설명드리겠습니다.

컨테이너 내부 포트 설정

  1. 기본 포트 설정: 대부분의 서버 애플리케이션(예: MySQL, Apache, Nginx 등)은 실행될 특정 기본 포트를 가지고 있습니다. MySQL의 경우 기본적으로 3306 포트를 사용합니다. 이는 MySQL 소프트웨어 자체의 설정에 의해 결정됩니다.

  2. 애플리케이션 설정: Java 애플리케이션의 경우 application.yml 또는 application.properties 파일에서 server.port 설정을 통해 특정 포트를 열도록 할 수 있습니다. 이 포트는 Java 애플리케이션이 서비스할 포트가 됩니다.

  3. Docker 이미지의 설정: Docker 이미지를 빌드할 때 EXPOSE 명령어를 통해 외부에 노출할 포트를 명시할 수 있습니다. 이는 컨테이너가 실행될 때 어떤 포트가 외부에 노출될 수 있는지를 설정합니다. 그러나, 실제 포트 매핑은 docker run 명령어에서 이루어집니다.

  4. 포트 매핑: Docker 컨테이너를 실행할 때 -p 옵션을 사용하여 호스트와 컨테이너 간의 포트를 매핑할 수 있습니다. docker run -p 3306:3306 명령은 호스트의 3306 포트를 컨테이너의 3306 포트로 매핑하여 외부에서 컨테이너의 MySQL 서비스에 접근할 수 있도록 합니다.

관련하여 더 자세한 내용을 확인하고 싶으시다면 아래 링크를 참고해 주세요:

위 링크에서는 비슷한 질문에 대해 다른 수강생이 겪었던 문제와 해결 방법들도 참고할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

limjs730님의 프로필 이미지

작성한 질문수

질문하기