본문 바로가기
Q&A해결2026년 4월 9일1분 읽기

Docker Compose에서 컨테이너 간 통신이 안 됩니다

개
개발자준호
조회 458댓글 3

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

김김영삼6개월 전

전형적인 Docker 네트워킹 실수입니다. localhost가 아니라 서비스 이름을 써야 합니다.

Docker Compose에서 각 컨테이너는 별도의 네트워크 네임스페이스를 가지므로, localhost는 자기 자신(앱 컨테이너)을 가리킵니다. DB 컨테이너에 접근하려면 서비스 이름을 호스트로 사용하세요:

DATABASE_URL: postgresql://user:pass@db:5432/mydb

@localhost → @db로 바꾸면 바로 해결됩니다. Docker Compose는 자동으로 서비스 이름으로 DNS를 생성합니다.

개개발자준호6개월 전

아 서비스 이름이 호스트명이 되는 거였군요! 바로 됩니다. 그런데 프로덕션에서도 같은 방식으로 하나요? ECS 같은 데서도요?

김김영삼6개월 전

ECS나 K8s에서는 약간 다릅니다. ECS는 서비스 디스커버리(Cloud Map)를 쓰고, K8s는 Service 리소스의 ClusterIP DNS를 사용합니다. 하지만 개념은 동일해요 — 컨테이너 간 통신은 항상 서비스 이름이나 내부 DNS를 사용합니다. localhost는 절대 쓰면 안 됩니다.

Ctrl+Enter로 등록