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.
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.