티스토리 뷰
운영 중인 서비스는 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는 의외로 불안정할 수 있고, 컨테이너 수가 많거나 요청이 많은 환경에서는 문제가 드러날 수 있다.
접속이 안 되는 이유는, 서비스 때문이 아닐 수도 있다.
'인프라 > docker' 카테고리의 다른 글
| [Docker]Docker Login 실패 원인 분석: GCP LB에서 HTTP 리다이렉트가 필요한 이유 (0) | 2025.04.03 |
|---|---|
| [docker/도커] 스프링부트 프로젝트 이미지 만들기 (log 볼륨 및 properties 볼륨) (0) | 2024.02.01 |
| [jenkins/젠킨스] docker로 jenkins 환경 구축하기 (1) | 2023.07.08 |
| [docker/도커]Linux에서 docker 실행 시 permission denied/ docker: Got permission denied while trying to connect to the Docker daemon socket (0) | 2023.06.06 |
| [docker/도커] 도커 허브 사용하기 /도커 이미지 배포 (0) | 2023.06.06 |
- Total
- Today
- Yesterday
- softeer java
- mysql
- 자바
- Linux
- nginx
- 현대코테
- 현대오토에버
- 오토에버코테
- 쿠버네티스
- Docker
- 전자정부프레임워크
- 스프링
- softeer
- 코테
- Spring
- centos
- java
- 자바스크립트
- springboot
- 리액트
- gcp
- javascript
- 톰캣
- 도커
- 코딩테스트
- Kubernetes
- 자바코테
- react
- tomcat
- 아파치카프카
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |