NakedFlower 님의 블로그

[Infractice] 컨테이너 간 통신 불가 원인 분석 본문

Troubleshooting

[Infractice] 컨테이너 간 통신 불가 원인 분석

nakedflower 2026. 5. 28. 14:06

상황

Docker로 운영 중인 서비스에서 web 컨테이너가 api 컨테이너에 HTTP 요청을 보내지 못하고 있습니다. 두 컨테이너 모두 같은 호스트에서 실행 중입니다. 네트워크 설정을 분석하여 통신 불가 원인을 찾으세요.

 

제공 데이터

 


내 답변

일단 1차적으로 방화벽 문제일 확률이 있고, 

두번째 web컨테이너엣서 통신 테스트를 할 때 api:8080 으로 health check를 할 떄는 could not resolve인데, 172.18.0.2:8080으로 health check를 할 때는 failed to connect 인 걸로 보아,  애초에 api라는 이름이 172.18.0.2인지도 모르고 있는 것 같은데...그럼 docker network inspect 할 때 나오는 결과를 인식하지 못하고 있다는 소리인가....모르겠다ㅜㅜ

 

정답

두 컨테이너가 서로 다른 Docker 네트워크에 연결되어 있기 때문이다.

  • web 컨테이너는 bridge 네트워크에
  • api 컨테이너는 my-app-network 네트워크에.

서로 다른 docker 브릿지 네트워크에 속한 컨테이너는 기본적으로 통신할 수 없습니다. 또한 기본 bridge 네트워크에서는 컨테이너 이름으로 DNS 해석이 불가능합니다. (사용자 정의 네트워크에서만 가능)

 

해결방법은 아래 3가지가 있습니다.

# 방법 1: web 컨테이너를 my-app-network에 추가 연결
docker network connect my-app-network web

# 연결 확인
docker exec web curl http://api:8080/health

# 방법 2: (더 깔끔한 방법) 두 컨테이너를 같은 네트워크로 재구성
docker stop web
docker rm web
docker run -d --name web --network my-app-network -p 80:80 web:latest

# 방법 3: docker-compose.yml로 네트워크를 명시적으로 관리
# (근본적 해결)

 

docker compose를 사용하면 docker-compose.yml에 정의된 서비스들은 자동으로 하나의 네트워크를 공유하여 이런 문제를 예방할 수 있습니다. 마이크로서비스 환경에서는 네트워크를 기능 단위로 분리하고, 필요한 서비스만 공유 네트워크에 연결하는 것이 보안상 좋습니다.


 

네트워크에 대해 아예 짐작도 못했었다...docker 네트워크 환경에 대해서도 공부가 필요할 것 같다.

그리고 이번 문제를 계기로 docker compose를 왜 쓰게 됐는지도 짐작할 수 있었던 것 같다.

사실 기존에는 컨테이너 5개 미만 수준의 마이크로 서비스는 그냥 컨테이너 별로 따로 관리하는게 더 편할 것 같았고

그 이상 되는건 쿠버네티스를 쓰는게 더 편할 것 같은데

왜 굳이 docker compose를 쓰나 했는데...아무래도 네트워크 때문인 것 같다.