DEV Community

Cover image for Docker Networking Comprehensive Guide
Mohammad Aman
Mohammad Aman

Posted on

Docker Networking Comprehensive Guide

Docker networking enables seamless communication between containers, the host machine, and external networks. This comprehensive guide covers all aspects of Docker networking, from basic concepts to advanced configurations, complete with commands, diagrams, and best practices for production environments.

What is Docker Networking

Docker networking is the system that manages how containers communicate with each other, the host system, and external networks. It provides isolated, virtual networks for containers while enabling controlled communication through various network drivers and configurations.

Core Networking Concepts

Network Namespaces: Docker uses Linux network namespaces to create isolated network stacks for each container, ensuring they have their own network interfaces, IP addresses, routing tables, and firewall rules. This isolation prevents containers from directly accessing each other's network resources unless explicitly connected.

Virtual Ethernet Pairs (veth): These act as virtual network cables connecting container namespaces to host bridges, enabling communication between containers and the host network.

Linux Bridge: Docker creates virtual switches (bridges) that enable communication between network devices connected to the bridge, forming local area networks for containers.

DNS Resolution: Docker provides built-in DNS services that allow containers to communicate using container names instead of IP addresses, making service discovery seamless within user-defined networks.

Docker Network Types and Drivers

Docker provides several network drivers, each designed for specific use cases and deployment scenarios.

Bridge Network (Default)

The bridge network is Docker's default network driver for standalone containers. It creates a virtual bridge on the host that allows containers to communicate while providing isolation from external networks.

Characteristics:

  • Default network for new containers

  • Provides automatic DNS resolution between containers

  • Supports port mapping for external access

  • Local scope (single host only)

Use Cases:

  • Single-host applications

  • Development environments

  • Simple container-to-container communication

Commands:

Basic bridge network usage:

# List all networks
docker network ls

# Create custom bridge network
docker network create my-bridge-network

# Run container on custom bridge
docker run --network=my-bridge-network --name web nginx

# Connect existing container to network
docker network connect my-bridge-network existing-container
Enter fullscreen mode Exit fullscreen mode

Advanced bridge network configuration:

# Create bridge with custom subnet and gateway
docker network create -d bridge \
  --subnet=172.20.0.0/16 \
  --ip-range=172.20.240.0/20 \
  --gateway=172.20.0.1 \
  my-custom-bridge

# Run container with specific IP
docker run --network=my-custom-bridge \
  --ip=172.20.0.10 \
  --name web nginx

# Create bridge with multiple subnets
docker network create -d bridge \
  --subnet=172.20.0.0/16 \
  --subnet=172.21.0.0/16 \
  multi-subnet-bridge
Enter fullscreen mode Exit fullscreen mode

Host Network

The host network removes network isolation between containers and the Docker host, allowing containers to use the host's network stack directly.

Characteristics:

  • No network isolation

  • Direct access to host network interfaces

  • Higher performance (no NAT overhead)

  • Port conflicts possible with host services

Use Cases:

  • High-performance applications

  • Network monitoring tools

  • Applications requiring low-level network access

Commands:

# Run container with host networking
docker run --network=host nginx

# No port mapping needed with host network
docker run --network=host --name monitor-app monitoring-tool
Enter fullscreen mode Exit fullscreen mode

None Network

The none network completely disables networking for containers, providing maximum isolation.

Characteristics:

  • No network access

  • Complete network isolation

  • Only loopback interface available

  • Highest security for isolated tasks

Use Cases:

  • Security-sensitive applications

  • Batch processing tasks

  • Applications with no network requirements

Commands:

# Run container with no networking
docker run --network=none alpine

# Container will have no external connectivity
docker run --network=none --name isolated-task batch-processor
Enter fullscreen mode Exit fullscreen mode

Overlay Network

Overlay networks enable communication between containers running on different Docker hosts, primarily used in Docker Swarm mode.

Characteristics:

  • Multi-host networking

  • Uses VXLAN encapsulation

  • Built-in service discovery

  • Requires Docker Swarm mode

Use Cases:

  • Docker Swarm clusters

  • Multi-host container orchestration

  • Distributed applications

Prerequisites and Ports: Docker Swarm overlay networks require specific ports to be open:

  • TCP port 2377: Cluster management communications

  • TCP and UDP port 7946: Communication among nodes

  • UDP port 4789: VXLAN traffic

Commands:

Basic overlay network:

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

# Create overlay network
docker network create -d overlay --attachable my-overlay

# Create service using overlay network
docker service create --network=my-overlay --name web nginx

