[Docker] 컨테이너 통신: Bridge부터 User-defined까지

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, 네트워크 격리, 확장성 면에서 실서비스에 추천