소개
이 랩에서는 docker port 명령어를 사용하여 Docker 서비스에 매핑된 공개 포트를 찾는 방법을 배우게 됩니다. 먼저 nginx 이미지를 사용하여 포트 매핑이 있는 간단한 서비스를 생성하는 것으로 시작합니다.
서비스를 생성한 후, 전체 서비스, 특정 프로토콜, 그리고 서비스 내 특정 컨테이너 인덱스에 대한 공개 포트를 찾는 방법을 살펴보겠습니다. 이 실습을 통해 Docker 컨테이너에 노출된 포트를 프로그래밍 방식으로 식별하는 기술을 습득할 수 있습니다.
포트 매핑을 사용하여 간단한 서비스 생성
이 단계에서는 Docker 를 사용하여 간단한 서비스를 생성하고 컨테이너의 포트를 호스트 머신에 매핑하는 방법을 배우겠습니다. 이를 통해 컨테이너 내에서 실행되는 서비스에 외부에서 접근할 수 있습니다.
먼저, Docker Hub 에서 nginx 이미지를 가져오겠습니다. 이 이미지는 예제에 사용할 수 있는 경량 웹 서버를 포함하고 있습니다.
docker pull nginx
이미지가 다운로드되고 있음을 나타내는 출력을 볼 수 있습니다. 다운로드가 완료되면 이미지를 나열하여 이미지가 로컬에서 사용 가능한지 확인할 수 있습니다.
docker images
이제 nginx 이미지를 기반으로 컨테이너를 실행하고 컨테이너의 포트 80 을 호스트 머신의 포트 8080 에 매핑해 보겠습니다. -d 플래그는 컨테이너를 분리 모드 (백그라운드) 로 실행하고, -p 8080:80 플래그는 포트 매핑을 수행합니다.
docker run -d -p 8080:80 nginx
이 명령은 Docker 컨테이너 내에서 Nginx 웹 서버를 시작하고 LabEx VM 의 포트 8080 에서 접근할 수 있도록 합니다.
컨테이너가 실행 중이고 포트 매핑이 작동하는지 확인하려면 docker ps 명령을 사용하여 실행 중인 컨테이너를 나열할 수 있습니다. nginx 이미지를 실행하는 컨테이너를 찾고 PORTS 열을 확인하십시오. 0.0.0.0:8080->80/tcp를 볼 수 있습니다.
docker ps
마지막으로, curl을 사용하여 포트 8080 에서 localhost에 요청을 보내 Nginx 환영 페이지에 접근할 수 있습니다.
curl localhost:8080
출력에서 기본 Nginx 환영 페이지의 HTML 콘텐츠를 볼 수 있습니다. 이는 컨테이너가 실행 중이며 매핑된 포트를 통해 접근할 수 있음을 확인합니다.
서비스의 공개 포트 찾기
이전 단계에서 Docker 컨테이너를 생성하고 컨테이너의 포트를 호스트에 매핑했습니다. 이제 서비스가 노출된 공개 포트를 프로그래밍 방식으로 찾는 방법을 배우겠습니다. 이는 컨테이너의 내부 포트에 매핑한 호스트 포트를 명시적으로 기억하지 못할 때 유용합니다.
docker port 명령어는 이러한 목적으로 특별히 설계되었습니다. 주어진 컨테이너의 포트 매핑을 보여줍니다. 컨테이너 ID 또는 이름을 인수로 제공해야 합니다.
먼저, 실행 중인 Nginx 컨테이너의 컨테이너 ID 를 얻어보겠습니다. docker ps를 사용하고 출력을 필터링하거나, 이전 단계의 docker ps 명령 출력에서 ID 를 복사할 수 있습니다.
docker ps
nginx 이미지를 실행하는 컨테이너를 찾고 해당 컨테이너 ID 를 기록해 두십시오.
이제 docker port 명령어를 컨테이너 ID 와 함께 사용하여 포트 매핑을 확인합니다.
docker port [CONTAINER_ID]
[CONTAINER_ID]를 실제 Nginx 컨테이너의 ID 로 바꾸십시오.
출력은 컨테이너의 내부 포트와 해당 호스트 포트 매핑을 보여줍니다. 예를 들어, 80/tcp -> 0.0.0.0:8080과 같은 내용을 볼 수 있습니다. 이는 컨테이너의 내부 포트 80(TCP 프로토콜 사용) 이 모든 호스트 인터페이스 (0.0.0.0) 의 포트 8080 에 매핑되었음을 나타냅니다.
이 명령어는 컨테이너의 전체 구성을 검사하지 않고도 공개 포트를 빠르게 결정하는 방법입니다.
특정 프로토콜에 대한 공개 포트 찾기
이전 단계에서 docker port를 사용하여 컨테이너의 모든 포트 매핑을 찾았습니다. 때로는 컨테이너가 서로 다른 프로토콜 (예: TCP 및 UDP) 을 사용하여 여러 포트를 노출할 수 있습니다. 이 단계에서는 특정 프로토콜의 공개 포트를 찾는 방법을 배우겠습니다.
docker port 명령어를 사용하면 컨테이너의 내부 포트와 관심 있는 프로토콜을 지정할 수 있습니다. 형식은 docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL]입니다.
TCP 프로토콜을 사용하여 Nginx 컨테이너의 내부 포트 80 에 대한 공개 포트를 찾아보겠습니다. 먼저, 이전 단계에서 컨테이너 ID 를 가지고 있는지 확인하십시오. 그렇지 않은 경우, docker ps를 사용하여 다시 얻을 수 있습니다.
docker ps
이제 컨테이너 ID 와 특정 포트 및 프로토콜을 사용하여 docker port 명령어를 사용합니다.
docker port [CONTAINER_ID] 80/tcp
[CONTAINER_ID]를 실제 Nginx 컨테이너의 ID 로 바꾸십시오.
출력은 TCP 프로토콜에 대해 컨테이너의 내부 포트 80 에 매핑된 호스트 포트를 직접 표시해야 하며, 이는 0.0.0.0:8080입니다. 이는 모든 매핑을 나열하는 docker port [CONTAINER_ID]를 실행하는 것보다 더 구체적입니다.
이는 컨테이너가 서로 다른 프로토콜에 대해 동일한 포트 번호를 노출하고 그 중 하나에 대한 매핑만 필요한 경우 특히 유용합니다.
특정 컨테이너 인덱스에 대한 공개 포트 찾기
일부 고급 시나리오에서는 컨테이너가 동일한 내부 포트를 여러 번 노출할 수 있으며, 잠재적으로 서로 다른 호스트 포트 또는 인터페이스에 매핑될 수 있습니다. Nginx 와 같은 간단한 서비스에서는 덜 일반적이지만 가능합니다. 이러한 경우 docker port 명령어는 단일 내부 포트에 대해 여러 매핑을 반환할 수 있습니다.
여러 매핑이 존재하는 경우 특정 매핑을 검색하려면 인덱스를 사용할 수 있습니다. 주어진 내부 포트에 대한 docker port의 출력은 매핑 목록입니다. 0 부터 시작하여 인덱스로 특정 매핑에 액세스할 수 있습니다.
예시를 위해, Nginx 컨테이너가 어떻게든 포트 80 에 대한 여러 매핑을 가지고 있다고 가정해 보겠습니다. 첫 번째 매핑 (인덱스 0) 을 얻으려면 다음 명령 형식을 사용합니다.
docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL]/[INDEX]
Nginx 예제를 사용하여 내부 포트 80 TCP 에 대한 첫 번째 매핑을 얻으려면 다음을 사용합니다.
docker port [CONTAINER_ID] 80/tcp/0
[CONTAINER_ID]를 실제 Nginx 컨테이너의 ID 로 바꾸십시오.
Nginx 컨테이너는 포트 80/tcp에 대한 하나의 매핑만 가지고 있으므로 이 명령어는 docker port [CONTAINER_ID] 80/tcp와 동일한 출력인 0.0.0.0:8080을 반환합니다.
Nginx 를 사용한 이 특정 예제는 인덱싱의 전체 기능을 보여주지 않을 수 있지만 (매핑이 하나만 있기 때문에), 동일한 내부 포트에 대한 여러 매핑이 존재할 수 있는 더 복잡한 컨테이너 구성을 이해하는 데 이 기능이 중요합니다.
요약
이 랩에서는 Nginx 이미지를 풀링하고, 컨테이너를 실행하고, 컨테이너 포트 80 을 호스트 포트 8080 에 매핑하여 포트 매핑을 사용하여 간단한 Docker 서비스를 만드는 방법을 배웠습니다. docker ps를 사용하여 컨테이너의 상태와 포트 매핑을 확인하고 호스트의 매핑된 포트를 curl 하여 접근성을 확인했습니다.
그런 다음, 호스트 포트 매핑이 명시적으로 알려지지 않은 경우 특히 유용한 docker port 명령어를 사용하여 서비스의 공개 포트를 프로그래밍 방식으로 찾는 방법을 살펴보았습니다. 이 명령어를 사용하면 컨테이너의 내부 포트에 해당하는 호스트 포트를 검색할 수 있습니다.