# Deploy stack with overlay network
docker stack deploy -c docker-compose.yml my-stack
Enter fullscreen mode Exit fullscreen mode

Advanced overlay network configuration:

# Create encrypted overlay network
docker network create -d overlay \
  --opt encrypted \
  --attachable \
  secure-overlay

# Create overlay with custom subnet
docker network create -d overlay \
  --subnet=10.0.9.0/24 \
  --gateway=10.0.9.1 \
  --attachable \
  custom-overlay

# Create overlay for external services
docker network create -d overlay \
  --scope=swarm \
  --attachable=false \
  swarm-only-overlay
Enter fullscreen mode Exit fullscreen mode

Macvlan Network

Macvlan networks assign unique MAC addresses to containers, making them appear as physical devices on the network.

Characteristics:

  • Direct connection to physical network

  • Containers get routable IP addresses

  • No NAT or port mapping required

  • Requires promiscuous mode on network interface

Use Cases:

  • Legacy applications expecting physical network access

  • Network appliances in containers

  • VLAN configurations

  • Direct Layer 2 access requirements

Commands:

Basic macvlan setup:

# Create basic 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 with macvlan
docker run --network=my-macvlan \
  --ip=192.168.1.100 \
  --name legacy-app \
  legacy-application
Enter fullscreen mode Exit fullscreen mode

Advanced macvlan configuration:

# Create macvlan with VLAN tagging (802.1Q)
docker network create -d macvlan \
  --subnet=192.168.10.0/24 \
  --gateway=192.168.10.1 \
  --ip-range=192.168.10.128/25 \
  --aux-address="host=192.168.10.254" \
  -o parent=eth0.10 \
  -o macvlan_mode=bridge \
  vlan-macvlan

# Create multiple macvlan networks for different VLANs
docker network create -d macvlan \
  --subnet=192.168.20.0/24 \
  --gateway=192.168.20.1 \
  -o parent=eth0.20 \
  vlan20-net

docker network create -d macvlan \
  --subnet=192.168.30.0/24 \
  --gateway=192.168.30.1 \
  -o parent=eth0.30 \
  vlan30-net
Enter fullscreen mode Exit fullscreen mode

IPvlan Network

IPvlan networks provide full control over IPv4 and IPv6 addressing with VLAN capabilities.

Characteristics:

  • Layer 2 and Layer 3 modes available

  • Complete control over IP addressing

  • VLAN support

  • Better performance than macvlan in some scenarios

Use Cases:

  • Advanced IP management

  • VLAN environments

  • IPv6 deployments

  • Underlay network integration

Commands:

IPvlan Layer 2 mode:

# Create IPvlan L2 network
docker network create -d ipvlan \
  --subnet=192.168.100.0/24 \
  --gateway=192.168.100.1 \
  --ip-range=192.168.100.128/25 \
  -o parent=eth0 \
  -o ipvlan_mode=l2 \
  ipvlan-l2

# Run container with specific IP
docker run --network=ipvlan-l2 \
  --ip=192.168.100.130 \
  --name app1 \
  nginx
Enter fullscreen mode Exit fullscreen mode

IPvlan Layer 3 mode:

# Create IPvlan L3 network
docker network create -d ipvlan \
  --subnet=192.168.200.0/24 \
  -o parent=eth0 \
  -o ipvlan_mode=l3 \
  ipvlan-l3

# L3 mode handles routing automatically
docker run --network=ipvlan-l3 \
  --ip=192.168.200.10 \
  --name app2 \
  nodejs-app
Enter fullscreen mode Exit fullscreen mode

Docker Networking Architecture - Comprehensive overview of Docker network types, container connectivity, and communication paths

Docker Networking Architecture - Comprehensive overview of Docker network types, container connectivity, and communication paths

Essential Docker Network Commands

Basic Network Management Commands

List Networks:

# Basic network listing
docker network ls

# Show only network IDs
docker network ls -q

# Filter networks by driver
docker network ls --filter driver=bridge

# Format output
docker network ls --format "table {{.ID}}\t{{.Name}}\t{{.Driver}}\t{{.Scope}}"
Enter fullscreen mode Exit fullscreen mode

Network Inspection:

# Inspect network details
docker network inspect bridge

# Inspect multiple networks
docker network inspect bridge host

# Filter specific information
docker network inspect bridge --format='{{.IPAM.Config}}'

# Show connected containers
docker network inspect bridge --format='{{range .Containers}}{{.Name}} {{.IPv4Address}}{{end}}'
Enter fullscreen mode Exit fullscreen mode

