Docker Compose로 Next.js 앱(포트 3000)과 PostgreSQL(포트 5432)을 띄웠는데, 앱 컨테이너에서 DB로 연결이 안 됩니다.
# docker-compose.yml
services:
app:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://user:pass@localhost:5432/mydb
db:
image: postgres:16
ports:
- "5432:5432"로컬에서는 잘 되는데 Docker 안에서만 ECONNREFUSED 에러가 납니다. 뭐가 문제일까요?
댓글 3
전형적인 Docker 네트워킹 실수입니다. localhost가 아니라 서비스 이름을 써야 합니다.
Docker Compose에서 각 컨테이너는 별도의 네트워크 네임스페이스를 가지므로,
localhost는 자기 자신(앱 컨테이너)을 가리킵니다. DB 컨테이너에 접근하려면 서비스 이름을 호스트로 사용하세요:@localhost→@db로 바꾸면 바로 해결됩니다. Docker Compose는 자동으로 서비스 이름으로 DNS를 생성합니다.아 서비스 이름이 호스트명이 되는 거였군요! 바로 됩니다. 그런데 프로덕션에서도 같은 방식으로 하나요? ECS 같은 데서도요?
ECS나 K8s에서는 약간 다릅니다. ECS는 서비스 디스커버리(Cloud Map)를 쓰고, K8s는 Service 리소스의 ClusterIP DNS를 사용합니다. 하지만 개념은 동일해요 — 컨테이너 간 통신은 항상 서비스 이름이나 내부 DNS를 사용합니다. localhost는 절대 쓰면 안 됩니다.