Docker Network란? Bridge·Host·None·Overlay 네트워크와 컨테이너 통신 완벽 이해

Docker 컨테이너는 기본적으로 독립된 실행 환경을 가집니다. 하지만 실제 서비스를 구성하려면 웹 서버, 애플리케이션 서버, 데이터베이스 등 여러 컨테이너가 서로 통신해야 합니다.

예를 들어 쇼핑몰 서비스를 운영한다면 Nginx 컨테이너는 애플리케이션 컨테이너에 요청을 전달해야 하고, 애플리케이션 컨테이너는 MySQL과 Redis 컨테이너에 접근해야 합니다.

이러한 컨테이너 간 통신을 관리하는 기능이 바로 Docker Network입니다.

Docker Engine은 bridge, host, none, overlay, ipvlan, macvlan 등 여러 네트워크 드라이버를 제공합니다. 이 중 단일 서버에서는 Bridge 네트워크를 가장 많이 사용하고, 여러 Docker 호스트를 연결할 때는 Overlay 네트워크를 활용할 수 있습니다.

이번 글에서는 Docker Network의 기본 개념부터 Bridge, Host, None, Overlay 네트워크의 차이, 컨테이너 간 통신 방법과 실무 명령어까지 자세히 알아보겠습니다.

Table of Contents

Docker Network란?

Docker Network는 컨테이너가 다른 컨테이너, Docker 호스트 또는 외부 인터넷과 통신할 수 있도록 연결하는 네트워크 기능입니다.

전체 구조는 다음과 같습니다.

Internet

↓

Docker Host

↓

Docker Network

├── Nginx Container
├── Application Container
├── MySQL Container
└── Redis Container

같은 Docker Network에 연결된 컨테이너는 설정에 따라 서로 통신할 수 있습니다.

Docker Network가 필요한 이유

Docker Network를 사용하면 다음과 같은 작업이 가능합니다.

  • 컨테이너 간 통신
  • 외부 인터넷 접속
  • 호스트 포트와 컨테이너 포트 연결
  • 서비스별 네트워크 분리
  • 컨테이너 이름을 이용한 통신
  • 여러 Docker 호스트 간 통신
  • 외부 접근이 필요 없는 내부망 구성

예를 들어 데이터베이스 컨테이너를 외부에 직접 공개하지 않고 애플리케이션 컨테이너에서만 접근하도록 구성할 수 있습니다.

Docker 기본 네트워크 확인

Docker를 설치하면 기본 네트워크가 생성됩니다.

docker network ls

일반적인 출력 형태는 다음과 같습니다.

NETWORK ID     NAME       DRIVER     SCOPE
xxxxxxxxxxxx   bridge     bridge     local
xxxxxxxxxxxx   host       host       local
xxxxxxxxxxxx   none       null       local

Docker의 기본 내장 네트워크에는 bridge, host, none이 있습니다. 사용자가 별도로 생성한 네트워크는 Custom Network로 구분할 수 있습니다.

Docker Network Driver란?

Network Driver는 컨테이너의 네트워크 연결 방식을 결정합니다.

대표적인 드라이버는 다음과 같습니다.

  • Bridge
  • Host
  • None
  • Overlay
  • Macvlan
  • IPvlan

각 드라이버는 사용 목적과 네트워크 구조가 다릅니다.

Bridge Network란?

Bridge는 Docker에서 기본으로 사용하는 네트워크 드라이버입니다.

별도의 네트워크를 지정하지 않고 컨테이너를 실행하면 기본적으로 Bridge 네트워크에 연결됩니다.

docker run -d nginx

구조는 다음과 같습니다.

Docker Host

↓

Bridge Network

├── Container A
├── Container B
└── Container C

Bridge 네트워크는 같은 Docker 호스트에 있는 컨테이너를 연결하면서, 다른 네트워크에 연결된 컨테이너와는 격리하는 방식입니다.

기본 Bridge Network 확인

기본 Bridge 네트워크의 상세 정보를 확인합니다.

docker network inspect bridge

확인할 수 있는 정보는 다음과 같습니다.

  • 네트워크 이름
  • 네트워크 드라이버
  • 서브넷
  • 게이트웨이
  • 연결된 컨테이너
  • 컨테이너 IP 주소

사용자 정의 Bridge Network 생성

실무에서는 기본 Bridge보다 사용자 정의 Bridge Network를 사용하는 것이 좋습니다.

docker network create app-network

