Docker 가이드·약 5분 내외

Docker Compose 네트워킹 — 컨테이너끼리 어떻게 통신하는가

같은 compose 파일 안에서는 서비스명으로 통신하고, 외부에서는 container_name을 사용합니다. Docker 네트워크의 기본 개념과 헷갈리기 쉬운 이름 체계를 깔끔하게 정리해 드립니다.

아키텍처 구조도

다이어그램 렌더링 중...

Docker 네트워크 기본 개념

Docker 컨테이너들은 기본적으로 서로 완전히 격리되어 있습니다. 컨테이너 A에서 컨테이너 B로 통신하려면 두 컨테이너가 같은 Docker 네트워크 안에 있어야 합니다.

자동으로 생성되는 default 네트워크

docker-compose.yml 파일이 있는 폴더에서 docker-compose up을 실행하면, Docker는 자동으로 해당 프로젝트 이름으로 된 default 네트워크를 만듭니다. 그리고 그 yml 파일 안에 있는 모든 컨테이너를 그 네트워크에 연결해 줍니다.

서비스명 vs container_name

서비스명 (Service Name)

  • docker-compose.yml에 작성한 key 이름 (예: server-blue)
  • 같은 compose 파일 내부에서만 유효한 DNS
  • 다른 compose 파일에서는 이 이름으로 호출 불가

컨테이너명 (Container Name)

추천
  • container_name 속성으로 명시적으로 지정한 이름
  • Docker 네트워크 전체에서 유효한 고유 이름
  • 지정하지 않으면 프로젝트명-서비스명-1 형태로 자동 생성됨
docker-compose.yml 예시
services:
  # 'server-blue'가 서비스명
  server-blue:
    image: my-backend-image
    # 'quizzer-server-blue'가 컨테이너명
    container_name: quizzer-server-blue
    ports:
      - "8000:8000"

  web:
    image: my-frontend-image
    environment:
      # 같은 compose 안이므로 서비스명(server-blue) 사용 가능!
      - API_URL=http://server-blue:8000

외부 네트워크로 다른 compose와 연결하기

NGINX 역방향 프록시처럼 여러 프로젝트(compose)를 하나로 묶어야 할 때가 있습니다. 이럴 때는 외부에서 미리 만들어둔 공용 네트워크(external network)를 사용합니다.

외부 네트워크(web-proxy) 연결 예시
services:
  web:
    image: my-app
    networks:
      - default
      - web-proxy  # 공용 네트워크 연결

networks:
  web-proxy:
    external: true # 이 네트워크는 다른 곳에서 이미 만들어졌다는 뜻

위처럼 설정하면 공용 NGINX 컨테이너가 속한 web-proxy 네트워크에 내 컨테이너도 접속하게 되어, 서로 통신할 수 있습니다.

흔한 실수와 디버깅

이렇게 하지 마세요

  • 컨테이너 안에서 http://localhost:8000 호출하기 (자기 자신을 가리키게 됨)
  • 다른 compose에 있는 컨테이너를 서비스명으로 호출하기 (DNS 못 찾음)
  • docker run 할 때 --network 옵션 빼먹기

이렇게 하세요

  • 같은 compose 안에서는 서비스명(server-blue) 사용하기
  • 호스트 PC에서 접속할 때만 localhost 사용하기
  • API 주소를 환경변수(API_URL)로 분리해두기
Q

curl을 날렸는데 "Could not resolve host" 에러가 나면요?

A

DNS 이름(서비스명이나 컨테이너명)을 찾을 수 없다는 뜻입니다. 두 컨테이너가 같은 네트워크에 속해 있는지 docker network inspect 명령어로 확인해 보세요.

지금 바로 시작해보세요

AI 보안 프롬프트

AI로 보안 점검,
더 스마트하게

AI 탭에서 보안 프롬프트를 실행하고 취약점을 자동으로 찾아보세요