HxHippy

DNS & Service Discovery

Configure DNS resolution and service discovery in Docker networks.

Last updated: 2025-01-15

Docker DNS & Service Discovery

Docker provides built-in DNS for container name resolution.

Automatic DNS

User-Defined Networks

# Create network
docker network create mynet

# Run containers
docker run -d --name web --network mynet nginx
docker run -d --name api --network mynet myapi

# Containers can resolve each other by name
docker exec api ping web
# Resolves to web container's IP

DNS Resolution Order

  1. Container's /etc/hosts
  2. Docker's embedded DNS server (127.0.0.11)
  3. External DNS servers

Configuring DNS

Container-Level

# Set DNS servers
docker run --dns 8.8.8.8 --dns 8.8.4.4 alpine

# Set DNS search domain
docker run --dns-search example.com alpine

# Set hostname
docker run --hostname mycontainer alpine

Daemon-Level

// /etc/docker/daemon.json
{
  "dns": ["8.8.8.8", "8.8.4.4"],
  "dns-search": ["example.com"]
}

Docker Compose DNS

version: '3.8'

services:
  web:
    image: nginx
    # Automatically gets DNS name "web"
    networks:
      - backend

  api:
    image: myapi
    # Can resolve "web" hostname
    depends_on:
      - web
    networks:
      - backend

  db:
    image: postgres
    # Service name "db" is DNS resolvable
    networks:
      - backend

networks:
  backend:
    driver: bridge

Service Aliases

services:
  database:
    image: postgres
    networks:
      backend:
        aliases:
          - db
          - postgres
          - primary-db
# All these resolve to same container
ping database
ping db
ping postgres
ping primary-db

External DNS Resolution

# Verify DNS resolution
docker run --rm alpine nslookup google.com

# Check configured DNS
docker run --rm alpine cat /etc/resolv.conf

Troubleshooting

# Check DNS server in container
docker exec mycontainer cat /etc/resolv.conf

# Test DNS resolution
docker run --network mynet busybox nslookup web

# Debug with netshoot
docker run -it --network mynet nicolaka/netshoot
> dig web
> nslookup api

DNS Round-Robin

# Multiple containers with same alias
docker run -d --name web1 --network mynet --network-alias web nginx
docker run -d --name web2 --network mynet --network-alias web nginx

# "web" resolves to both IPs (round-robin)
docker run --rm --network mynet alpine nslookup web

Best Practices

Practice Recommendation
Use user networks Default bridge has no DNS
Meaningful names Container names become DNS
Aliases for flexibility Multiple DNS names per container
Health checks Ensure services ready before resolution
intermediate Networking Updated 2025-01-15
  • docker
  • dns
  • service discovery
  • networking
  • containers