Docker 컨테이너의 노출된 포트 확인 방법

DockerBeginner
지금 연습하기

소개

Docker 는 애플리케이션 개발, 패키징 및 배포 방식을 혁신적으로 변화시킨 널리 사용되는 컨테이너화 기술입니다. Docker 컨테이너의 노출된 포트를 이해하는 것은 Docker 를 사용하는 데 있어 기본적인 측면이며, 컨테이너 내부에서 실행되는 서비스에 접근하고 상호 작용할 수 있게 해줍니다. 이 튜토리얼은 Docker 컨테이너의 노출된 포트를 검사하는 과정을 안내하여 컨테이너화된 애플리케이션을 더 잘 관리하고 최적화할 수 있도록 돕습니다.

Docker 컨테이너 포트 이해

컨테이너 포트를 검사하기 전에, 먼저 포트가 무엇이며 Docker 컨테이너에서 왜 중요한지 이해해 봅시다.

컨테이너 포트란 무엇인가

Docker 에서 포트는 컨테이너 내부에서 실행되는 서비스가 외부 세계와 통신할 수 있도록 해줍니다. 포트를 컨테이너화된 애플리케이션으로 들어가는 문이라고 생각하십시오. 이 문을 열지 않으면 아무도 내부 서비스에 접근할 수 없습니다.

포트 구성 유형

Docker 는 두 가지 주요 포트 구성 유형을 지원합니다.

  1. Exposed Ports (노출된 포트): 컨테이너가 잠재적인 연결을 위해 사용할 수 있도록 하지만 호스트에서 자동으로 접근할 수 없는 포트입니다.

  2. Published Ports (게시된 포트): 호스트의 포트에 매핑되어 컨테이너 서비스에 외부 접근을 허용하는 노출된 포트입니다.

이것을 더 잘 이해하기 위해 간단한 웹 서버 컨테이너를 실행해 보겠습니다.

docker run -d --name web-demo nginx

터미널에서 이 명령을 실행합니다. 이렇게 하면 web-demo라는 이름의 Nginx 웹 서버 컨테이너가 detached mode (백그라운드에서 실행) 로 시작됩니다.

출력은 다음과 유사한 컨테이너 ID 를 표시합니다.

3a6e8df899a9b723de9e4684542dc9987af26381118fa36496757d17ac952c9f

이 Nginx 컨테이너는 기본적으로 포트 80 을 노출합니다 (Dockerfile 에 정의됨). 하지만 아직 호스트에 게시하지 않았으므로 외부에서 접근할 수 없습니다.

컨테이너 포트 구성 검사

이제 컨테이너가 실행 중이므로 포트 구성을 검사해 보겠습니다.

docker ps 를 사용하여 포트 매핑 보기

docker ps 명령은 실행 중인 컨테이너와 해당 포트 구성을 보여줍니다.

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

docker ps

다음과 유사한 출력을 볼 수 있습니다.

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
3a6e8df899a9   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes    80/tcp    web-demo

PORTS 열을 확인하십시오. 80/tcp가 표시되어 포트 80 이 노출되었지만 호스트에 게시되지 않았음을 나타냅니다.

게시된 포트로 컨테이너 실행

첫 번째 컨테이너를 중지하고 게시된 포트가 있는 새 컨테이너를 만들어 보겠습니다.

docker stop web-demo
docker rm web-demo

이제 포트 매핑으로 새 컨테이너를 실행합니다.

docker run -d --name web-demo -p 8080:80 nginx

-p 8080:80 옵션은 컨테이너의 포트 80 을 호스트의 포트 8080 에 게시합니다.

차이점을 확인하기 위해 다시 docker ps를 실행합니다.

docker ps

출력:

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

PORTS 열이 이제 0.0.0.0:8080->80/tcp를 표시하여 컨테이너의 포트 80 이 모든 호스트 인터페이스의 포트 8080 에 매핑되었음을 나타내는 방식을 확인하십시오.

컨테이너 포트 세부 정보 검사

Docker 는 컨테이너 포트 구성을 자세히 검사하기 위한 여러 명령을 제공합니다. 이러한 옵션을 살펴보겠습니다.

docker port 명령 사용

docker port 명령은 컨테이너의 포트 매핑을 보여줍니다.

docker port web-demo

출력:

80/tcp -> 0.0.0.0:8080

이는 컨테이너의 포트 80/tcp가 모든 호스트 인터페이스의 포트 8080 에 매핑되었음을 보여줍니다.

자세한 정보를 위한 docker inspect 사용

더 자세한 정보를 얻으려면 docker inspect 명령을 사용하십시오.

docker inspect web-demo

이 명령은 컨테이너에 대한 자세한 정보가 포함된 많은 JSON 출력을 생성합니다. 포트 정보만 필터링하려면 다음 명령을 사용하십시오.

docker inspect --format='{{json .NetworkSettings.Ports}}' web-demo | jq

jq가 설치되어 있지 않은 경우 다음 명령으로 설치할 수 있습니다.

sudo apt-get update && sudo apt-get install -y jq

필터링된 inspect 명령의 출력은 다음과 같습니다.

{
  "80/tcp": [
    {
      "HostIp": "0.0.0.0",
      "HostPort": "8080"
    }
  ]
}

이는 자세한 포트 매핑 정보를 보여줍니다.

  • 컨테이너 포트: 80/tcp
  • 호스트 IP: 0.0.0.0 (모든 인터페이스)
  • 호스트 포트: 8080

