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"
Custom Network (Recommended)
# 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
- Use a custom network: Better than legacy linking
- Use descriptive service names: For DNS resolution
- Define depends_on: For startup order
- 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.