Create Networks:

# Basic network creation
docker network create my-network

# Create with specific driver
docker network create -d bridge my-bridge

# Create with custom configuration
docker network create \
  --driver=bridge \
  --subnet=172.30.0.0/16 \
  --ip-range=172.30.240.0/20 \
  --gateway=172.30.0.1 \
  --opt com.docker.network.bridge.name=my-bridge \
  my-custom-network

# Create internal network (no external access)
docker network create --internal secure-internal
Enter fullscreen mode Exit fullscreen mode

Connect and Disconnect Containers:

# Connect container to network
docker network connect my-network container-name

# Connect with specific IP
docker network connect --ip=172.30.0.10 my-network container-name

# Connect with alias
docker network connect --alias=db my-network postgres-container

# Disconnect from network
docker network disconnect my-network container-name

# Force disconnect
docker network disconnect --force my-network container-name
Enter fullscreen mode Exit fullscreen mode

Remove Networks:

# Remove single network
docker network rm my-network

# Remove multiple networks
docker network rm network1 network2 network3

# Remove all unused networks
docker network prune

# Remove with force (disconnect containers first)
docker network prune --force
Enter fullscreen mode Exit fullscreen mode

Port Publishing and Mapping

Basic Port Mapping:

# Map container port to host port
docker run -p 8080:80 nginx

# Map to specific host interface
docker run -p 127.0.0.1:8080:80 nginx

# Map UDP port
docker run -p 5353:53/udp dns-server

# Map multiple ports
docker run -p 80:80 -p 443:443 nginx

# Map port range
docker run -p 8000-8010:8000-8010 multi-port-app
Enter fullscreen mode Exit fullscreen mode

Advanced Port Configuration:

# Publish all exposed ports to random host ports
docker run -P nginx

# Publish to random port
docker run -p 80 nginx

# Check port mappings
docker port container-name

# List all port mappings
docker port container-name 80/tcp

# Runtime port inspection
docker inspect container-name --format='{{.NetworkSettings.Ports}}'
Enter fullscreen mode Exit fullscreen mode

Container Network Information

Inspect Container Networking:

# Show container network settings
docker inspect container-name --format='{{.NetworkSettings}}'

# Get container IP address
docker inspect container-name --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'

# Get all network information
docker inspect container-name --format='{{json .NetworkSettings.Networks}}'

# Show port mappings
docker inspect container-name --format='{{.NetworkSettings.Ports}}'
Enter fullscreen mode Exit fullscreen mode

Runtime Network Commands:

# Execute network commands inside container
docker exec -it container-name ip addr show

# Check container's routing table
docker exec -it container-name ip route

# Test connectivity from container
docker exec -it container-name ping google.com

# Check listening ports
docker exec -it container-name netstat -tulpn

# DNS resolution test
docker exec -it container-name nslookup other-container
Enter fullscreen mode Exit fullscreen mode

DNS Resolution and Service Discovery

Docker provides built-in DNS resolution that allows containers to communicate using container names instead of IP addresses.

How Docker DNS Works

DNS Server Location: Docker runs an embedded DNS server at 127.0.0.11 inside each container. This server handles both internal container name resolution and external DNS queries.

Resolution Process:

  1. Container makes DNS query to 127.0.0.11:53

  2. Docker's embedded DNS server receives the query

  3. If it's a container name, Docker resolves it internally

  4. If it's an external domain, Docker forwards to host's DNS servers

  5. Response is returned to the container

DNS Configuration Commands

Basic DNS Testing:

# Test DNS resolution inside container
docker exec -it container-name nslookup other-container

# Check DNS configuration
docker exec -it container-name cat /etc/resolv.conf

# Test external DNS resolution
docker exec -it container-name nslookup google.com

# Use dig for detailed DNS queries
docker exec -it container-name dig other-container

# Check all DNS records
docker exec -it container-name dig any other-container
Enter fullscreen mode Exit fullscreen mode

Custom DNS Configuration:

# Set custom DNS servers
docker run --dns=8.8.8.8 --dns=8.8.4.4 nginx

# Add custom DNS search domains
docker run --dns-search=company.local nginx

# Add custom host entries
docker run --add-host=api.local:192.168.1.100 nginx

# Combine DNS options
docker run \
  --dns=1.1.1.1 \
  --dns-search=internal.company.com \
  --add-host=database:10.0.1.50 \
  my-app
Enter fullscreen mode Exit fullscreen mode

