컨테이너 기반 환경에서 도커(Docker) 네트워크는 애플리케이션의 안정성을 결정짓는 핵심 요소입니다. 네트워크 장애는 단순한 연결 끊김부터 미세한 성능 저하까지 다양한 형태로 나타납니다. 이 글에서는 네트워크 링크 수준의 통신 불능 상태와 데이터 흐름상의 트래픽 이상 현상을 체계적으로 진단하고 해결하는 방법을 다룹니다.
1. 네트워크 연결성(Connectivity) 장애 해결
컨테이너 간 또는 컨테이너와 외부망 사이의 통신이 완전히 차단된 경우, 주로 IP 충돌, 잘못된 라우팅, 혹은 방화벽 규칙의 간섭이 원인입니다.
네트워크 구성 및 할당 상태 확인
먼저 대상 컨테이너가 의도한 네트워크에 정상적으로 배치되었는지 확인해야 합니다. docker network inspect 명령을 통해 할당된 IP와 게이트웨이 정보를 점검합니다.
# 특정 사용자 정의 네트워크의 상세 정보 확인
docker network inspect app-service-net
IP 주소가 누락되었거나 게이트웨이 설정이 비정상적이라면 네트워크 재생성 또는 컨테이너 재연결이 필요합니다.
기본 통신 테스트 및 방화벽 점검
ping 명령어를 사용하여 컨테이너 간의 L3 연결성을 테스트합니다. 만약 IP 수준에서 응답이 없다면 호스트의 iptables 규칙을 살펴봐야 합니다.
# 컨테이너 내부에서 다른 노드로 핑 테스트
docker exec -it web-node ping 10.10.0.5
# 호스트 시스템의 iptables 필터링 규칙 확인
sudo iptables -L -n -v
특히 FORWARD 체인에서 도커 트래픽이 DROP 처리되고 있지는 않은지, 혹은 호스트의 보안 정책(UFW, Firewalld)이 도커 브릿지 인터페이스를 차단하고 있지 않은지 확인하십시오.
경로 추적 및 DNS 검증
외부 네트워크 접근에 문제가 있다면 traceroute를 통해 패킷이 어느 단계에서 멈추는지 파악하고, DNS 해석 문제인지 구분하기 위해 nslookup을 실행합니다.
# 경로 추적을 통한 병목 지점 파악
docker exec -it app-node traceroute api.external.com
# DNS 해석 정상 작동 여부 확인
docker exec -it app-node nslookup google.com
2. 네트워크 트래픽 이상 및 성능 저하 진단
연결은 가능하지만 속도가 느리거나, 간헐적인 패킷 손실이 발생하는 경우 실시간 모니터링과 패킷 분석이 필요합니다.
리소스 사용량 및 I/O 모니터링
도커에서 제공하는 기본 통계 기능을 통해 특정 컨테이너가 과도한 네트워크 대역폭을 점유하고 있는지 확인합니다.
# 실시간 네트워크 입출력(Net I/O) 감시
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.NetIO}}"
심층 패킷 분석 (Packet Capture)
정확한 원인 파악을 위해 tcpdump를 사용하여 네트워크 인터페이스의 실제 데이터 흐름을 캡처합니다. netshoot과 같은 진단용 컨테이너를 활용하면 편리합니다.
# 호스트 네트워크 모드에서 패킷 캡처 수행
docker run --rm --net=host nicolaka/netshoot tcpdump -i docker0 -w debug_logs.pcap
저장된 .pcap 파일을 Wireshark로 분석하여 재전송(Retransmission) 발생 여부나 TCP 윈도우 크기 문제 등을 식별할 수 있습니다.
커널 파라미터 및 큐 제한 최적화
높은 동시 접속 처리가 필요한 환경에서는 시스템의 소켓 큐 설정이 병목이 될 수 있습니다. tc 명령으로 트래픽 제어 상태를 확인하거나 컨테이너 실행 시 커널 파라미터를 조정합니다.
# 인터페이스의 대기열 규격(qdisc) 확인
tc qdisc show dev docker0
# 최대 연결 대기열(somaxconn) 확장 적용
docker run -d --sysctl net.core.somaxconn=2048 --name high-load-app nginx
애플리케이션 로그 기반 분석
때로는 네트워크 자체가 아닌 애플리케이션 내부의 연결 풀(Connection Pool) 고갈이나 타임아웃 설정 오류가 원인일 수 있습니다.
# 최신 로그를 통해 연결 오류 메시지 탐색
docker logs --tail 50 -f web-node
반복적인 연결 실패(Connection Refused)나 읽기 타임아웃(Read Timeout) 로그가 발견된다면 상위 레이어의 설정을 다시 검토해야 합니다.