Docker 컨테이너 간 연결 테스트 방법

DockerBeginner
지금 연습하기

소개

Docker 컨테이너는 현대 애플리케이션 개발 및 배포의 기본적인 부분이 되었습니다. 여러 컨테이너로 작업할 때, 애플리케이션이 올바르게 작동하려면 컨테이너 간의 적절한 연결을 보장하는 것이 중요합니다.

이 Lab 에서는 Docker 컨테이너 간의 연결을 확인하고 문제 해결하는 방법을 배우게 됩니다. 기본적인 Docker 컨테이너 개념부터 시작하여 테스트를 위한 컨테이너를 설정하고, 컨테이너 간의 네트워크 연결을 확인하고 진단하는 다양한 방법을 탐구할 것입니다.

이 튜토리얼을 마치면 컨테이너화된 애플리케이션에서 연결 문제를 자신 있게 테스트, 확인 및 해결할 수 있게 될 것입니다.

이 Lab 은 학습을 위해 인터넷 연결이 필요하므로, Pro 사용자만 VM 을 시작할 수 있습니다. 계정을 Pro 로 업그레이드하세요.

테스트를 위한 Docker 컨테이너 설정

컨테이너 간의 연결을 테스트하기 전에, 작업할 컨테이너를 몇 개 만들어야 합니다. 이 단계에서는 두 개의 간단한 Docker 컨테이너를 설정하고 기본적인 Docker 명령에 대해 배우겠습니다.

Docker 컨테이너 이해

Docker 컨테이너는 애플리케이션을 실행하는 데 필요한 모든 것 (코드, 런타임, 시스템 도구, 라이브러리 및 설정) 을 포함하는 가볍고 독립적인 패키지입니다. 컨테이너는 호스트 머신의 OS 커널을 공유하지만 격리된 환경에서 실행됩니다.

테스트 컨테이너 생성

Ubuntu 이미지를 기반으로 두 개의 간단한 컨테이너를 생성하는 것으로 시작해 보겠습니다. 이 Lab 전체에서 컨테이너 간의 연결을 테스트하기 위해 이러한 컨테이너를 사용할 것입니다.

먼저, 첫 번째 컨테이너를 생성해 보겠습니다.

docker run -d --name container1 ubuntu:22.04 sleep infinity

이제 두 번째 컨테이너를 생성해 보겠습니다.

docker run -d --name container2 ubuntu:22.04 sleep infinity
run containers

명령 매개변수 설명:

  • -d: 컨테이너를 detached 모드 (백그라운드) 에서 실행합니다.
  • --name: 컨테이너에 이름을 할당합니다.
  • ubuntu:22.04: 사용할 Docker 이미지 (Ubuntu 버전 22.04)
  • sleep infinity: 컨테이너를 무한정 실행 상태로 유지하는 명령입니다.

컨테이너가 실행 중인지 확인

컨테이너가 제대로 실행 중인지 확인하려면 다음 명령을 사용하십시오.

docker ps

다음과 유사한 출력이 표시되어야 합니다.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
f8d97c645cce   ubuntu:22.04   "sleep infinity"   5 seconds ago   Up 4 seconds             container2
a2c516a57cb8   ubuntu:22.04   "sleep infinity"   18 seconds ago  Up 17 seconds            container1

두 컨테이너가 모두 나열되지 않으면 제대로 시작되지 않았을 수 있습니다. 다시 생성해 볼 수 있습니다.

네트워크 도구 설치

기본적으로 Ubuntu 컨테이너 이미지는 매우 최소한으로, 필요한 네트워크 도구를 포함하지 않습니다. 두 컨테이너 모두에 이러한 도구를 설치해 보겠습니다.

container1 의 경우:

docker exec container1 apt-get update
docker exec container1 apt-get install -y iputils-ping net-tools iproute2 curl

container2 의 경우:

docker exec container2 apt-get update
docker exec container2 apt-get install -y iputils-ping net-tools iproute2 curl

이러한 명령은 다음을 수행합니다.

  1. docker exec를 사용하여 실행 중인 컨테이너 내에서 명령을 실행합니다.
  2. apt-get update로 패키지 목록을 업데이트합니다.
  3. 네트워크 도구 (iputils-ping for ping, net-tools for netstat, iproute2 for ip commands, and curl) 를 설치합니다.

