소개
Docker 는 애플리케이션 개발, 패키징 및 배포 방식을 혁신적으로 변화시킨 널리 사용되는 컨테이너화 기술입니다. Docker 컨테이너의 노출된 포트를 이해하는 것은 Docker 를 사용하는 데 있어 기본적인 측면이며, 컨테이너 내부에서 실행되는 서비스에 접근하고 상호 작용할 수 있게 해줍니다. 이 튜토리얼은 Docker 컨테이너의 노출된 포트를 검사하는 과정을 안내하여 컨테이너화된 애플리케이션을 더 잘 관리하고 최적화할 수 있도록 돕습니다.
Docker 컨테이너 포트 이해
컨테이너 포트를 검사하기 전에, 먼저 포트가 무엇이며 Docker 컨테이너에서 왜 중요한지 이해해 봅시다.
컨테이너 포트란 무엇인가
Docker 에서 포트는 컨테이너 내부에서 실행되는 서비스가 외부 세계와 통신할 수 있도록 해줍니다. 포트를 컨테이너화된 애플리케이션으로 들어가는 문이라고 생각하십시오. 이 문을 열지 않으면 아무도 내부 서비스에 접근할 수 없습니다.
포트 구성 유형
Docker 는 두 가지 주요 포트 구성 유형을 지원합니다.
Exposed Ports (노출된 포트): 컨테이너가 잠재적인 연결을 위해 사용할 수 있도록 하지만 호스트에서 자동으로 접근할 수 없는 포트입니다.
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 에 매핑되었습니다.
일반적인 포트 문제 해결
다음은 일반적인 포트 관련 문제에 대한 해결책입니다.
- 포트가 이미 사용 중: "포트가 이미 할당되었습니다"와 같은 오류가 표시되면 다른 포트를 선택하십시오.
docker run -d --name another-web -p 8082:80 nginx
- 컨테이너가 호스트에 연결할 수 없음: 컨테이너가 호스트의 서비스에 연결해야 하는 경우
localhost대신 특수 Docker DNS 이름host.docker.internal을 사용하십시오.
docker run --rm alpine ping -c 2 host.docker.internal
- 어떤 프로세스가 포트를 사용하는지 확인: 호스트에서 포트가 이미 사용 중인 경우 프로세스를 찾습니다.
sudo lsof -i :8080
정리
컨테이너를 정리해 보겠습니다.
docker stop web-demo redis-demo
docker rm web-demo redis-demo
요약
이 랩에서는 다음과 같은 Docker 컨테이너 포트 작업 방법을 배웠습니다.
- 노출된 (exposed) 포트와 게시된 (published) 포트의 차이점 이해
- 특정 포트 매핑으로 컨테이너 실행
- 다양한 Docker 명령을 사용하여 컨테이너 포트 구성 검사
- 매핑된 포트를 통해 컨테이너 내에서 실행되는 서비스에 접근
- 일반적인 포트 관련 시나리오 관리 및 문제 해결
이러한 기술은 Docker 컨테이너 작업의 기본이며 개발 및 프로덕션 환경에서 컨테이너화된 애플리케이션을 배포하는 데 필수적입니다. 이 지식을 통해 이제 Docker 컨테이너의 네트워킹 측면을 자신 있게 구성하고 관리할 수 있습니다.



