1. 여는 글
Docker를 처음 사용하면 컨테이너 실행에 집중하지만 곧 이런 질문이 생깁니다.
"컨테이너끼리는 어떻게 서로 통신하지?"
"내 컨테이너는 인터넷에 어떻게 접속하지?"
"외부에서 내 컨테이너의 웹 서비스는 어떻게 접근할까?"
이 모든 질문의 중심에는 Docker Bridge 네트워크가 있습니다.
이 글에서는 Docker 공식 문서를 바탕으로,
Bridge 네트워크의 개념과 왜 사용자 정의 브리지(user-defined bridge)를 사용하는 것이 좋은지 정리해보겠습니다.
2. Bridge 네트워크
Bridge 네트워크는 Docker 호스트 내부에서 컨테이너들을 연결하는 가상의 스위치입니다.
즉, 같은 Bridge 네트워크에 속한 컨테이너들은 마치 하나의 LAN(사설망) 안에 있는 것처럼 연결됩니다.
Bridge 네트워크는 크게 3가지 역할을 수행합니다.
1) 컨테이너 간 통신
같은 브리지 네트워크에 연결된 컨테이너는 서로를 사설 IP로 접근할 수 있습니다.
172.17.0.2 ←→ 172.17.0.3
같은 네트워크에 속하면 별도의 포트 포워딩 없이도 서로 통신할 수 있습니다.
2) 외부(인터넷) 접속 — NAT Masquerading
컨테이너가 외부 인터넷에 접속할 때는 호스트의 공인 IP를 빌려 씁니다.
즉, 외부에서는 컨테이너가 아니라 “호스트”가 보이는 것처럼 동작합니다.
🤔 마스커레이딩이면 해킹 트래픽을 위장하는 데 쓸 수 있는 거 아니야?
- 추적은 피할 수 없습니다. 출발지 IP는 서버 로그에 그대로 남습니다.
- 탐지는 과거에는 피할 수 있었지만(
포트 마스커레이딩 기법), 현대의 NGFW는 패킷 내용을 검사하기 때문에 우회를 거의 허용하지 않습니다.
| 구분 | 과거(L4 방화벽) | 현재(NGFW) |
| 검사 기준 | 포트 번호만 봄 | 포트 + 내부 데이터 내용까지 검사 |
| 포트 마스커레이딩 효과 | 위장 가능 | 무력화됨 |
🤔 NAT와 VPN랑 결국 같은 기능 아니야?
| 기능 | NAT 마스커레이딩 | VPN |
| 목적 | 사설 IP → 공인 IP 주소 변환 | 데이터 보호 & 위치/신원 숨김 |
| 암호화 | 없음 | 기본적으로 암호화 |
| 적용 범위 | 로컬 네트워크 경계 | 인터넷 전반 |
→ NAT은 주소 공유, VPN은 보안이 핵심 기능입니다.
3) 외부에서 컨테이너에 접속 — Port Forwarding
외부에서 컨테이너 내부의 서비스에 접근하려면,
호스트 포트를 컨테이너 포트에 연결해야 합니다.
docker run -p 8080:80 nginx
| 호스트 | 컨테이너 |
| localhost:8080 | 80 port (nginx) |
즉, 외부 → 호스트 → 컨테이너 로 연결되는 구조입니다.
3. Bridge 네트워크 드라이버가 실제로 하는 일
Bridge 네트워크는 단순히 "컨테이너를 묶는 가상의 LAN" 이 아니라,
다음과 같은 정책(Policy) 을 기본적으로 실행합니다.
| 동작 | 설명 |
| 컨테이너 간 통신 허용 | 같은 브리지 네트워크에 연결된 컨테이너는 서로 접근 가능 |
| 외부에서 컨테이너 직접 접근 차단 | 다른 네트워크/외부 호스트는 기본적으로 접근 불가 |
| NAT 마스커레이딩 활성화 | 컨테이너가 외부 인터넷과 통신할 때 호스트 IP로 변환 |
| 포트 게시(Port Publishing) 지원 | -p 8080:80 등으로 호스트에서 컨테이너 서비스 접근 가능 |
즉, 브리지는 접근 허용 범위(내부) 와 접근 차단 범위(외부) 를 명확히 하고,
필요한 경우에만 포트를 열어 서비스가 노출되도록 설계되어 있습니다.
4. 기본 Bridge 네트워크가 가진 한계 (bridge)
Docker를 설치하면 자동으로 bridge 라는 기본 네트워크가 하나 생성됩니다.
docker network ls
하지만 기본 브리지 네트워크는 실제 서비스용으로는 비추천됩니다.
이유는 다음과 같습니다.
| 문제점 | 설명 |
| 컨테이너 이름 기반 DNS 미지원 | 컨테이너끼리 IP 주소로만 접근 가능 |
| 불필요하게 많은 컨테이너가 한 네트워크로 몰림 | 서비스 간 격리(Isolation) 에 취약 |
| 네트워크 설정 변경이 어려움 | 변경 시 Docker 재시작 필요 |
| 컨테이너 연결 변경이 번거로움 | 네트워크 변경하려면 컨테이너 재생성 필요 |
즉, 기본 브리지는 개발 테스트용일 뿐,
서비스 구조가 생기기 시작하면 금방 불편함이 드러납니다.
5. 사용자 정의 브리지(User-defined Bridge)를 사용해야 하는 이유
사용자 정의 브리지를 만들면,
컨테이너는 IP가 아니라 이름으로 서로를 인식할 수 있습니다.
docker network create my-net
그리고 컨테이너를 여기에 붙이면
docker run -d --name db --network my-net mysql
docker run -d --name web --network my-net nginx
이제 web 컨테이너에서
mysql -h db
처럼 DB IP를 모른 채 이름으로 접근할 수 있습니다.
사용자 정의 브리지가 제공하는 핵심 이점
| 항목 | 기본 bridge | 사용자 정의 bridge |
| 컨테이너 이름으로 통신 | IP 직접 입력해야 함 | 자동 DNS 지원 |
| 서비스 간 네트워크 격리 | 모두 한 네트워크에 섞임 | 네트워크 단위로 서비스 그룹 분리 |
| 컨테이너 네트워크 연결 변경 | 재생성 필요 | 실행 중에도 attach/detach 가능 |
| 네트워크 세부 설정 | 제한적 | MTU, 게이트웨이, 서브넷 등 유연한 설정 |
→ 마이크로서비스 환경이라면 사용자 정의 브리지는 사실상 필수입니다.
6. 브리지 네트워크의 적용 범위 (단일 호스트 한계 & 확장)
여기까지 설명한 Bridge 네트워크는 하나의 Docker 데몬 호스트(Docker 엔진이 돌아가는 실제 서버) 내에서만 적용됩니다.
즉, 컨테이너들이 같은 물리/가상 서버(= 같은 Docker Engine)에 있을 때만 서로 통신할 수 있습니다.
| 네트워크 종류 | 통신 가능 범위 | 용도 |
| bridge | 단일 Docker 호스트 내부 | 로컬 개발, 단일 서버 서비스 |
| overlay | 여러 Docker 호스트 간 | 분산 서비스 / Kubernetes / Swarm |
| macvlan | 컨테이너를 물리 네트워크에 직접 노출 | 레거시 장비와 통신 필요할 때 |
| host network | 컨테이너가 호스트 네트워크를 그대로 사용 | 성능 최적화 / 실시간 트래픽 서비스 |
데몬 호스트(Docker Engine Host)
Docker 네트워킹은 “하나의 Docker 데몬(Engine)”을 단위로 구성됩니다.
즉, Bridge 네트워크는 서버 1대 안에서만 동작합니다.
[Host A] 172.17.0.0/16 ← Bridge
[Host B] 172.18.0.0/16 ← Bridge
→ 서로 직접 통신할 수 없음
그러면 여러 서버의 컨테이너끼리는 어떻게 연결할까?
여기서 등장하는 개념이 오버레이 네트워크(Overlay Network) 입니다.
오버레이 네트워크 (Overlay Network)
오버레이는 여러 Docker 호스트 위의 컨테이너들을 하나의 네트워크처럼 연결합니다.
[Host A] [Host B]
web (overlay) ↔ db (overlay)
물리 네트워크 위에 가상 네트워크를 또 얹는 구조이기 때문에 “Overlay”라고 부릅니다.
오버레이 네트워크는 다음 환경에서 주로 사용됩니다.
- Kubernetes
- Docker Swarm
- HashiCorp Nomad
- Multi-host Docker Compose (Docker Swarm Mode)
Swarm과 Overlay
Docker Swarm은 Docker의 클러스터링 & 서비스 오케스트레이션 시스템입니다.
- 여러 Docker 호스트를 하나의 클러스터로 묶고
- 컨테이너 대신 서비스 단위로 배포/확장하며
- 서비스 간 통신은 오버레이 네트워크를 통해 수행됩니다.
| 개념 | 설명 |
| Swarm | 여러 Docker 호스트를 하나의 클러스터로 묶는 기술 |
| Service | 컨테이너 그룹(Replica)을 다루는 단위 |
| Overlay Network | Swarm 서비스끼리 통신하도록 연결하는 네트워크 |
요약하면
| 환경 | 네트워크 | 설명 |
| 단일 서버 | bridge / user-defined bridge | 지금까지 설명한 네트워킹 |
| 여러 서버 클러스터 | overlay (Swarm / K8s) | 분산 환경 네트워크 통신 방식 |
→ Bridge는 단일 머신 내 통신, Overlay는 여러 머신 간 통신입니다.
7. 사용자 정의 브리지 네트워크 생성 & 사용 예시
네트워크 생성
docker network create my-net
네트워크에 컨테이너 연결하여 실행
docker run -d --name my-nginx --network my-net -p 8080:80 nginx
이미 실행 중인 컨테이너를 네트워크에 연결
docker network connect my-net my-nginx
연결 해제
docker network disconnect my-net my-nginx
8. 요약
| 개념 | 핵심 내용 |
| Bridge 네트워크 | 컨테이너를 하나의 사설 네트워크(LAN)처럼 연결 |
| 외부 접속 | NAT 마스커레이딩으로 호스트 IP를 사용 |
| 외부에서 접근 | 포트 포워딩(-p) 필요 |
| 사용자 정의 브리지 | DNS, 네트워크 격리, 확장성 면에서 실서비스에 추천 |