이제 컨테이너는 다음 단계에서 연결 테스트를 할 준비가 되었습니다.

Docker 네트워크 이해

Docker 컨테이너는 네트워크를 통해 서로 통신합니다. 컨테이너 간의 연결을 테스트하고 문제 해결하려면 Docker 네트워킹 작동 방식을 이해하는 것이 필수적입니다.

Docker 네트워크 기본 사항

Docker 를 설치하면 자동으로 여러 기본 네트워크가 생성됩니다. 가장 일반적으로 사용되는 네트워크는 다음과 같습니다.

  • bridge: 네트워크가 지정되지 않은 경우 컨테이너가 연결되는 기본 네트워크
  • host: 컨테이너가 호스트의 네트워크를 직접 사용합니다 (격리 없음)
  • none: 컨테이너는 네트워크에 액세스할 수 없습니다.

시스템의 네트워크를 살펴보겠습니다.

docker network ls

다음과 유사한 출력이 표시되어야 합니다.

NETWORK ID     NAME      DRIVER    SCOPE
1b95853bf83b   bridge    bridge    local
91199fc6ad2e   host      host      local
1078d2c781b6   none      null      local

기본 Bridge 네트워크 이해

기본적으로 두 컨테이너 모두 기본 bridge 네트워크에 연결되어 있습니다. 이 네트워크를 살펴보겠습니다.

docker network inspect bridge

이 명령은 bridge 네트워크에 대한 자세한 정보를 표시하며, 연결된 컨테이너와 해당 IP 주소를 포함합니다. 출력에서 "Containers" 섹션을 찾아 container1 과 container2 가 IP 주소와 함께 나열되어 있는지 확인하십시오.

컨테이너 IP 주소 찾기

컨테이너 연결로 작업하려면 컨테이너에 할당된 IP 주소를 알아야 합니다. 이 정보를 찾는 방법에는 여러 가지가 있습니다.

docker inspect 사용:

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container1

또는 컨테이너 내부에서:

docker exec container1 hostname -i

두 컨테이너의 IP 주소를 기록해 두십시오.

docker exec container1 hostname -i
docker exec container2 hostname -i

출력은 각 컨테이너의 IP 주소를 표시하며, 일반적으로 기본 bridge 네트워크에서 172.17.0.x로 시작합니다.

사용자 지정 Docker 네트워크 생성

기본 bridge 네트워크는 컨테이너 통신을 허용하지만, 사용자 지정 네트워크를 생성하면 더 나은 격리와 내장 DNS 확인 (컨테이너가 IP 대신 이름으로 서로 연결할 수 있음) 을 제공합니다.

사용자 지정 bridge 네트워크를 생성해 보겠습니다.

docker network create --driver bridge my-network

이제 기존 컨테이너를 이 새 네트워크에 연결해 보겠습니다.

docker network connect my-network container1
docker network connect my-network container2

컨테이너가 새 네트워크에 연결되었는지 확인할 수 있습니다.

docker network inspect my-network

이제 컨테이너는 기본 bridge 네트워크와 사용자 지정 my-network에 모두 연결되어 있습니다. 다음 단계에서는 컨테이너 간의 연결을 테스트합니다.

컨테이너 간의 기본 연결 테스트

이제 컨테이너를 설정하고 네트워크에 연결했으므로 컨테이너 간의 연결을 테스트할 수 있습니다. 컨테이너가 서로 통신할 수 있는지 확인하기 위해 여러 가지 방법을 사용할 것입니다.

Ping 을 사용하여 연결 테스트

기본 네트워크 연결을 테스트하는 가장 간단한 방법은 대상 호스트에 ICMP 에코 요청을 보내는 ping 명령을 사용하는 것입니다.

IP 주소를 사용하여 container1 에서 container2 로 ping 을 보내 보겠습니다.

## First, get container2's IP address
CONTAINER2_IP=$(docker exec container2 hostname -i)
echo "Container2 IP: $CONTAINER2_IP"

## Get the first IP address of the CONTAINER2_IP
CONTAINER2_IP=$(echo $CONTAINER2_IP | cut -d' ' -f1)
echo "Container2 IP: $CONTAINER2_IP"