별도로 드라이버를 지정하지 않으면 Bridge 방식으로 생성됩니다. Docker Engine 설치 시 기본 Bridge 네트워크도 자동으로 만들어집니다.

생성 결과를 확인합니다.

docker network ls

컨테이너를 네트워크에 연결하기

컨테이너 실행 시 --network 옵션을 사용합니다.

docker run -d \
--name web \
--network app-network \
nginx

MySQL 컨테이너도 같은 네트워크에 연결합니다.

docker run -d \
--name database \
--network app-network \
-e MYSQL_ROOT_PASSWORD=password \
mysql:8.4

두 컨테이너는 같은 app-network에 연결됩니다.

컨테이너 이름으로 통신하기

사용자 정의 Bridge Network에서는 컨테이너 이름을 이용해 다른 컨테이너에 접근할 수 있습니다.

예를 들어 웹 컨테이너에서 데이터베이스 컨테이너를 확인합니다.

docker exec web ping database

애플리케이션의 데이터베이스 주소도 IP가 아니라 다음처럼 지정할 수 있습니다.

DB_HOST=database

컨테이너 IP는 재생성 과정에서 변경될 수 있으므로 IP 주소를 직접 입력하기보다 컨테이너 이름이나 Compose 서비스 이름을 사용하는 것이 좋습니다.

Docker Compose가 생성하는 기본 네트워크에서도 각 서비스는 서비스 이름으로 검색되고 접근될 수 있습니다.

기본 Bridge와 사용자 정의 Bridge의 차이

항목기본 Bridge사용자 정의 Bridge
자동 연결기본 연결직접 지정
이름 기반 통신제한적지원
서비스 분리어려움편리함
네트워크 관리단순함유연함
실무 활용테스트 중심서비스 운영 중심

기본 Bridge에 연결된 컨테이너는 서비스 이름을 이용한 이름 해석에 제한이 있으므로, 컨테이너 간 통신이 필요하다면 사용자 정의 네트워크를 사용하는 편이 좋습니다.

실행 중인 컨테이너를 네트워크에 연결하기

이미 실행 중인 컨테이너도 네트워크에 추가할 수 있습니다.

docker network connect app-network web

연결 상태를 확인합니다.

docker network inspect app-network

컨테이너를 네트워크에서 분리하기

docker network disconnect app-network web

컨테이너가 여러 네트워크에 연결되어 있다면 특정 네트워크에서만 분리할 수 있습니다.

Host Network란?

Host Network는 컨테이너가 Docker 호스트의 네트워크를 직접 사용하는 방식입니다.

docker run -d \
--network host \
nginx

구조는 다음과 같습니다.

Container

↓

Host Network Interface

↓

External Network

Bridge Network처럼 별도의 가상 네트워크를 거치지 않으며 컨테이너와 호스트 사이의 네트워크 격리가 제거됩니다.

Host Network의 특징

Host Network의 주요 특징은 다음과 같습니다.

  • 호스트 네트워크를 직접 사용
  • 별도 컨테이너 IP가 없음
  • 포트 매핑이 필요하지 않음
  • 네트워크 격리가 약함
  • 호스트 포트 충돌 가능

예를 들어 Nginx가 컨테이너 내부에서 80번 포트를 사용하면 호스트의 80번 포트를 직접 사용합니다.

따라서 다음과 같은 -p 옵션은 일반적인 Host Network 구성에서 의미가 없습니다.

docker run --network host -p 8080:80 nginx

Host Network는 Docker Engine on Linux에서 사용할 수 있으며, Docker Desktop에서는 지원 환경과 설정 여부를 확인해야 합니다.

None Network란?

None Network는 컨테이너의 외부 네트워크 연결을 완전히 차단하는 방식입니다.

docker run -it \
--network none \
ubuntu:24.04

구조는 다음과 같습니다.

Container

↓

Network Disabled

None Network를 사용하면 컨테이너에는 기본적으로 루프백 장치만 생성됩니다. 따라서 다른 컨테이너, Docker 호스트, 외부 인터넷과 통신할 수 없습니다.

None Network 사용 사례

다음과 같은 상황에서 사용할 수 있습니다.

  • 네트워크가 필요 없는 배치 작업
  • 외부 통신을 차단한 테스트
  • 보안 분석 환경
  • 로컬 계산 작업
  • 격리가 필요한 임시 컨테이너

예를 들어 외부 접속이 필요 없는 파일 변환 작업을 수행할 수 있습니다.

docker run --rm \
--network none \
my-converter

Overlay Network란?

