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 네트워크가 만들어지고web과 db가 같은 네트워크에 연결됩니다.
즉, 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: 이름 기반 통신
이 세 가지를 이해하면 도커 네트워크의 전부를 이해한 것입니다.