Docker 네트워크 완전 정리 컨테이너끼리 어떻게 통신하는가?


도커를 사용하다 보면 이런 상황이 자주 생깁니다.

  • “웹 서버가 DB 컨테이너에 접근이 안 돼요.”
  • “같은 서버인데 ping이 안 먹히네요.”
  • “포트를 열었는데 외부에서는 접속되는데, 내부에서는 왜 안 되죠?”

이 모든 문제의 핵심은 바로 Docker 네트워크 구조입니다.
이번 글에서는 컨테이너 간 통신이 어떻게 구성되고, 어디서 막히는지
쉽게 이해할 수 있게 정리합니다.


1. Docker 네트워크의 기본 개념

Docker는 컨테이너 간의 통신을 위해 자체적인 가상 네트워크 계층을 운영합니다.
즉, 도커 안에는 “작은 내부 네트워크”가 여러 개 존재하며,
각 컨테이너는 이 중 하나에 연결되어 있습니다.

Docker 설치 시 기본적으로 다음 네 가지 네트워크가 자동 생성됩니다.

docker network ls

결과 예시:

NETWORK ID     NAME      DRIVER    SCOPE
c6c12b4e5e2b   bridge    bridge    local
b3d9b4a1c9d7   host      host      local
8e03ef56ad1f   none      null      local

2. 기본 네트워크 종류

네트워크 유형설명특징
bridge기본 네트워크도커가 자동 생성, 내부 통신용
host호스트와 공유포트 매핑 없이 로컬 네트워크 직접 사용
none네트워크 없음격리 환경 테스트용
custom bridge사용자가 직접 생성한 bridge같은 이름의 네트워크 내 컨테이너끼리 통신 가능

3. Bridge 네트워크 — 도커의 기본 통신망

도커에서 컨테이너를 그냥 띄우면 (docker run),
자동으로 bridge 네트워크에 연결됩니다.

예시:

docker run -d --name web nginx
docker run -d --name db mysql

두 컨테이너 모두 bridge 네트워크에 속하지만,
기본 설정으로는 컨테이너 이름으로 직접 접근 불가합니다.
(즉, ping db 하면 안 됨)

이유: 기본 bridge는 DNS 서비스를 제공하지 않기 때문입니다.


4. Custom Bridge 네트워크 — 이름으로 통신 가능

컨테이너끼리 이름으로 통신하려면 사용자 정의 네트워크를 만들어야 합니다.

# 사용자 정의 네트워크 생성
docker network create mynetwork

그다음 컨테이너를 띄울 때 이렇게 연결합니다:

docker run -d --name web --network mynetwork nginx
docker run -d --name db --network mynetwork mysql

이제 컨테이너 내부에서 다음이 가능합니다:

ping db
# ✅ 정상 응답

mynetwork 내부에서는 DNS 서버가 자동으로 작동하므로,
컨테이너 이름을 호스트명처럼 사용할 수 있습니다.


5. Docker Compose에서의 네트워크

Docker Compose를 쓰면 자동으로 같은 네트워크를 공유합니다.

docker-compose.yml

version: "3.8"

services:
  web:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: test1234

이 상태에서 실행하면 👇

docker-compose up -d

자동으로 projectname_default 네트워크가 만들어지고
webdb가 같은 네트워크에 연결됩니다.

즉, web 컨테이너에서 db:3306 으로 접근이 가능합니다.


6. Host 네트워크 — 로컬 머신과 동일한 IP 사용

docker run -d --name myserver --network host nginx

이렇게 하면 컨테이너는
호스트(즉, 내 컴퓨터)의 네트워크 스택을 그대로 사용합니다.

  • 포트 매핑(-p) 불필요
  • 퍼포먼스 향상 (가상화 계층 제거)
  • 단, 포트 충돌 가능성이 있음

주의:
Windows나 macOS의 Docker Desktop 환경에서는
--network host 가 완전히 동일하게 동작하지 않습니다.
(WSL 내부에서만 완전 지원)


7. None 네트워크 — 완전한 격리 환경

docker run -d --network none busybox sleep 1000

이 컨테이너는 아무 네트워크에도 연결되지 않음
즉, 외부 통신 불가, 내부 네트워크 불가.
완전한 샌드박스 환경입니다.

테스트용, 보안 연구용으로 사용됩니다.


8. 네트워크 연결 및 확인 명령어

명령어설명
docker network ls네트워크 목록 보기
docker network inspect <name>네트워크 상세 정보
docker network create mynet네트워크 생성
docker network connect mynet container컨테이너 추가 연결
docker network disconnect mynet container컨테이너 연결 해제
docker network rm mynet네트워크 삭제

9. 실제 구조 이해를 위한 시각적 정리

 ┌────────────────────────────┐
 │        mynetwork           │
 │ ┌───────────────┐          │
 │ │ web (nginx)   │ ←→ db(mysql)
 │ └───────────────┘          │
 └────────────────────────────┘
         │
         ▼
   외부로는 포트 8080:80 연결

도커 내부에서는 web → db:3306 으로 직접 연결되고,
외부 브라우저에서는 localhost:8080 으로 접근할 수 있습니다.


10. Docker 네트워크의 핵심 정리

구분설명
기본 bridge도커 기본 네트워크, DNS 미지원
Custom bridge사용자 생성 네트워크, DNS 지원
Host호스트 네트워크 직접 사용
None완전 격리
Compose자동으로 하나의 네트워크에 묶임
이름 기반 통신Custom bridge 이상에서 가능

결론

도커의 네트워크는 “가상의 내부 LAN”처럼 작동합니다.
각 컨테이너는 고유한 IP를 갖지만,
같은 네트워크 안에서는 이름으로 통신할 수 있고,
외부와의 연결은 포트 매핑을 통해 이뤄집니다.

즉,

  • bridge: 내부 통신
  • port: 외부 노출
  • DNS: 이름 기반 통신
    이 세 가지를 이해하면 도커 네트워크의 전부를 이해한 것입니다.