Overlay Network는 서로 다른 Docker 호스트에 있는 컨테이너를 하나의 네트워크처럼 연결하는 방식입니다.

구조는 다음과 같습니다.

Docker Host A
└── Container A

        ↓ Overlay Network

Docker Host B
└── Container B

Overlay 드라이버는 여러 Docker Daemon이 동작하는 호스트 사이에 분산 네트워크를 생성합니다. Docker Swarm 환경에서 여러 노드의 컨테이너 또는 서비스를 연결할 때 사용할 수 있습니다.

Overlay Network 생성

Docker Swarm을 초기화합니다.

docker swarm init

Overlay Network를 생성합니다.

docker network create \
--driver overlay \
app-overlay

Swarm Service를 네트워크에 연결합니다.

docker service create \
--name web \
--network app-overlay \
nginx

Overlay Network는 단일 서버의 일반 컨테이너 통신보다 여러 Docker 호스트를 연결해야 하는 환경에서 주로 사용합니다.

Bridge·Host·None·Overlay 비교

네트워크주요 목적격리 수준사용 범위
Bridge같은 호스트의 컨테이너 통신높음단일 Docker 호스트
Host호스트 네트워크 직접 사용낮음주로 단일 Linux 호스트
None네트워크 완전 차단매우 높음독립 작업
Overlay여러 호스트의 컨테이너 연결환경에 따라 다름Docker Swarm

Docker 포트 매핑 이해하기

Bridge Network에 연결된 컨테이너를 외부에 공개하려면 포트 매핑을 사용합니다.

docker run -d \
--name web \
-p 8080:80 \
nginx

의미는 다음과 같습니다.

사용자 요청

↓

Docker Host 8080

↓

Nginx Container 80

브라우저에서는 다음 주소로 접속합니다.

http://서버IP:8080

EXPOSE와 포트 매핑의 차이

Dockerfile의 EXPOSE는 컨테이너가 사용하는 포트를 문서화하는 역할입니다.

EXPOSE 80

실제로 외부에서 접속할 수 있도록 포트를 공개하려면 docker run-p 옵션이 필요합니다.

docker run -d -p 8080:80 nginx

Docker Compose에서 Network 사용하기

Docker Compose에서는 여러 서비스를 하나의 네트워크에 연결할 수 있습니다.

services:
  web:
    image: nginx:1.27
    networks:
      - frontend

  app:
    image: myapp:1.0
    networks:
      - frontend
      - backend

  database:
    image: mysql:8.4
    environment:
      MYSQL_ROOT_PASSWORD: password
    networks:
      - backend

networks:
  frontend:
  backend:

구조는 다음과 같습니다.

frontend Network
├── web
└── app

backend Network
├── app
└── database

웹 컨테이너는 데이터베이스에 직접 접근하지 못하고, 애플리케이션 컨테이너만 두 네트워크에 모두 연결됩니다.

이러한 방식으로 서비스 역할에 따라 네트워크를 분리할 수 있습니다.

네트워크 상세 정보 확인

docker network inspect app-network

출력 결과에서 다음 항목을 확인할 수 있습니다.

  • Driver
  • Scope
  • Subnet
  • Gateway
  • 연결된 컨테이너
  • 컨테이너 IP
  • 네트워크 옵션

사용하지 않는 네트워크 삭제

특정 네트워크를 삭제합니다.

docker network rm app-network

현재 컨테이너가 연결되어 있다면 네트워크를 바로 삭제할 수 없습니다.

컨테이너 연결을 먼저 해제해야 합니다.

docker network disconnect app-network web

그다음 네트워크를 삭제합니다.

docker network rm app-network

사용하지 않는 네트워크 일괄 정리

docker network prune

사용 중이지 않은 사용자 정의 네트워크를 정리합니다.

삭제 전 확인 메시지가 표시되므로 내용을 확인한 뒤 진행해야 합니다.

Docker Network 문제 확인 방법

컨테이너 간 통신이 되지 않는다면 다음 순서로 확인합니다.

1. 네트워크 목록 확인

docker network ls

2. 컨테이너 연결 상태 확인

docker network inspect app-network

3. 컨테이너 IP 확인

docker inspect web

4. 이름 기반 통신 확인

docker exec web ping database

단, 일부 경량 이미지는 ping 명령이 설치되어 있지 않을 수 있습니다.

5. 포트 연결 상태 확인

docker ps

PORTS 항목에서 호스트와 컨테이너 포트의 연결 상태를 확인합니다.

