NakedFlower 님의 블로그
[Infractice] 컨테이너 간 통신 불가 원인 분석 본문
상황
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를 쓰나 했는데...아무래도 네트워크 때문인 것 같다.
'Troubleshooting' 카테고리의 다른 글
| [Infratice] 디스크 용량 100% 원인 프로세스 찾기 (0) | 2026.05.11 |
|---|---|
| [Infratice] GitHub Actions 작업 무한 대기로 인한 러너 점유 (0) | 2026.04.28 |
| [Infratice] GitHub Actions 빌드 실패 로그 분석 (0) | 2026.04.24 |