## Now ping from container1 to container2
docker exec container1 ping -c 4 $CONTAINER2_IP

다음과 유사한 출력이 표시되어야 합니다.

PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.095 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.090 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.087 ms
--- 172.17.0.3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.067/0.085/0.095/0.000 ms

DNS 확인 테스트

사용자 지정 Docker 네트워크의 한 가지 장점은 자동 DNS 확인을 제공하여 컨테이너가 이름으로 서로 연결할 수 있다는 것입니다.

이름으로 컨테이너를 ping 하여 DNS 확인을 테스트해 보겠습니다.

docker exec container1 ping -c 4 container2

두 컨테이너가 DNS 확인을 제공하는 사용자 지정 my-network에 있으므로 이 작업이 수행되어야 합니다. 이전 테스트와 유사한 ping 응답이 표시되지만 IP 대신 컨테이너 이름을 사용합니다.

curl 을 사용하여 HTTP 연결 테스트

웹 서비스를 실행하는 애플리케이션의 경우 HTTP 연결을 테스트해야 하는 경우가 많습니다. container2 에 간단한 HTTP 서버를 설정하고 container1 에서 해당 서버에 대한 연결을 테스트해 보겠습니다.

먼저 container2 에서 기본 HTTP 서버를 시작해 보겠습니다.

docker exec container2 apt-get install -y python3
docker exec -d container2 bash -c "echo 'Hello from container2' > /index.html && cd / && python3 -m http.server 8080"

서버가 시작될 때까지 몇 초 동안 기다린 다음 container1 에서 연결을 테스트합니다.

docker exec container1 curl -s http://container2:8080

다음 출력이 표시되어야 합니다.

Hello from container2

이는 container1 이 DNS 확인을 위해 컨테이너 이름을 사용하여 container2 의 HTTP 서비스에 연결할 수 있음을 확인합니다.

다른 방법으로 연결 테스트

다른 도구를 사용하여 연결을 테스트하는 방법을 아는 것도 유용합니다. nc (netcat) 를 사용하여 특정 포트가 열려 있는지 확인해 보겠습니다.

## Make sure netcat is installed in container1
docker exec container1 apt-get install -y netcat

## Test connectivity to the HTTP server on container2
docker exec container1 nc -zv container2 8080

연결이 성공했음을 나타내는 출력이 표시되어야 합니다.

