소개

컨테이너의 핵심 기능은 격리입니다. 기본적으로 컨테이너의 네트워크는 호스트 시스템과 분리되어 있습니다. 따라서 컨테이너 내부에서 실행 중인 웹 서버가 정상 상태여도, 포트를 명시적으로 게시하지 않으면 외부에서는 해당 서버에 접근할 수 없습니다.

포트 매핑은 이 간극을 연결합니다. 호스트에서 선택한 포트로 들어오는 트래픽을 컨테이너 내부의 지정된 포트로 전달합니다. 이는 격리된 서비스에 어떻게 접근할 수 있게 되는지 보여 주므로, 컨테이너 네트워킹의 가장 중요한 기초 개념 중 하나입니다.

이 게시 단계가 없으면 컨테이너 내부의 서비스가 완전히 정상이어도 컨테이너 자체의 네트워크 네임스페이스에서만 접근할 수 있습니다.

이 실습에서는 다음 작업을 수행합니다.

  • Nginx 웹 서버 컨테이너를 실행합니다.
  • 호스트의 포트 8080 을 컨테이너의 포트 80 에 매핑합니다.
  • 매핑을 확인하고 서비스에 접근합니다.
  • 리소스를 정리합니다.

컨테이너 포트 노출

이 단계에서는 Nginx 이미지를 사용하여 새 Docker 컨테이너를 시작합니다.

Nginx 는 기본적으로 컨테이너 내부의 포트 80에서 수신 대기하는 웹 서버입니다. 하지만 컨테이너는 격리되어 있으므로, 포트 80 은 LabEx 환경에서 자동으로 접근할 수 없습니다. 이를 해결하기 위해 호스트 시스템의 포트 8080을 컨테이너 내부의 포트 80에 매핑합니다.

포트 매핑 구문은 -p <host_port>:<container_port>입니다.

포트 순서는 중요합니다. 왼쪽은 클라이언트가 연결하는 호스트 포트이고, 오른쪽은 컨테이너 내부에서 애플리케이션이 실제로 수신 대기하는 포트입니다.

터미널에서 다음 명령을 실행합니다.

docker run -d -p 8080:80 --name my-nginx nginx

명령 분석:

  • docker run: 컨테이너를 생성하고 시작하는 명령입니다.
  • -d: 컨테이너를 detached 모드 (백그라운드) 로 실행합니다.
  • -p 8080:80: 포트 매핑 플래그입니다.
    • 8080: 호스트 시스템 (LabEx 환경) 의 포트입니다.
    • 80: 컨테이너 내부의 포트이며, Nginx 가 이 포트에서 수신 대기합니다.
  • --name my-nginx: 컨테이너 이름을 "my-nginx"로 지정합니다.
  • nginx: 사용할 이미지입니다.

명령이 성공하면 Docker 가 긴 컨테이너 ID 를 출력합니다.

이 시점에서 Docker 가 Nginx 자체를 변경한 것은 아닙니다. 호스트 포트로 들어오는 요청을 컨테이너의 서비스 포트로 전달하는 네트워킹 규칙을 생성한 것입니다.

포트 설정 확인

이제 컨테이너가 실행 중인지, 포트 매핑이 올바르게 설정되었는지 확인합니다. docker ps 명령으로 이 정보를 확인할 수 있습니다.

다음 명령을 실행합니다.

docker ps

다음과 비슷한 출력이 표시됩니다.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
abc123456789   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   0.0.0.0:8080->80/tcp   my-nginx

출력 이해하기:

PORTS 열의 0.0.0.0:8080->80/tcp를 자세히 확인합니다.

  • 0.0.0.0:8080: 호스트가 모든 네트워크 인터페이스에서 포트 8080 을 수신 대기한다는 의미입니다.
  • ->: 트래픽이 전달되는 방향을 나타냅니다.
  • 80/tcp: 컨테이너 내부의 대상 포트입니다.

이 출력은 시스템의 포트 8080 으로 전송된 모든 트래픽이 컨테이너 내부의 포트 80 으로 전달된다는 것을 확인해 줍니다.

이처럼 포트가 전달되기 때문에 포트 매핑을 컨테이너 포트를 "게시한다"고 표현하기도 합니다. 이를 통해 원래 격리되어 있던 서비스를 호스트 또는 외부 클라이언트에 노출합니다.

포트 정보만 확인하려면 다음 명령을 사용할 수도 있습니다.

docker port my-nginx

서비스 테스트

포트 매핑이 완료되었으므로 웹 서버에 접근할 수 있는지 테스트합니다. 호스트의 포트 8080 에 매핑했으므로 localhost:8080으로 요청을 보내 Nginx 서버에 접근할 수 있습니다.

웹 요청을 보내는 명령줄 도구인 curl을 사용합니다.

다음 명령을 실행합니다.

curl localhost:8080

예상 결과:

기본 Nginx 환영 페이지의 HTML 원문이 표시됩니다.

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
...
    <h1>Welcome to nginx!</h1>
...
</html>

이 HTML 출력이 표시되면 성공입니다. 요청이 호스트 (포트 8080) 에서 컨테이너 (포트 80) 로 전달되고, Nginx 가 요청을 처리한 다음 응답을 다시 보낸 것입니다.

이 왕복 과정은 단순히 컨테이너 프로세스가 실행 중이라는 사실을 넘어, 호스트와 컨테이너 사이의 네트워킹이 실제로 작동한다는 것을 증명합니다.

리소스 정리

마지막 단계에서는 환경을 정리합니다. 더 이상 필요하지 않은 컨테이너를 중지하고 삭제하면 포트와 시스템 리소스를 확보할 수 있으므로, 이를 실천하는 것이 좋습니다.

먼저 실행 중인 컨테이너를 중지합니다.

docker stop my-nginx

그다음 중지된 컨테이너를 삭제합니다.

docker rm my-nginx

컨테이너가 삭제되었는지 확인합니다.

docker ps -a

목록에 my-nginx 컨테이너가 더 이상 표시되지 않아야 합니다.

요약

이 실습에서는 Docker 포트 매핑의 기본 개념을 성공적으로 학습했습니다. 다음 작업을 수행했습니다.

  1. Nginx 컨테이너를 detached 모드로 실행했습니다.
  2. -p 플래그를 사용하여 호스트의 포트 8080 을 컨테이너의 포트 80 에 매핑했습니다.
  3. docker ps를 사용하여 포트 설정을 확인했습니다.
  4. curl을 사용하여 호스트에서 서비스에 접근했습니다.
  5. 컨테이너를 정리했습니다.

포트 매핑을 이해하는 것은 웹 애플리케이션을 배포할 때 필수적입니다. 포트 매핑을 사용하면 외부 트래픽이 격리된 컨테이너 내부에서 실행 중인 서비스에 도달할 수 있습니다.