Skillversitas

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

  1. Use a custom network: For DNS resolution
  2. Use clear service names: For hostnames
  3. Define depends_on: For startup order
  4. 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.