Network-Specific DNS:

# DNS works automatically in user-defined networks
docker network create my-app-network
docker run --network=my-app-network --name web nginx
docker run --network=my-app-network --name api node-app

# Test communication using container names
docker exec -it web ping api
docker exec -it api curl http://web:80
Enter fullscreen mode Exit fullscreen mode

Service Discovery Patterns

Container Aliases:

# Create container with network alias
docker run --network=my-network --network-alias=database postgres

# Multiple aliases for same container
docker run --network=my-network \
  --network-alias=db \
  --network-alias=database \
  --network-alias=postgres \
  postgres

# Connect existing container with alias
docker network connect --alias=api my-network existing-container
Enter fullscreen mode Exit fullscreen mode

Docker Compose Service Discovery:

version: '3.8'
services:
  web:
    image: nginx
    networks:
      - frontend
    depends_on:
      - api

  api:
    image: node:14
    networks:
      - frontend
      - backend
    environment:
      - DATABASE_URL=postgresql://db:5432/myapp

  db:
    image: postgres
    networks:
      - backend
    environment:
      - POSTGRES_DB=myapp

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true
Enter fullscreen mode Exit fullscreen mode

Network Security and Firewall Rules

Docker networking interacts heavily with the Linux firewall system (iptables), which can create security considerations in production environments.

Docker and iptables Integration

How Docker Uses iptables:

  • Docker automatically creates iptables rules for network isolation

  • Port publishing rules are added to enable external access

  • NAT rules handle traffic forwarding between containers and host

  • Custom chains manage Docker-specific traffic

Docker iptables Chains:

  • DOCKER-USER: For user-defined rules (processed first)

  • DOCKER-FORWARD: For Docker network forwarding

  • DOCKER: For port forwarding rules

  • DOCKER-ISOLATION-STAGE-1/2: For network isolation

Security Configuration Commands

Firewall-Safe Docker Configuration:

# Disable iptables modification by Docker
# Add to /etc/docker/daemon.json
{
  "iptables": false
}

# Restart Docker daemon
sudo systemctl restart docker
Enter fullscreen mode Exit fullscreen mode

Custom Firewall Rules:

# Add rules to DOCKER-USER chain (recommended)
iptables -I DOCKER-USER -s 192.168.1.0/24 -j ACCEPT
iptables -I DOCKER-USER -j DROP

# Block access to specific container
iptables -I DOCKER-USER -d 172.17.0.2 -j DROP

# Allow only specific ports
iptables -I DOCKER-USER -p tcp --dport 80 -j ACCEPT
iptables -I DOCKER-USER -p tcp --dport 443 -j ACCEPT
iptables -I DOCKER-USER -j DROP
Enter fullscreen mode Exit fullscreen mode

Network Isolation Best Practices:

# Create isolated internal networks
docker network create --internal backend-network

# Use internal networks for sensitive services
docker run --network=backend-network postgres

# Combine internal and external networks
docker run \
  --network=frontend-network \
  --network=backend-network \
  api-server
Enter fullscreen mode Exit fullscreen mode

Security Monitoring Commands

Monitor Network Traffic:

# Monitor Docker network interfaces
sudo iftop -i docker0

# Watch network connections
sudo netstat -tulpn | grep docker

# Monitor container network usage
docker stats --format "table {{.Container}}\t{{.NetIO}}"

# Track network changes
sudo iptables -L -n -v --line-numbers
Enter fullscreen mode Exit fullscreen mode

Network Troubleshooting and Debugging

Effective troubleshooting requires systematic diagnosis of network connectivity, configuration, and performance issues.

Diagnostic Commands

Container Connectivity Testing:

# Test basic connectivity
docker exec -it container ping google.com

# Test inter-container communication
docker exec -it web-container ping api-container

# Test specific ports
docker exec -it container telnet api-container 3000

# Check if service is listening
docker exec -it container netstat -tulpn

# Test HTTP connectivity
docker exec -it container curl http://api-container:3000/health
Enter fullscreen mode Exit fullscreen mode

Network Configuration Diagnosis:

# Inspect container network details
docker inspect container --format='{{json .NetworkSettings}}' | jq

# Check network connectivity
docker network inspect network-name

# List all container networks
docker ps --format "table {{.Names}}\t{{.Networks}}"

# Check container IP addresses
for container in $(docker ps -q); do
  echo "Container: $(docker inspect $container --format '{{.Name}}')"
  docker inspect $container --format '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}'
done
Enter fullscreen mode Exit fullscreen mode

