Skillversitas

Docker Container Linking

Container linking allows containers to communicate with each other using hostnames.

Legacy Linking

# Link containers
docker run -d --name api --link database:db myapp

# Inside the api container, you can access the database using the hostname "db"
# Create a network
docker network create myapp-net

# Run containers on the same network
docker run -d --name database --network myapp-net postgres:15
docker run -d --name api --network myapp-net myapp

# Containers can resolve names
docker exec api ping database

Service Discovery

# On a custom network, Docker provides DNS
docker exec api nslookup database

# Access a service by name
docker exec api curl http://database:5432

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
    environment:
      - DB_HOST=database
      - REDIS_HOST=redis
    networks:
      - backend-net
    depends_on:
      - database
      - redis

networks:
  backend-net:

Everyday Use Case

Case: A developer needs to connect services.

# 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 the connection
docker exec api ping db
docker exec api nc -zv db 5432

DNS Configuration

# Custom DNS
docker run -d --dns 8.8.8.8 myapp

# Custom hosts
docker run -d --add-host=api:192.168.1.100 myapp

# DNS search domain
docker run -d --dns-search=myapp.local myapp

Best Practices

  1. Use a custom network: Better than legacy linking
  2. Use descriptive service names: For DNS resolution
  3. Define depends_on: For startup order
  4. Use healthchecks: To ensure a service is ready

Troubleshooting

Container cannot resolve a name

# Make sure they are on the same network
docker network inspect myapp-net

# Check DNS
docker exec api nslookup database

# Check the connection
docker exec api ping database

Conclusion

Custom networks are better than legacy linking for communication between containers. DNS resolution makes service discovery in Docker easier.