Connection to container2 (172.18.0.3) 8080 port [tcp/*] succeeded!

이러한 테스트는 컨테이너가 네트워크 수준 (ping) 과 애플리케이션 수준 (HTTP) 모두에서 서로 통신할 수 있음을 확인합니다.

컨테이너 연결 문제 해결

연결 문제가 없으면 이 단계를 건너뛸 수 있습니다.

이제 컨테이너 간의 연결을 테스트하는 방법을 이해했으므로 일반적인 연결 문제를 해결하는 방법을 살펴보겠습니다.

일반적인 연결 문제

Docker 컨테이너 네트워크를 다룰 때 다음과 같은 몇 가지 일반적인 문제가 발생할 수 있습니다.

  1. 적절한 라우팅 없이 서로 다른 네트워크의 컨테이너
  2. 방화벽 또는 보안 그룹 설정이 트래픽을 차단함
  3. 애플리케이션이 예상 IP/포트에서 수신 대기하지 않음
  4. 네트워크 구성 오류
  5. DNS 확인 문제

이러한 잠재적인 문제 각각에 대한 문제 해결 단계를 살펴보겠습니다.

네트워크 구성 확인

먼저 컨테이너의 네트워크 구성을 살펴보겠습니다.

## View container1's network interfaces
docker exec container1 ip addr show

## View container2's network interfaces
docker exec container2 ip addr show

출력은 각 컨테이너의 모든 네트워크 인터페이스를 보여줍니다. 각 연결된 Docker 네트워크는 할당된 IP 주소와 함께 eth 인터페이스로 나타납니다.

네트워크 경로 확인

컨테이너의 라우팅 구성을 확인해 보겠습니다.

docker exec container1 route -n

이는 container1 의 라우팅 테이블을 표시하여 네트워크 트래픽이 어디로 전송되는지 나타냅니다.

수신 대기 포트 확인

애플리케이션이 연결을 제대로 수신 대기하는지 확인하려면 다음을 사용하십시오.

docker exec container2 netstat -tuln

이는 모든 TCP 및 UDP 수신 대기 포트를 표시합니다. HTTP 서버는 포트 8080 에서 수신 대기해야 합니다.

tcpdump 로 진단

보다 자세한 네트워크 트래픽 분석을 위해 tcpdump를 사용하여 패킷을 캡처하고 분석할 수 있습니다.

## Install tcpdump in container1
docker exec container1 apt-get install -y tcpdump dnsutils

## Capture packets for 10 seconds
docker exec container1 timeout 10 tcpdump -i eth0 -n

이것이 실행되는 동안 다른 터미널을 열고 일부 트래픽을 생성합니다.

docker exec container1 ping -c 3 container2

tcpdump 출력에서 ICMP 패킷이 캡처되는 것을 볼 수 있습니다.

Docker DNS 확인 확인

컨테이너 간의 DNS 확인에 문제가 있는 경우:

## Check the DNS configuration
docker exec container1 cat /etc/resolv.conf

## Test DNS resolution
docker exec container1 nslookup container2

네트워크 문제 시뮬레이션

container1 을 사용자 지정 네트워크에서 일시적으로 분리하여 연결 문제를 시뮬레이션해 보겠습니다.

## Disconnect container1 from my-network
docker network disconnect my-network container1

## Try to ping by name (this should fail)
docker exec container1 ping -c 2 container2

공유 네트워크에서 분리된 후 container1 이 더 이상 이름으로 container2 를 확인할 수 없으므로 ping 이 실패하는 것을 볼 수 있습니다.

다시 연결해 보겠습니다.

## Reconnect container1 to my-network
docker network connect my-network container1

## Verify connectivity is restored
docker exec container1 ping -c 2 container2

이제 ping 이 다시 작동해야 하며, 이름 확인이 작동하려면 컨테이너가 동일한 네트워크에 있어야 함을 보여줍니다.

문제 해결 체크리스트

컨테이너 연결 문제에 직면했을 때 다음 체크리스트를 따르십시오.

  1. 컨테이너가 실행 중인지 확인: docker ps
  2. 동일한 네트워크에 있는지 확인: docker network inspect <network>
  3. IP 주소가 할당되었는지 확인: docker inspect <container>
  4. 기본 연결 테스트 (ping): docker exec <container> ping <target>
  5. 애플리케이션이 수신 대기 중인지 확인: docker exec <container> netstat -tuln
  6. DNS 확인이 작동하는지 확인: docker exec <container> nslookup <target>
  7. 방화벽 문제 확인: docker exec <container> iptables -L
  8. 컨테이너 로그 확인: docker logs <container>

이 체계적인 접근 방식을 사용하면 대부분의 컨테이너 연결 문제를 식별하고 해결하는 데 도움이 됩니다.

요약

이 랩에서는 Docker 컨테이너 간의 연결을 테스트하고 문제 해결하는 방법을 배웠습니다. 다음을 수행했습니다.

  • Docker 컨테이너를 생성하고 네트워킹을 위해 구성했습니다.
  • 기본 및 사용자 지정 네트워크를 포함한 Docker 네트워킹 기본 사항에 대해 배웠습니다.
  • 다양한 도구를 사용하여 컨테이너 간의 기본 연결을 테스트했습니다 (ping, curl, netcat).
  • 일반적인 연결 문제를 살펴보고 체계적인 문제 해결 접근 방식을 배웠습니다.

이러한 기술은 여러 컨테이너가 서로 통신해야 하는 마이크로서비스 아키텍처에서 특히 Docker 기반 애플리케이션을 개발하고 유지 관리하는 데 필수적입니다.

추가 학습을 위해 다중 컨테이너 애플리케이션을 위한 Docker Compose, 컨테이너 오케스트레이션을 위한 Docker Swarm 또는 Kubernetes, 다중 호스트 배포를 위한 오버레이 네트워크와 같은 보다 고급 네트워킹 개념을 탐색할 수 있습니다.