Port and Service Testing:

# Check if ports are properly mapped
docker port container-name

# Test port connectivity from host
telnet localhost 8080

# Check if service is running in container
docker exec -it container ps aux

# Test DNS resolution
docker exec -it container nslookup service-name

# Check container logs for network errors
docker logs container-name | grep -i "connection\|network\|timeout"
Enter fullscreen mode Exit fullscreen mode

Advanced Debugging Techniques

Network Namespace Debugging:

# List network namespaces
sudo lsns -t net

# Enter container's network namespace
docker inspect container --format '{{.State.Pid}}'
sudo nsenter -t PID -n ip addr show

# Debug with specialized tools
docker run --rm -it --net container:target-container nicolaka/netshoot
Enter fullscreen mode Exit fullscreen mode

Traffic Analysis:

# Capture network traffic
docker exec -it container tcpdump -i eth0

# Monitor network performance
docker exec -it container iperf3 -c target-host

# Check routing table
docker exec -it container ip route show

# Monitor real-time network stats
docker stats --no-stream --format "table {{.Container}}\t{{.NetIO}}"
Enter fullscreen mode Exit fullscreen mode

Troubleshooting Network Issues:

# Use netshoot for comprehensive debugging
docker run -it --rm --net container:problem-container nicolaka/netshoot

# Inside netshoot container, you have access to:
# - tcpdump for packet capture
# - nslookup/dig for DNS testing  
# - curl/wget for HTTP testing
# - iperf for performance testing
# - netstat/ss for connection monitoring
Enter fullscreen mode Exit fullscreen mode

Common Network Problems and Solutions

Container Cannot Reach Another Container:

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

# Connect container to network if needed
docker network connect network-name container-name

# Test DNS resolution
docker exec -it container nslookup target-container

# Verify network connectivity
docker exec -it container ping target-container
Enter fullscreen mode Exit fullscreen mode

Cannot Access Container from Host:

# Check port mappings
docker port container-name

# Ensure service listens on all interfaces (0.0.0.0)
docker exec -it container netstat -tulpn

# Test from host
curl http://localhost:mapped-port

# Check firewall rules
sudo iptables -L -n | grep docker
Enter fullscreen mode Exit fullscreen mode

DNS Resolution Failures:

# Check DNS configuration in container
docker exec -it container cat /etc/resolv.conf

# Test external DNS
docker exec -it container nslookup 8.8.8.8

# Restart container with custom DNS
docker run --dns=8.8.8.8 image-name

# Check Docker daemon DNS settings
docker system info | grep -i dns
Enter fullscreen mode Exit fullscreen mode

Network Monitoring and Performance

Monitoring Docker networks is crucial for maintaining performance and identifying issues in production environments.

Performance Monitoring Commands

Real-time Network Statistics:

# Monitor all containers network I/O
docker stats

# Monitor specific container
docker stats container-name

# Continuous monitoring with custom format
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.NetIO}}\t{{.MemUsage}}"

# Monitor without streaming
docker stats --no-stream
Enter fullscreen mode Exit fullscreen mode

Detailed Network Analysis:

# Get detailed network metrics with cAdvisor
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

# Access metrics at http://localhost:8080
Enter fullscreen mode Exit fullscreen mode

Network Interface Monitoring:

# Monitor Docker bridge interfaces
sudo iftop -i docker0

# Monitor specific container's network
# First get container's network interface
docker exec container-name ip link show

# Monitor with nload
sudo nload docker0

# Continuous network monitoring
watch -n 1 'docker exec container-name cat /proc/net/dev'
Enter fullscreen mode Exit fullscreen mode

Production Monitoring Setup

Prometheus and Grafana Integration:

version: '3.8'
services:
  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    networks:
      - monitoring

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    networks:
      - monitoring

  cadvisor:
    image: google/cadvisor
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge
Enter fullscreen mode Exit fullscreen mode

Network Performance Testing:

# Test network bandwidth between containers
docker exec -it container1 iperf3 -s

# In another terminal
docker exec -it container2 iperf3 -c container1

# Test latency
docker exec -it container ping -c 100 target-container

# Test TCP performance
docker exec -it container nc -l 9999

# In another terminal
docker exec -it container2 nc container1 9999
Enter fullscreen mode Exit fullscreen mode

Production Best Practices

Deploying Docker networking in production requires careful consideration of security, performance, and maintainability.

Network Security Best Practices

Use User-Defined Networks:

# Avoid default bridge network in production
docker network create --driver bridge production-frontend
docker network create --driver bridge --internal production-backend

