포트 게시 및 노출하기
포트 게시 및 노출하기
컨테이너는 격리된 환경에서 실행되기 때문에 호스트에서 직접 접근할 수 없어요. 포트 게시(Port Publishing)는 호스트와 컨테이너 사이에 전달 규칙을 설정해 네트워크 격리를 일부 뚫는 기능이에요. 이 가이드에서 CLI와 Docker Compose로 포트를 게시하는 방법을 배워요.
출처: 문서
본문
설명
지금까지 가이드를 따라왔다면, 컨테이너가 애플리케이션의 각 구성 요소에 격리된 프로세스를 제공한다는 걸 이해했을 거예요. 각 구성 요소 — React 프론트엔드, Python API, Postgres 데이터베이스 — 는 호스트 머신의 다른 모든 것과 완전히 격리된 자체 샌드박스 환경에서 실행돼요. 이런 격리는 보안과 의존성 관리에 좋지만, 동시에 직접 접근할 수 없다는 뜻이기도 해요. 예를 들어 브라우저에서 웹 앱에 접근할 수 없어요.
바로 여기서 포트 게시가 등장해요.
포트 게시
포트를 게시하면 전달 규칙을 설정해 네트워크 격리를 조금 뚫을 수 있어요. 예를 들어 호스트의 포트 8080으로 오는 요청을 컨테이너의 포트 80으로 전달하도록 지정할 수 있어요. 포트 게시는 컨테이너 생성 시 docker run과 함께 -p(또는 --publish) 플래그를 사용해 이루어져요. 문법은 다음과 같아요.
$ docker run -d -p HOST_PORT:CONTAINER_PORT nginx
HOST_PORT: 트래픽을 받으려는 호스트 머신의 포트 번호CONTAINER_PORT: 연결을 수신 대기하는 컨테이너 내부의 포트 번호
예를 들어 컨테이너의 포트 80을 호스트 포트 8080에 게시하려면:
$ docker run -d -p 8080:80 nginx
이제 호스트 머신의 포트 8080으로 보내진 모든 트래픽은 컨테이너 안의 포트 80으로 전달돼요.
중요 포트를 게시하면 기본적으로 모든 네트워크 인터페이스에 게시돼요. 즉, 여러분의 머신에 도달하는 모든 트래픽이 게시된 애플리케이션에 접근할 수 있어요. 데이터베이스나 민감한 정보를 게시할 때는 주의하세요. 게시된 포트에 대해 더 자세히 알아보려면 여기를 참고하세요.
특정 호스트 IP에 게시
기본적으로 게시된 포트는 모든 호스트 인터페이스(0.0.0.0 / ::)에서 수신 대기해요. 게시 문자열의 앞에 IP를 넣으면 단일 주소에 바인딩할 수 있어요.
$ docker run -d -p 127.0.0.1:8080:80 nginx
전체 형식은 HOST_IP:HOST_PORT:CONTAINER_PORT예요.
HOST_IP: 선택 사항. 바인딩할 호스트 주소예요.127.0.0.1을 사용하면 포트를 머신 로컬로 유지하고, 특정 인터페이스 IP를 사용하면 해당 NIC만 트래픽을 받도록 해요.HOST_PORT/CONTAINER_PORT:HOST_PORT:CONTAINER_PORT에서와 같은 의미예요.
Compose에서도 같은 확장 형식이 ports 아래에서 동작해요.
services:
app:
image: docker/welcome-to-docker
ports:
- "127.0.0.1:8080:80"
임시 포트에 게시
때로는 포트를 그냥 게시하고 싶지만 어떤 호스트 포트가 사용되는지는 신경 쓰지 않을 때가 있어요. 이런 경우 Docker가 포트를 골라주도록 맡길 수 있어요. 그러려면 HOST_PORT 구성을 생략하면 돼요.
예를 들어 다음 명령은 컨테이너의 포트 80을 호스트의 임시(ephemeral) 포트에 게시해요.
$ docker run -p 80 nginx
컨테이너가 실행되면 docker ps로 선택된 포트를 확인할 수 있어요.
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a527355c9c53 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:54772->80/tcp romantic_williamson
이 예시에서 앱은 호스트의 포트 54772에서 노출돼요.
모든 포트 게시
컨테이너 이미지를 만들 때 EXPOSE 지시문은 패키징된 애플리케이션이 지정된 포트를 사용할 것임을 나타내는 데 사용돼요. 이 포트들은 기본적으로 게시되지 않아요.
-P(또는 --publish-all) 플래그를 사용하면 노출된 모든 포트를 임시 포트에 자동으로 게시할 수 있어요. 개발이나 테스트 환경에서 포트 충돌을 피하려 할 때 꽤 유용해요.
예를 들어 다음 명령은 이미지가 구성한 노출된 모든 포트를 게시해요.
$ docker run -P nginx
직접 해보기
이 실습 가이드에서는 웹 애플리케이션을 배포하기 위해 CLI와 Docker Compose를 모두 사용해 컨테이너 포트를 게시하는 방법을 배워요.
Docker CLI 사용하기
이 단계에서는 Docker CLI로 컨테이너를 실행하고 포트를 게시해요.
- Docker Desktop을 다운로드하고 설치해요.
- 터미널에서 다음 명령을 실행해 새 컨테이너를 시작해요.
첫 번째$ docker run -d -p 8080:80 docker/welcome-to-docker8080은 호스트 포트를 나타내요. 컨테이너 안에서 실행되는 애플리케이션에 접근하는 데 사용되는 로컬 머신의 포트예요. 두 번째80은 컨테이너 포트를 나타내요. 컨테이너 안의 애플리케이션이 들어오는 연결을 수신 대기하는 포트예요. 따라서 이 명령은 호스트의 포트8080을 컨테이너 시스템의 포트80에 바인딩해요. - Docker Desktop 대시보드의 Containers 뷰로 가서 게시된 포트를 확인해요.
- 컨테이너의 Port(s) 열에서 링크를 선택하거나 브라우저에서 http://localhost:8080 을 방문해 웹사이트를 열어요.
Docker Compose 사용하기
이 예시에서는 Docker Compose로 같은 애플리케이션을 실행해요.
- 새 디렉터리를 만들고 그 안에 다음 내용으로
compose.yaml파일을 만들어요.services: app: image: docker/welcome-to-docker ports: - 8080:80ports구성은 포트 정의에 여러 가지 문법 형태를 허용해요. 여기서는docker run명령에서 사용한 것과 같은HOST_PORT:CONTAINER_PORT를 사용하고 있어요. - 터미널을 열고 이전 단계에서 만든 디렉터리로 이동해요.
docker compose up명령으로 애플리케이션을 시작해요.- 브라우저에서 http://localhost:8080 을 열어요.
추가 자료
이 주제를 더 깊이 파고들고 싶다면 다음 자료를 꼭 확인해 보세요.
다음 단계
포트를 게시하고 노출하는 방법을 이해했으니, 이제 docker run 명령으로 컨테이너 기본값 재정의를 배울 준비가 됐어요.