티스토리 뷰

728x90

 

운영 중인 서비스는 Nginx를 리버스 프록시로 사용하고 있고, 백엔드 서비스들은 Docker Compose로 올라간다.

nginx와 백엔드 서비스는 동일한 custom network를 사용하며, 컨테이너명으로 통신을 한다.

 

그런데 서비스가 다 정상적으로 뜬 상태에서도 간헐적으로 Nginx에서 backend 연결 실패가 발생했다. 시기 상 컨테이너가 올라온 지 얼마 안되어 발생할 수 있는 수준이 아니라, 안정적으로 서비스를 하고 있는데도 아주 자주 발생했다.

 

connect() failed (111: Connection refused) while connecting to upstream

 

처음엔 "백엔드가 죽었나?" 했는데, 모든 컨테이너는 살아있었다. 죽어있었으면 운영도 안되었겠지...

 

리소스 부족이나 GC 지연 같은 이슈도 없었고, 컨테이너 내 로그에서도 특이점은 없었다. 그런데도 연결이 실패했다.😣

그리고 최종 3번정도 재시도 한 후에는 바로 요청이 백엔드로 전달이 되었다.. 시간차이가 1초의 간격이 있는 것도 아니라 로그가 거의 바로 올라오는 수준.. (이거 재요청은...아마 GCP LB에서 자동으로 재시도 하게끔 되어있는 거 같은데 ㅜ 해당 설정을 못찾았다..)

 

의심한 것들:

  • GC 문제? → 아니다.
  • Nginx keepalive 문제? → 설정 바꿔봐도 소용없었다.
  • GCP Load Balancer 재연결 이슈? → 연결 타이밍상 무관.

결국 여러 차례 테스트와 로그 추적 끝에, 원인은 Docker 내부 DNS가 backend 이름을 간헐적으로 못 찾는 현상이라는 결론에 도달했다. nginx프록시를 통하지 않고, 서비스 끼리 컨테이너명으로 통신 할 때...가끔 connection refused를 당했다...이걸 생각했엇어야하는데...ㅎ..

 

원인을 알았으니 해결을 해야하는데..

docker DNS를 안정적으로 운영하는 방법은..찾지 못해서..🥲 IP로 통신 하도록 설정을 변경했다.

IP를 지정하지 않고 컨테이너를 실행하는 경우, ip가 변경 될 가능성이 있어, 컨테이너 실행 시에 고정 IP를 지정해야한다.

services:
  backend:
    container_name: backend
    networks:
      app_net:
        ipv4_address: 172.20.0.10 #지정할 IP

  nginx:
    container_name: nginx
    networks:
      app_net:
        ipv4_address: 172.20.0.11 #지정할 IP

networks:
  app_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24 #Custom network의 서브넷

 

Nginx에서는 proxy_pass에 컨테이너 이름이 아닌 IP를 직접 지정했다. 

효과가 있을까 했는데 정말 이렇게 설정을 바꾸고 나서는 단 한 번도 Connection Refused가 발생하지 않았다. 하하....허무

 

다만 이런 경우 컨테이너가 많아지면 관리 포인트 또한 증가하기 때문에...조금 더 근본적인 해결책을 찾고 싶다ㅜㅜ

 

✨ 마무리

이번 이슈는 한눈에 보이는 문제는 아니었지만, 여러 시도 끝에 결국 DNS에 도달했고, 고정 IP로 명확히 해결할 수 있었다.
비슷한 환경에서 비슷한 증상을 겪는다면, Docker DNS 문제를 꼭 체크해보길 바란다.

  • Docker의 DNS는 의외로 불안정할 수 있고, 컨테이너 수가 많거나 요청이 많은 환경에서는 문제가 드러날 수 있다.

접속이 안 되는 이유는, 서비스 때문이 아닐 수도 있다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함