Docker Networking — Bridge, Host, Overlay

Sanjeev SharmaSanjeev Sharma
6 min read

Advertisement

Docker Networking — Bridge, Host, Overlay

Docker networking enables containers to communicate with each other and the outside world. Learn each network driver and when to use them.

Introduction

Docker provides multiple networking options for different use cases. Understanding these modes is essential for designing scalable, secure containerized applications.

Network Drivers

Docker supports five network drivers:

  1. bridge: Default, isolated network
  2. host: Use host's network stack
  3. overlay: Multi-host networking
  4. macvlan: Assign MAC addresses
  5. none: No networking

Bridge Network

The default network driver. Each container gets an IP on the bridge network.

Creating a Bridge Network

# Create custom bridge network
docker network create myapp_network

# List networks
docker network ls

# Inspect network
docker network inspect myapp_network

Running Containers on Bridge Network

# Run container on custom bridge
docker run -d --name web --network myapp_network -p 8080:3000 myapp:1.0

docker run -d --name db --network myapp_network postgres:15

# Containers can communicate using service names
# In web container: psql -h db -U postgres

Bridge Network with Docker Compose

version: '3.8'

services:
  web:
    image: myapp:1.0
    networks:
      - app_network
    ports:
      - "3000:3000"

  db:
    image: postgres:15
    networks:
      - app_network

networks:
  app_network:
    driver: bridge

Service Discovery

Containers on the same bridge network can communicate using service names:

# Start Redis container
docker run -d --name cache --network myapp_network redis:7

# In application (Node.js)
const redis = require('redis');
const client = redis.createClient({
  host: 'cache',  # Service name, not IP
  port: 6379
});

Host Network

Containers use the host's network stack directly. No isolation between container and host networking.

Running with Host Network

# Container uses host's network interfaces
docker run -d --network host myapp:1.0

# No port mapping needed
# Application directly on host port

Use Cases

  • Maximum performance needed
  • Port conflicts with host services
  • Multiple network interfaces

Example: Host Network

# Without host network: accessible on localhost:8080
docker run -p 8080:3000 myapp:1.0

# With host network: accessible on 0.0.0.0:3000 (host's network)
docker run --network host myapp:1.0

Limitations

  • Port conflicts if multiple apps use same port
  • Cannot use port mapping (-p flag ignored)
  • Less isolation from host

Overlay Network

For multi-host Docker Swarm clusters. Enables container communication across multiple Docker hosts.

Setup Overlay Network

# Initialize Docker Swarm
docker swarm init

# Create overlay network
docker network create --driver overlay --attachable myapp_overlay

# List networks
docker network ls

# Inspect overlay network
docker network inspect myapp_overlay

Deploying Services on Overlay

# Run containers on overlay network
docker run -d --name web --network myapp_overlay myapp:1.0
docker run -d --name db --network myapp_overlay postgres:15

Docker Compose with Overlay

version: '3.8'

services:
  web:
    image: myapp:1.0
    deploy:
      replicas: 3
    networks:
      - app_overlay

  db:
    image: postgres:15
    networks:
      - app_overlay

networks:
  app_overlay:
    driver: overlay

Advanced Networking

Custom Bridge with Driver Options

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

Multi-Network Setup

version: '3.8'

services:
  web:
    image: myapp:1.0
    networks:
      - frontend
      - backend

  db:
    image: postgres:15
    networks:
      - backend

  cache:
    image: redis:7
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
// Web service connects to both networks
// Can reach frontend and backend services
// DB and cache on backend only, can't reach frontend

Exposing Ports

services:
  web:
    image: myapp:1.0
    networks:
      - app_network
    # Port mapping: host:container
    ports:
      - "3000:3000"    # Port 3000 on host → 3000 in container
      - "8080:9000"    # Port 8080 on host → 9000 in container
    # Only port 3000 accessible from outside
    expose:
      - "3000"

Service Discovery and DNS

Built-in DNS

Docker has embedded DNS server for service discovery:

# All containers on same network can resolve service names
docker run -it --network myapp_network alpine sh

# Inside container:
ping web     # Resolves to web container's IP
ping db      # Resolves to db container's IP

DNS in Docker Compose

// Node.js service discovery
const axios = require('axios');

// Connect to 'web' service on same network
axios.get('http://web:3000/api/health');

// Works automatically with Docker Compose

Network Troubleshooting

Inspect Network

# View network details
docker network inspect myapp_network

# Shows connected containers and IPs

Test Connectivity

# Execute command in container
docker exec web ping db

# Get container IP
docker inspect --format='{{.NetworkSettings.Networks.myapp_network.IPAddress}}' web

# Check container network settings
docker inspect web

View Network Traffic

# Using tcpdump in container
docker exec web tcpdump -i eth0

# Monitor ports
docker exec web netstat -tlnp

Network Security

Restrict Traffic

services:
  web:
    image: myapp:1.0
    networks:
      - app_network
    # Only expose necessary ports
    ports:
      - "3000:3000"

  db:
    image: postgres:15
    networks:
      - app_network
    # Don't expose port externally
    # Only accessible from web on 5432

Default Security

  • Containers can't reach each other by default
  • Must explicitly connect to same network
  • Port mapping required for external access
  • Firewalls protect container networks

Performance Considerations

NetworkLatencyThroughputUse Case
BridgeLowHighLocal containers
HostVery LowVery HighPerformance critical
OverlayHigherMediumMulti-host swarm
MacvlanLowHighPhysical network access

Choosing a Network Driver

  • Bridge: Default choice for most applications
  • Host: When maximum performance needed
  • Overlay: Multi-host Docker Swarm deployments
  • Macvlan: Connecting containers to physical networks
  • None: When networking disabled intentionally

FAQ

Q: Can containers on different bridge networks communicate? A: Not directly. You must connect a container to both networks or use a router service on both networks.

Q: What's the performance difference between bridge and host networking? A: Host networking has lower latency and higher throughput because it bypasses Docker's network isolation layer.

Q: How do I debug network connectivity issues? A: Use docker exec to run commands inside containers: docker exec container_name ping another_container. Also inspect network settings with docker network inspect.

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro