HxHippy

Compose Networking

Configure networks for service communication in Docker Compose.

Last updated: 2025-01-15

Docker Compose Networking

Compose creates a default network for service communication.

Default Network

services:
  web:
    image: nginx

  api:
    image: myapi
    # Can reach web via hostname "web"

  db:
    image: postgres
    # Can reach api via hostname "api"

Services communicate using service names as hostnames.

Custom Networks

services:
  frontend:
    networks:
      - frontend-net

  api:
    networks:
      - frontend-net
      - backend-net

  db:
    networks:
      - backend-net

networks:
  frontend-net:
  backend-net:

Network Configuration

networks:
  frontend:
    driver: bridge

  backend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: backend_br

  internal:
    internal: true    # No external access

  external-net:
    external: true    # Use existing network

Service Network Options

services:
  api:
    networks:
      frontend:
        aliases:
          - api-server
          - backend-api
      backend:
        ipv4_address: 172.20.0.10

networks:
  frontend:
  backend:
    ipam:
      config:
        - subnet: 172.20.0.0/24

Network Isolation Pattern

services:
  # Public-facing
  nginx:
    image: nginx
    ports:
      - "80:80"
    networks:
      - public
      - internal

  # Internal only
  api:
    image: myapi
    networks:
      - internal
      - database

  # Database tier
  db:
    image: postgres
    networks:
      - database

networks:
  public:        # Internet-facing
  internal:      # App tier
  database:      # Data tier (most restricted)
    internal: true

Host Network Mode

services:
  monitoring:
    image: prometheus
    network_mode: host

Container Network Mode

services:
  app:
    image: myapp

  sidecar:
    image: monitoring
    network_mode: service:app    # Share network with app

DNS Configuration

services:
  api:
    dns:
      - 8.8.8.8
      - 8.8.4.4
    dns_search:
      - example.com

Complete Networking Example

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    networks:
      - proxy
    depends_on:
      - frontend
      - api

  frontend:
    build: ./frontend
    networks:
      - proxy

  api:
    build: ./api
    networks:
      - proxy
      - backend
    environment:
      - DATABASE_URL=postgres://postgres:secret@db:5432/app
      - REDIS_URL=redis://redis:6379

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

  redis:
    image: redis:alpine
    networks:
      - backend

networks:
  proxy:
    name: app-proxy
  backend:
    name: app-backend
    internal: true   # No external access

volumes:
  db-data:

Troubleshooting

# List networks
docker network ls

# Inspect network
docker network inspect project_backend

# Check container connectivity
docker compose exec api ping db
docker compose exec api nslookup db
intermediate Docker Compose Updated 2025-01-15
  • docker compose
  • networking
  • bridge
  • service discovery