Docker - 포트 관리: 초보자 가이드

안녕하세요, 미래의 Docker 애호가 여러분! Docker 포트 관리의 흥미로운 여정을 안내해 드리게 되어 기쁩니다. 컴퓨터 과학을 가르쳐온 지 오래된 저는 Docker가 우리가 애플리케이션을 개발하고 배포하는 방식을 혁명적으로 바꾸었음을 직접 목격했습니다. 그럼, Docker에서 포트를 관리하는 개념을 풀어보겠습니다!

Docker - Managing Ports

EXPOSE vs. PUBLISH: 차이 이해

코드를 다루기 전에, 제 학생들이 많이 겪는 혼란을 해결해 드리겠습니다: Docker에서 EXPOSE와 PUBLISH의 차이를 이해하는 것입니다.

EXPOSE

EXPOSE는 집에 '판매 중' 표지를 달는 것과 같습니다. 컨테이너가 특정 포트를 듣고 있음을 나타냅니다만, 이 포트를 외부에서 접근할 수 있게 하지는 않습니다.

PUBLISH

反対로, PUBLISH는 문을 열고 사람들을 초대하는 것과 같습니다. 컨테이너의 포트를 호스트 기계의 포트로 매핑하여 외부에서 접근할 수 있게 합니다.

다음의 간단한 표로 요약해 보겠습니다:

명령어 목적 외부에서 접근 가능?
EXPOSE 포트 문서화 아니요
PUBLISH 포트 매핑

이제 이를 풀어보았으니, 실제로 어떻게 사용할 수 있는지 보겠습니다!

Docker에서 PUBLISH를 사용하여 포트 공개하는 방법

컨테이너를 실행할 때, -p 또는 --publish 플래그를 사용하여 컨테이너 포트를 호스트 포트로 매핑할 수 있습니다. 예를 들어, 우리의 컨테이너 내에서 포트 8080에서 웹 애플리케이션이 실행 중이고, 호스트 기계의 포트 80에서 접근하고 싶습니다.

이렇게 하면 됩니다:

docker run -p 80:8080 my-web-app

이를 분해해 보겠습니다:

  • docker run: 이 명령어는 컨테이너를 실행합니다
  • -p 80:8080: 이는 컨테이너의 포트 8080을 호스트의 포트 80으로 매핑합니다
  • my-web-app: 이는 우리의 Docker 이미지 이름입니다

이 명령어를 실행한 후, 브라우저에서 http://localhost로 이동하여 웹 애플리케이션에 접근할 수 있습니다. 멋지지 않나요?

하지만 여러 포트를 매핑하고 싶다면 어떻게 하나요? 문제ありません! 여러 -p 플래그를 사용할 수 있습니다:

docker run -p 80:8080 -p 443:8443 my-web-app

이는 포트 8080을 80으로 HTTP 트래픽을, 포트 8443을 443으로 HTTPS 트래픽을 매핑합니다. 애플리케이션에 앞문과 뒷문을 동시에 제공하는 것과 같습니다!

Dockerfile에서 포트 공개하는 방법

이제 Dockerfile에서 직접 포트를 공개하는 방법에 대해 이야기해 보겠습니다. 이는 자신의 Docker 이미지를 빌드할 때 매우 유용합니다.

다음은 Node.js 애플리케이션을 위한 간단한 Dockerfile입니다:

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]

이를 분해해 보겠습니다:

  • FROM node:14: 이는 우리의 기본 이미지를 Node.js 버전 14로 설정합니다
  • WORKDIR /app: 이는 컨테이너 내의 작업 디렉토리를 설정합니다
  • COPY package*.json ./: 이는 package.json 파일을 복사합니다
  • RUN npm install: 이는 의존성을 설치합니다
  • COPY . .: 이는 애플리케이션 코드를 복사합니다
  • EXPOSE 8080: 이는 Docker에게 컨테이너가 포트 8080을 듣고 있음을 알립니다
  • CMD [ "node", "server.js" ]: 이는 애플리케이션을 시작하는 명령어입니다

EXPOSE 지시어는 앞서 이야기한 '판매 중' 표지와 같습니다. Docker에게 "이 컨테이너는 포트 8080을 듣습니다"라고 알립니다.

하지만 기억하세요, EXPOSE 혼자서는 포트를 공개하지 않습니다. 컨테이너를 실행할 때 실제로 포트를 접근할 수 있게 하려면 여전히 -p 플래그를 사용해야 합니다:

docker run -p 80:8080 my-node-app

이는 컨테이너의 공개된 포트 8080을 호스트의 포트 80으로 매핑합니다.

결론

그렇습니다, 여러분! Docker 포트 관리의 세계를 여행하며 EXPOSE와 PUBLISH의 차이를 이해하고, Dockerfile과 실행 명령어에서 이를 실제로 구현하는 방법을 배웠습니다.

기억하세요, Docker에서 포트 관리는 모두 소통에 관한 것입니다. EXPOSE는 Docker에게 "이 포트를 사용할 것입니다"라고 알리는 것이고, PUBLISH는 컴퓨터에게 "이 Docker 컨테이너를 이 포트에서 듣게 하세요"라고 알립니다.

Docker 여정을 계속하면서, 포트 관리가 복잡한 마이크로서비스 아키텍처에서 애플리케이션 배포에 매우 중요하다는 것을 알게 될 것입니다. 하지만 걱정하지 마세요, 연습을 통해 이는 자연스럽게 익숙해질 것입니다!

FAQ

다음은 제 학생들이 자주 묻는 몇 가지 질문입니다:

  1. Q: EXPOSE를 docker run 명령어에서 사용할 수 있나요? A: 아니요, EXPOSE는 Dockerfile에서만 사용됩니다. 실행 시 포트 매핑은 -p 플래그를 사용하세요.

  2. Q: 컨테이너를 실행할 때 PUBLISH를 사용하지 않으면 어떻게 되나요? A: 컨테이너는 실행되지만, 외부에서 접근할 수 없습니다.

  3. Q: 컨테이너 포트를 여러 호스트 포트로 매핑할 수 있나요? A: 예! 여러 -p 플래그를 사용하여 단일 컨테이너 포트를 여러 호스트 포트로 매핑할 수 있습니다.

  4. Q: 공개하거나 매핑할 수 있는 포트에 제한이 있나요? A: Docker에는 명확한 제한이 없지만, 운영 체제에 따라 사용 가능한 포트에 제한이 있을 수 있습니다.

  5. Q: docker run에서 -p-P의 차이는 무엇인가요? A: -p는 특정 포트 매핑을 지정하고, -P는 모든 공개된 포트를 호스트의 랜덤 포트로 매핑합니다.

기억하세요, 실천하는 것이 최선의 학습입니다. 터미널을 열고 Dockerfile을 만들어 보세요, 행복한 코딩을 기원합니다!

Credits: Image by storyset