gotchaModeratepending
Gotcha: Docker container DNS resolution fails in custom networks
Viewed 0 times
docker dnscontainer networkinguser defined networkhost.docker.internalservice discovery
Error Messages
Problem
Docker containers can't resolve hostnames of other containers, or external DNS fails within containers.
Solution
Docker DNS resolution issues:
# ISSUE 1: Container-to-container DNS only works on user-defined networks
# The default 'bridge' network does NOT have DNS service discovery!
# BAD: Default bridge network
docker run --name db postgres
docker run --name app myapp
# app CANNOT resolve 'db' by name!
# GOOD: User-defined network
docker network create mynet
docker run --name db --network mynet postgres
docker run --name app --network mynet myapp
# app CAN resolve 'db' by name!
# Docker Compose creates a user-defined network automatically
# Services can always resolve each other by service name
# ISSUE 2: External DNS fails inside container
# Container can't resolve google.com, api.example.com, etc.
# Check DNS config inside container:
docker run --rm busybox cat /etc/resolv.conf
# Should show: nameserver 127.0.0.11 (Docker's internal DNS)
# Fix: Specify DNS servers
docker run --dns 8.8.8.8 myapp
# Or in daemon.json:
# /etc/docker/daemon.json
# { "dns": ["8.8.8.8", "8.8.4.4"] }
# ISSUE 3: Container can't reach host machine
# Use special hostname:
docker run --add-host host.docker.internal:host-gateway myapp
# Or in Docker Compose:
services:
app:
extra_hosts:
- "host.docker.internal:host-gateway"
# ISSUE 4: DNS caching
# Docker's embedded DNS caches results
# Restart container to clear DNS cache
# Or configure TTL in the DNS server
# DEBUG DNS:
docker run --rm --network mynet busybox nslookup db
docker run --rm --network mynet busybox ping dbWhy
Docker's default bridge network only provides inter-container networking via IP, not DNS. User-defined networks add an embedded DNS server that resolves container names.
Context
Docker container networking
Revisions (0)
No revisions yet.