Container DNS & Service Discovery

Learn how Docker's built-in DNS works for service discovery. Understand name resolution in custom networks, DNS aliases, and container-to-container communication.

Networks

Detailed Explanation

Docker's Built-In DNS

When you create a custom network, Docker provides an embedded DNS server that allows containers to resolve each other by name.

How DNS Resolution Works

On user-defined networks (not the default bridge), Docker maps container names to their IP addresses:

docker network create app-net
docker run -d --name redis --network app-net redis:7
docker run -d --name api --network app-net my-api

# Inside the api container, "redis" resolves to redis's IP
# Your app connects to redis://redis:6379

Important: Default Bridge Has No DNS

The default bridge network does not provide automatic DNS resolution. You must use IP addresses or create a custom network:

# BAD: default bridge, no DNS
docker run -d --name db postgres:16
docker run -d --name api my-api
# api cannot reach "db" by name

# GOOD: custom network, DNS works
docker network create my-net
docker run -d --name db --network my-net postgres:16
docker run -d --name api --network my-net my-api
# api can reach "db" by name

Network Aliases

Containers can have multiple DNS names using aliases:

docker run -d \
  --name postgres-primary \
  --network app-net \
  --network-alias db \
  --network-alias database \
  postgres:16

Now other containers can reach PostgreSQL via postgres-primary, db, or database.

Round-Robin DNS

Multiple containers with the same alias get round-robin DNS:

docker run -d --name worker1 --network app-net --network-alias worker my-worker
docker run -d --name worker2 --network app-net --network-alias worker my-worker
docker run -d --name worker3 --network app-net --network-alias worker my-worker
# Requests to "worker" rotate between worker1, worker2, worker3

Docker Compose DNS

In Docker Compose, service names are automatically resolvable:

services:
  api:
    image: my-api
    # Connects to redis via hostname "redis"
  redis:
    image: redis:7

Use Case

Building microservice architectures with automatic service discovery, load-balancing across container replicas with DNS aliases, and migrating from legacy --link-based setups to modern DNS-based networking.

Try It — Docker CLI Reference

Open full tool