Skip to content

Docker_networking

Docker networking allows containers to communicate with each other and the outside world. This chapter covers Docker’s networking concepts.

┌─────────────────────────────────────────────────────────────────────────────┐
│ Docker Network Drivers │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ bridge │ │ host │ │ overlay │ │ none │ │
│ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │
│ │
│ ┌────────────┐ ┌────────────┐ │
│ │ macvlan │ │ ipvlan │ │
│ └────────────┘ └────────────┘ │
│ │
│ Bridge - Default for standalone containers │
│ Host - Removes network isolation │
│ Overlay - Multi-host networking (Swarm) │
│ None - No networking │
│ Macvlan - Direct network access │
│ Ipvlan - Similar to macvlan │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

When you install Docker, a default bridge network is created:

Terminal window
# List networks
docker network ls
# Output:
# NETWORK ID NAME DRIVER SCOPE
# abc123... bridge bridge local
# def456... host host local
# ghi789... none null local
┌─────────────────────────────────────────────────────────────────────────────┐
│ Bridge Network Architecture │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ Docker Host │ │
│ │ │ │
│ │ ┌────────────────────────────────────────────────────────────┐ │ │
│ │ │ docker0 Bridge │ │ │
│ │ │ 172.17.0.1/16 │ │ │
│ │ │ │ │ │
│ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │
│ │ │ │ Container A │ │ Container B │ │ │ │
│ │ │ │ 172.17.0.2 │◀────▶│ 172.17.0.3 │ │ │ │
│ │ │ └──────────────┘ └──────────────┘ │ │ │
│ │ └────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ External Network │ │ │
│ │ │ (Internet) │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Terminal window
# Run containers on default bridge
docker run -d --name container1 nginx
docker run -d --name container2 redis
# Containers can communicate using container names (DNS)
docker exec container1 ping -c 3 container2
# Or using IP addresses
docker exec container1 ping -c 3 172.17.0.3

Create custom bridge networks for better isolation:

Terminal window
# Create a bridge network
docker network create my-network
# Run containers in custom network
docker run -d --name web --network my-network nginx
docker run -d --name api --network my-network myapi:latest
docker run -d --name db --network my-network postgres:15
# Containers can communicate by name
docker exec web ping -c 3 api
┌─────────────────────────────────────────────────────────────────────────────┐
│ User-Defined Bridge Benefits │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ✓ Automatic DNS resolution between containers │
│ ✓ Better isolation from other containers │
│ ✓ Containers can be added/removed at runtime │
│ ✓ Network settings customizable │
│ ✓ Easier container-to-container communication │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

Expose container ports to the host:

Terminal window
# Basic port mapping
docker run -d -p 8080:80 nginx # Host 8080 → Container 80
# Map to specific IP
docker run -d -p 127.0.0.1:8080:80 nginx
# Map to random available port
docker run -d -P nginx
# Multiple ports
docker run -d -p 8080:80 -p 8443:443 myapp

Remove network isolation between container and host:

Terminal window
# Run on host network
docker run -d --network host nginx
# Container uses host's network stack directly
# No port mapping needed
# Container port = Host port

For multi-host communication:

Terminal window
# Initialize swarm
docker swarm init
# Create overlay network
docker network create --driver overlay my-overlay
# Run services on overlay network
docker service create --network my-overlay --replicas 3 nginx
┌─────────────────────────────────────────────────────────────────────────────┐
│ Overlay Network Architecture │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Host A Host B │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Container 1 │◀─── VXLAN ─────▶│ Container 2 │ │
│ │ 10.0.0.2 │ │ 10.0.0.3 │ │
│ └──────────────┘ └──────────────┘ │
│ │ │ │
│ └──────────┬─────────────────────┘ │
│ │ │
│ ┌───────▼────────┐ │
│ │ Docker Swarm │ │
│ │ Manager │ │
│ └───────────────┘ │
│ │
│ Overlay Network: 10.0.0.0/24 │
│ Encrypted VXLAN tunnels between hosts │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

Give containers direct access to the physical network:

Terminal window
# Get host network interface
ip link show
# Create macvlan network
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 my-macvlan
# Run container on macvlan
docker run -d --network my-macvlan --ip 192.168.1.100 nginx
Terminal window
# List networks
docker network ls
# Inspect network
docker network inspect bridge
# Create network
docker network create my-network
# Connect container to network
docker network connect my-network container1
# Disconnect container from network
docker network disconnect my-network container1
# Remove network
docker network rm my-network
# Prune unused networks
docker network prune

In user-defined networks, Docker provides built-in DNS:

Terminal window
# Create network
docker network create app-network
# Run containers
docker run -d --name api --network app-network myapi
docker run -d --name web --network app-network myweb
# DNS resolution works automatically
# web can reach api at http://api:port
Terminal window
# Use --dns to set custom DNS
docker run -d --dns 8.8.8.8 nginx
# Use --network-alias to set alias
docker run -d --network-alias api --network app-network myapi
# Now accessible as both 'myapi' and 'api'
Terminal window
# Both on same network - works by name
docker exec container1 curl http://container2:8080
# Using alias
docker exec container1 curl http://api:8080
Terminal window
# Use host.docker.internal (Docker 20.10+)
docker run -d myapp
docker exec myapp curl http://host.docker.internal:8080
# On Linux, may need to add --add-host
docker run --add-host host.docker.internal:host-gateway myapp
Terminal window
# Port mapping required
docker run -d -p 8080:80 nginx
# Access via localhost:8080
curl http://localhost:8080
Terminal window
# Check container's network settings
docker inspect container1 --format '{{json .NetworkSettings}}'
# View network connections
docker exec container1 netstat -tulpn
# Test connectivity
docker exec container1 ping -c 3 other-container
# Check DNS resolution
docker exec container1 nslookup other-container
# View all network endpoints
docker network inspect my-network
┌─────────────────────────────────────────────────────────────────────────────┐
│ Network Performance Comparison │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Driver Performance Use Case │
│ ────────────────────────────────────────────────────────────────────── │
│ host ★★★★★ High performance, no isolation │
│ bridge ★★★★☆ Default, moderate isolation │
│ overlay ★★★☆☆ Multi-host, encrypted │
│ macvlan ★★★★★ Direct network access │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

In this chapter, you learned:

  • Docker network drivers (bridge, host, overlay, none, macvlan)
  • User-defined bridge networks
  • Port mapping and exposure
  • DNS and service discovery
  • Network troubleshooting