모든 컨테이너 포트 나열

여러 컨테이너가 있는 경우 다음 명령으로 모든 포트 매핑을 볼 수 있습니다.

docker ps --format "{{.Names}}: {{.Ports}}"

출력:

web-demo: 0.0.0.0:8080->80/tcp

이는 서로 다른 포트 구성을 가진 여러 컨테이너를 관리할 때 유용합니다.

노출된 포트를 통해 서비스에 접근

이제 컨테이너 포트를 검사하는 방법을 이해했으므로 컨테이너에서 실행 중인 웹 서버에 접근해 보겠습니다.

컨테이너 접근성 테스트

컨테이너의 포트 80 을 호스트의 포트 8080 에 매핑했으므로 포트 8080 을 통해 Nginx 웹 서버에 접근할 수 있습니다.

curl 명령을 사용하여 웹 서버에 요청을 보내 보겠습니다.

curl localhost:8080

Nginx 환영 페이지의 HTML 을 볼 수 있습니다.

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.
    </p>

    <p>
      For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br />
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

이는 게시된 포트를 통해 컨테이너 내에서 실행 중인 Nginx 웹 서버에 접근할 수 있음을 확인합니다.

여러 서비스 실행

다른 서비스와 포트 매핑으로 다른 컨테이너를 만들어 보겠습니다.

docker run -d --name redis-demo -p 6379:6379 redis

이 명령은 Redis 데이터베이스 컨테이너를 시작하고 기본 포트 6379 를 호스트의 동일한 포트에 매핑합니다.

실행 중인 컨테이너를 확인합니다.

docker ps

출력:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                    NAMES
a45df67e21b3   redis     "docker-entrypoint.s…"   10 seconds ago   Up 10 seconds   0.0.0.0:6379->6379/tcp   redis-demo
f7d483e51ef2   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:8080->80/tcp     web-demo

이제 서로 다른 서비스를 실행하는 두 개의 컨테이너가 있으며, 각 컨테이너에는 자체 포트 매핑이 있습니다.

컨테이너 포트 구성 관리

이제 컨테이너화된 서비스를 검사하고 접근하는 방법을 이해했으므로 몇 가지 추가적인 포트 관리 개념을 살펴보겠습니다.

일반적인 포트 관리 시나리오

다음은 발생할 수 있는 몇 가지 일반적인 시나리오입니다.

1. 포트 매핑 변경

호스트에서 포트 8080 이 이미 사용 중인 경우 다른 포트에 매핑할 수 있습니다.

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 8081:80 nginx

이제 Nginx 컨테이너는 포트 8081 에서 접근할 수 있습니다.

curl localhost:8081

2. 특정 인터페이스에 바인딩

모든 인터페이스 (0.0.0.0) 에 바인딩하는 대신 특정 IP 에 바인딩할 수 있습니다.

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 127.0.0.1:8080:80 nginx

이렇게 하면 컨테이너 포트가 localhost 인터페이스에만 바인딩되어 호스트 외부에서는 접근할 수 없게 됩니다.

3. 임의의 호스트 포트 사용

어떤 호스트 포트가 사용되는지 상관하지 않는 경우 Docker 가 하나를 할당하도록 합니다.

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -P nginx

-P 플래그는 노출된 모든 포트를 호스트의 임의 포트에 게시합니다.

할당된 포트를 확인합니다.

docker port web-demo

출력:

80/tcp -> 0.0.0.0:49153

정확한 포트 번호는 다를 수 있지만 이 예에서는 포트 80 이 포트 49153 에 매핑되었습니다.

일반적인 포트 문제 해결

다음은 일반적인 포트 관련 문제에 대한 해결책입니다.

  1. 포트가 이미 사용 중: "포트가 이미 할당되었습니다"와 같은 오류가 표시되면 다른 포트를 선택하십시오.
docker run -d --name another-web -p 8082:80 nginx
  1. 컨테이너가 호스트에 연결할 수 없음: 컨테이너가 호스트의 서비스에 연결해야 하는 경우 localhost 대신 특수 Docker DNS 이름 host.docker.internal을 사용하십시오.
docker run --rm alpine ping -c 2 host.docker.internal
  1. 어떤 프로세스가 포트를 사용하는지 확인: 호스트에서 포트가 이미 사용 중인 경우 프로세스를 찾습니다.
sudo lsof -i :8080

정리

컨테이너를 정리해 보겠습니다.

docker stop web-demo redis-demo
docker rm web-demo redis-demo

요약

이 랩에서는 다음과 같은 Docker 컨테이너 포트 작업 방법을 배웠습니다.

  • 노출된 (exposed) 포트와 게시된 (published) 포트의 차이점 이해
  • 특정 포트 매핑으로 컨테이너 실행
  • 다양한 Docker 명령을 사용하여 컨테이너 포트 구성 검사
  • 매핑된 포트를 통해 컨테이너 내에서 실행되는 서비스에 접근
  • 일반적인 포트 관련 시나리오 관리 및 문제 해결

이러한 기술은 Docker 컨테이너 작업의 기본이며 개발 및 프로덕션 환경에서 컨테이너화된 애플리케이션을 배포하는 데 필수적입니다. 이 지식을 통해 이제 Docker 컨테이너의 네트워킹 측면을 자신 있게 구성하고 관리할 수 있습니다.