# Use internal networks for sensitive services
docker network create --internal database-network
Enter fullscreen mode Exit fullscreen mode

Implement Network Segmentation:

# Create separate networks for different tiers
docker network create frontend-network
docker network create backend-network  
docker network create database-network --internal

# Connect services to appropriate networks only
docker run --network=frontend-network nginx
docker run --network=frontend-network --network=backend-network api-server
docker run --network=backend-network --network=database-network postgres
Enter fullscreen mode Exit fullscreen mode

Limit Port Exposure:

# Only expose necessary ports
docker run -p 80:80 -p 443:443 nginx  # Good
docker run -P nginx  # Avoid in production

# Bind to specific interfaces
docker run -p 127.0.0.1:3000:3000 api-server

# Use internal communication instead of port mapping
docker run --network=app-network api-server  # No -p needed for internal communication
Enter fullscreen mode Exit fullscreen mode

Performance Optimization

Choose Appropriate Network Drivers:

  • Use bridge for single-host deployments

  • Use overlay for multi-host Docker Swarm

  • Use macvlan for performance-critical applications needing direct network access

  • Use host networking sparingly and only when performance is critical

Optimize Network Configuration:

# Create networks with optimal settings
docker network create \
  --driver=bridge \
  --opt com.docker.network.bridge.enable_icc=true \
  --opt com.docker.network.bridge.enable_ip_masquerade=true \
  --opt com.docker.network.driver.mtu=1500 \
  optimized-network

# Configure container-specific network settings
docker run \
  --network=optimized-network \
  --sysctl net.core.rmem_max=134217728 \
  --sysctl net.core.wmem_max=134217728 \
  high-performance-app
Enter fullscreen mode Exit fullscreen mode

Monitoring and Maintenance

Health Checking:

# Add health checks to containers
docker run --health-cmd="curl -f http://localhost:8080/health || exit 1" \
  --health-interval=30s \
  --health-timeout=10s \
  --health-retries=3 \
  web-app

# Monitor health status
docker ps --format "table {{.Names}}\t{{.Status}}"
Enter fullscreen mode Exit fullscreen mode

Regular Maintenance:

# Clean up unused networks
docker network prune

# Monitor network usage
docker system df

# Backup network configurations
docker network ls --format "{{.Name}}" | xargs -I {} docker network inspect {} > network-backup.json

# Regular security audits
docker network ls --filter "driver=bridge" --format "{{.Name}}" | xargs -I {} docker network inspect {}
Enter fullscreen mode Exit fullscreen mode

Docker Compose Production Configuration

Production-Ready Compose File:

version: '3.8'
services:
  nginx:
    image: nginx:1.21-alpine
    ports:
      - "80:80"
      - "443:443"
    networks:
      - frontend
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80"]
      interval: 30s
      timeout: 10s
      retries: 3

  api:
    image: myapp:v1.2.3
    networks:
      - frontend
      - backend
    restart: unless-stopped
    environment:
      - DATABASE_URL=postgresql://db:5432/myapp
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  database:
    image: postgres:13-alpine
    networks:
      - backend
    restart: unless-stopped
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_PASSWORD_FILE=/run/secrets/db_password
    secrets:
      - db_password
    volumes:
      - db_data:/var/lib/postgresql/data

networks:
  frontend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: prod-frontend
  backend:
    driver: bridge
    internal: true
    driver_opts:
      com.docker.network.bridge.name: prod-backend

volumes:
  db_data:
    driver: local

secrets:
  db_password:
    file: ./db_password.txt
Enter fullscreen mode Exit fullscreen mode

Scaling and Load Balancing

Docker Swarm Network Configuration:

# Initialize Swarm for overlay networks
docker swarm init

# Create production overlay network
docker network create \
  --driver overlay \
  --attachable \
  --subnet=10.0.1.0/24 \
  --opt encrypted=true \
  production-overlay

# Deploy scalable service
docker service create \
  --name web \
  --replicas 3 \
  --network production-overlay \
  --publish published=80,target=80 \
  nginx

# Scale service
docker service scale web=5

# Update service with zero downtime
docker service update --image nginx:1.21-alpine web
Enter fullscreen mode Exit fullscreen mode

This comprehensive guide provides all the essential knowledge and commands needed to effectively implement and manage Docker networking in any environment, from development to large-scale production deployments. The combination of theoretical understanding, practical commands, and real-world examples ensures you can confidently design, deploy, and troubleshoot Docker networks for any use case.

Top comments (1)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.