Docker DNS
Docker provides DNS resolution for communication between containers.
DNS on a Custom Network
# Create a network
docker network create app-net
# Run containers
docker run -d --name api --network app-net myapp
docker run -d --name web --network app-net nginx
# The web container can access the api using the hostname "api"
docker exec web ping api
docker exec web curl http://api:3000
DNS Configuration
# Custom DNS server
docker run -d --dns 8.8.8.8 myapp
# Custom DNS search
docker run -d --dns-search=example.com myapp
# Custom hosts
docker run -d --add-host=api:192.168.1.100 myapp
Docker DNS Server
# Docker provides an internal DNS server
# Containers on the same network can resolve names
# Check DNS
docker exec web nslookup api
docker exec web cat /etc/resolv.conf
Use Case: Application
version: '3.8'
services:
database:
image: postgres:15
networks:
- backend-net
redis:
image: redis:7-alpine
networks:
- backend-net
api:
build: ./backend
networks:
- backend-net
environment:
- DB_HOST=database
- REDIS_HOST=redis
nginx:
image: nginx:alpine
networks:
- frontend-net
- backend-net
ports:
- "80:80"
networks:
frontend-net:
backend-net:
Everyday Use Case
Case: A developer needs to access another service.
# Run with a custom network
docker network create app-net
docker run -d --name db --network app-net postgres:15
docker run -d --name api --network app-net \
-e DB_HOST=db myapp
# Verify DNS
docker exec api ping db
docker exec api nslookup db
Best Practices
- Use a custom network: For DNS resolution
- Use clear service names: For hostnames
- Define depends_on: For startup order
- Use healthchecks: To ensure a service is ready
Troubleshooting
DNS not resolving
# Make sure they are on the same network
docker network inspect app-net
# Check DNS
docker exec api cat /etc/resolv.conf
# Test DNS
docker exec api nslookup database
Conclusion
Docker DNS makes communication between containers easier. Use custom networks for reliable DNS resolution.