DevToolBox무료
블로그

Docker 네트워킹 가이드: Bridge, Host, Overlay 네트워크 설명

14분by DevToolBox

Docker 네트워킹은 컨테이너화된 애플리케이션 아키텍처의 가장 중요한 측면 중 하나입니다. 컨테이너 간, 호스트 시스템, 외부 네트워크와의 통신 방법을 이해하는 것이 필수적입니다.

Docker 네트워킹 개요

Docker는 컨테이너를 위한 격리된 네트워크 환경을 생성합니다.

# List all Docker networks
$ docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
a1b2c3d4e5f6   bridge    bridge    local
f6e5d4c3b2a1   host      host      local
1a2b3c4d5e6f   none      null      local

Docker 네트워크 유형

Bridge 네트워크 (기본)

Bridge 네트워크는 컨테이너의 기본 네트워크 드라이버입니다.

# Create a user-defined bridge network
$ docker network create my-app-network

# Run containers on the custom network
$ docker run -d --name web --network my-app-network nginx:alpine
$ docker run -d --name api --network my-app-network node:20-alpine

# Containers can now reach each other by name
$ docker exec web ping api
PING api (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.089 ms

# User-defined bridge vs default bridge
# Default bridge: containers communicate only via IP addresses
# User-defined bridge: automatic DNS resolution by container name

# Create bridge with custom subnet
$ docker network create \
  --driver bridge \
  --subnet 172.20.0.0/16 \
  --gateway 172.20.0.1 \
  custom-bridge

Host 네트워크

Host 네트워크 모드는 컨테이너와 호스트 간의 네트워크 격리를 제거합니다.

# Run container with host networking
$ docker run -d --network host nginx:alpine

# No port mapping needed — container uses host ports directly
# The nginx server is accessible at localhost:80

# Check: container shares host's network interfaces
$ docker exec <container-id> ip addr
# Shows the same interfaces as the host machine

# Warning: Only one container can bind to a given host port
# Host networking is only supported on Linux (not macOS/Windows)

Overlay 네트워크

Overlay 네트워크는 여러 Docker 데몬을 연결합니다.

# Initialize Docker Swarm (required for overlay networks)
$ docker swarm init

# Create an overlay network
$ docker network create \
  --driver overlay \
  --attachable \
  my-overlay-network

# Create a service on the overlay network
$ docker service create \
  --name web \
  --network my-overlay-network \
  --replicas 3 \
  nginx:alpine

# Create encrypted overlay network for sensitive data
$ docker network create \
  --driver overlay \
  --opt encrypted \
  secure-overlay

Macvlan 네트워크

Macvlan은 컨테이너에 MAC 주소를 할당합니다.

# Create a Macvlan network
$ docker network create \
  --driver macvlan \
  --subnet 192.168.1.0/24 \
  --gateway 192.168.1.1 \
  -o parent=eth0 \
  my-macvlan

# Run container with its own IP on the LAN
$ docker run -d \
  --network my-macvlan \
  --ip 192.168.1.100 \
  --name legacy-app \
  my-app:latest

# The container appears as 192.168.1.100 on the physical network

None 네트워크

None 네트워크는 모든 네트워킹을 비활성화합니다.

# Run container with no networking
$ docker run -d --network none alpine sleep 3600

# Only loopback interface is available
$ docker exec <container-id> ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
    inet 127.0.0.1/8 scope host lo

Docker Compose 네트워킹

Docker Compose는 기본적으로 앱에 단일 네트워크를 설정합니다.

# docker-compose.yml — Default networking
# All services share a network named <project>_default
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
  api:
    image: node:20-alpine
    # Can reach web service at http://web:80
    # Can reach db service at postgres://db:5432
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret

Compose에서 커스텀 네트워크

# docker-compose.yml — Custom networks for isolation
services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    networks:
      - frontend

  api:
    build: ./api
    networks:
      - frontend
      - backend
    depends_on:
      - db
      - redis

  db:
    image: postgres:16
    volumes:
      - pg-data:/var/lib/postgresql/data
    networks:
      - backend

  redis:
    image: redis:7-alpine
    networks:
      - backend

  admin:
    image: adminer
    ports:
      - "8080:8080"
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # No external access

volumes:
  pg-data:

네트워크 격리 패턴

여러 네트워크를 사용하여 서비스를 격리할 수 있습니다.

# Three-tier architecture with network isolation
#
#  Internet
#     |
#  [nginx]     <-- frontend network
#     |
#   [api]      <-- frontend + backend network
#     |
#   [db]       <-- backend network (internal)
#
# nginx can reach api, but NOT db
# api can reach both nginx and db
# db is completely isolated from external access

DNS 및 서비스 디스커버리

Docker는 사용자 정의 네트워크에 내장 DNS 해석을 제공합니다.

DNS 해석 규칙

# DNS resolution in user-defined networks
# 1. Container name → IP address
$ docker exec web nslookup api
Server:    127.0.0.11
Address:   127.0.0.11#53
Name:      api
Address:   172.18.0.3

# 2. Service name in Compose → all container IPs (round-robin)
$ docker exec web nslookup api
# Returns IPs of all 'api' service replicas

# 3. Network aliases
$ docker run -d \
  --network my-network \
  --network-alias database \
  --network-alias db \
  --name postgres-primary \
  postgres:16

# Container is reachable as: postgres-primary, database, or db

# 4. Check DNS configuration inside a container
$ docker exec web cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

네트워크 간 컨테이너 연결

실행 중인 컨테이너를 여러 네트워크에 연결할 수 있습니다.

# Connect a running container to an additional network
$ docker network connect backend api-container

# Connect with a specific IP address
$ docker network connect --ip 172.20.0.10 backend api-container

# Disconnect from a network
$ docker network disconnect frontend api-container

# A container connected to multiple networks can route between them
# This is useful for "gateway" containers

네트워크 검사

Docker는 네트워크 구성을 검사하는 명령어를 제공합니다.

# List all networks
$ docker network ls

# Inspect a network (shows connected containers, config)
$ docker network inspect my-app-network

# Find which networks a container is connected to
$ docker inspect --format='{{json .NetworkSettings.Networks}}' my-container

# Check container IP address
$ docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container

# Check port mappings
$ docker port my-container

# Test connectivity between containers
$ docker exec web ping -c 3 api
$ docker exec web wget -qO- http://api:3000/health

# Debug with a temporary network tools container
$ docker run --rm -it --network my-app-network \
  nicolaka/netshoot bash

Docker 네트워킹 문제 해결

컨테이너 간 통신 불가

동일 네트워크에 있는지 확인하세요.

# Check if containers are on the same network
$ docker network inspect bridge --format='{{range .Containers}}{{.Name}} {{end}}'

# Solution: Use a user-defined network
$ docker network create app-net
$ docker run -d --name web --network app-net nginx
$ docker run -d --name api --network app-net node:20-alpine

# Now name resolution works
$ docker exec web ping api  # Works!

포트 충돌

충돌하는 포트를 확인하세요.

# Error: port is already allocated
# Find what is using the port
$ lsof -i :8080
$ ss -tlnp | grep 8080

# Solution 1: Map to a different host port
$ docker run -d -p 8081:80 nginx

# Solution 2: Stop the conflicting service
$ sudo systemctl stop apache2

DNS 해석 실패

사용자 정의 DNS 서버를 지정할 수 있습니다.

# Specify custom DNS servers
$ docker run -d --dns 8.8.8.8 --dns 8.8.4.4 my-app

# Or in docker-compose.yml
services:
  web:
    image: nginx
    dns:
      - 8.8.8.8
      - 8.8.4.4

네트워크 성능 문제

성능이 중요한 서비스에는 host 네트워크를 고려하세요.

# Check MTU settings
$ docker network inspect bridge | grep -i mtu

# Set custom MTU for a network
$ docker network create --opt com.docker.network.driver.mtu=1400 my-network

# Use host networking for maximum performance
$ docker run --network host my-performance-app

네트워크 보안 모범 사례

다음 모범 사례를 따르세요:

  • 사용자 정의 bridge 네트워크 사용.
  • 내부 네트워크로 외부 접근 제한.
  • 필요한 포트만 공개.
  • 암호화된 overlay 네트워크 사용.
  • 네트워크 정책으로 트래픽 제어.
  • 정기적으로 네트워크 구성 감사.
# Bind to localhost only (not accessible from outside)
$ docker run -d -p 127.0.0.1:5432:5432 postgres:16

# Create internal network (no outbound internet)
$ docker network create --internal isolated-net

# In docker-compose.yml
networks:
  database:
    internal: true  # Containers cannot reach the internet

고급 네트워킹 주제

커스텀 IPAM 구성

사용자 정의 IP 주소 관리를 구성할 수 있습니다.

# Custom IPAM configuration
$ docker network create \
  --driver bridge \
  --subnet 10.10.0.0/16 \
  --ip-range 10.10.1.0/24 \
  --gateway 10.10.0.1 \
  --aux-address "dns=10.10.0.2" \
  custom-ipam-net

# In docker-compose.yml
networks:
  app-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16
          ip_range: 172.28.5.0/24
          gateway: 172.28.0.1

IPv6 지원

Docker는 IPv6를 지원합니다.

# Enable IPv6 in Docker daemon (/etc/docker/daemon.json)
{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64"
}

# Create a dual-stack network
$ docker network create \
  --ipv6 \
  --subnet 172.20.0.0/16 \
  --subnet 2001:db8:2::/64 \
  dual-stack-net

내장 로드 밸런싱

Docker Swarm은 서비스에 내장 로드 밸런싱을 제공합니다.

# Docker Swarm built-in load balancing
$ docker service create \
  --name web \
  --replicas 5 \
  --publish published=80,target=80 \
  --network my-overlay \
  nginx:alpine

# Requests to port 80 on ANY swarm node
# are load-balanced across all 5 replicas
# using ingress routing mesh

# Scale the service
$ docker service scale web=10

네트워크 드라이버 비교

드라이버사용 사례격리성능멀티 호스트
BridgeSingle-host containersHighGoodNo
HostPerformance-critical appsNoneBestNo
OverlayMulti-host / SwarmHighGoodYes
MacvlanLegacy / physical networkHighGoodNo
NoneMaximum isolationCompleteN/ANo

결론

Docker 네트워킹은 컨테이너를 다루는 개발자에게 기본 기술입니다. 이러한 개념을 마스터하면 견고하고 확장 가능한 컨테이너화된 애플리케이션을 구축할 수 있습니다.

FAQ

Docker에서 bridge와 host 네트워크의 차이는?

Bridge는 격리된 네트워크 네임스페이스를 만들고 포트 매핑을 제공합니다. Host는 호스트 네트워크 스택을 직접 공유합니다.

overlay 네트워크는 언제 사용하나요?

다른 Docker 호스트의 컨테이너가 통신해야 할 때 사용합니다.

다른 네트워크의 컨테이너가 통신할 수 있나요?

기본적으로 불가합니다. docker network connect로 여러 네트워크에 연결할 수 있습니다.

Docker DNS 해석 문제 해결 방법은?

사용자 정의 네트워크에 있는지 확인하고 컨테이너 내에서 nslookup을 실행하세요.

𝕏 Twitterin LinkedIn
도움이 되었나요?

최신 소식 받기

주간 개발 팁과 새 도구 알림을 받으세요.

스팸 없음. 언제든 구독 해지 가능.

Try These Related Tools

{ }JSON Formatter

Related Articles

Docker Compose 튜토리얼: 기초부터 프로덕션 스택까지

완전한 Docker Compose 튜토리얼: docker-compose.yml 구문, 서비스, 네트워크, 볼륨, 환경변수, 헬스체크, Node.js/Python/WordPress 실전 예제.

Docker 모범 사례: 프로덕션 컨테이너를 위한 20가지 팁

Docker 필수 모범 사례 20가지: 멀티 스테이지 빌드, 보안 강화, 이미지 최적화, 캐시 전략, CI/CD 자동화.

Docker vs Kubernetes

Docker와 Kubernetes 비교 가이드.