6. 애플리케이션 수신 주소 확인

애플리케이션이 다음처럼 로컬 주소만 수신하면 외부 컨테이너에서 접근하지 못할 수 있습니다.

127.0.0.1

컨테이너 외부에서도 접근해야 한다면 애플리케이션 특성에 따라 다음 주소로 수신하도록 설정합니다.

0.0.0.0

실무에서 자주 사용하는 명령어

Docker 네트워크 목록 확인

docker network ls

네트워크 생성

docker network create app-network

네트워크 상세 정보 확인

docker network inspect app-network

컨테이너 실행과 동시에 연결

docker run -d \
--name web \
--network app-network \
nginx

실행 중인 컨테이너 연결

docker network connect app-network web

네트워크 연결 해제

docker network disconnect app-network web

네트워크 삭제

docker network rm app-network

미사용 네트워크 정리

docker network prune

실무 사례

온라인 쇼핑몰 서비스를 Docker로 운영한다고 가정해 보겠습니다.

서비스는 다음과 같이 구성됩니다.

  • Nginx
  • Spring Boot
  • MySQL
  • Redis

운영자는 외부 요청을 처리하는 frontend-network와 내부 데이터 통신을 위한 backend-network를 생성합니다.

docker network create frontend-network

docker network create backend-network

Nginx와 Spring Boot는 Frontend Network에 연결합니다.

frontend-network

├── nginx
└── spring-app

Spring Boot, MySQL, Redis는 Backend Network에 연결합니다.

backend-network

├── spring-app
├── mysql
└── redis

이 구조에서는 Nginx가 MySQL에 직접 접근할 수 없습니다. 애플리케이션 컨테이너만 데이터베이스와 캐시 서버에 접근할 수 있으므로 네트워크 구조가 더 명확해집니다.

또한 MySQL과 Redis의 포트를 외부에 공개하지 않아도 같은 Backend Network에 연결된 Spring Boot 컨테이너에서 서비스 이름으로 접근할 수 있습니다.

자주 묻는 질문

Docker 컨테이너는 기본적으로 인터넷에 접속할 수 있나요?

일반적인 Bridge Network 환경에서는 Docker 호스트의 네트워크를 통해 외부 인터넷에 접속할 수 있습니다. 다만 호스트 방화벽, 프록시, DNS 및 Docker Daemon 설정에 따라 접속이 제한될 수 있습니다.

컨테이너끼리 통신할 때 IP 주소를 사용해야 하나요?

사용자 정의 Bridge Network나 Docker Compose 환경에서는 컨테이너 이름 또는 서비스 이름을 사용하는 것이 좋습니다. 컨테이너 IP는 재생성 시 변경될 수 있기 때문입니다.

Bridge Network와 Host Network 중 무엇을 사용해야 하나요?

대부분의 일반적인 컨테이너 서비스에서는 Bridge Network를 사용합니다. Host Network는 네트워크 격리가 필요하지 않거나 호스트 네트워크를 직접 사용해야 하는 특별한 경우에 선택합니다.

서로 다른 Docker 서버의 컨테이너도 통신할 수 있나요?

가능합니다. Docker Swarm의 Overlay Network 또는 Kubernetes와 같은 컨테이너 오케스트레이션 환경을 이용하면 여러 서버에 분산된 컨테이너를 연결할 수 있습니다.

Docker Compose에서 Network를 직접 만들지 않아도 되나요?

네. Docker Compose는 기본적으로 프로젝트 전용 네트워크를 자동 생성하고 각 서비스를 연결합니다. 복잡한 서비스 분리나 외부 네트워크 연결이 필요할 때 networks 항목을 직접 정의하면 됩니다.

마무리

Docker Network는 컨테이너 간 통신과 외부 서비스 연결을 담당하는 핵심 기능입니다.

같은 Docker 호스트 안에서 서비스를 연결할 때는 사용자 정의 Bridge Network가 가장 일반적으로 사용되며, 호스트 네트워크를 직접 사용하려면 Host Network, 네트워크를 완전히 차단하려면 None Network를 사용할 수 있습니다.

여러 Docker 호스트의 컨테이너를 연결해야 한다면 Overlay Network를 검토할 수 있습니다.

실무에서는 모든 컨테이너를 하나의 네트워크에 연결하기보다 웹, 애플리케이션, 데이터베이스의 역할에 따라 네트워크를 분리하는 것이 관리와 보안 측면에서 유리합니다.

댓글 남기기