Docker Compose Networking
Compose creates a default network for service communication.
Default Network
services:
web:
image: nginx
api:
image: myapi
# Can reach web via hostname "web"
db:
image: postgres
# Can reach api via hostname "api"Services communicate using service names as hostnames.
Custom Networks
services:
frontend:
networks:
- frontend-net
api:
networks:
- frontend-net
- backend-net
db:
networks:
- backend-net
networks:
frontend-net:
backend-net:Network Configuration
networks:
frontend:
driver: bridge
backend:
driver: bridge
driver_opts:
com.docker.network.bridge.name: backend_br
internal:
internal: true # No external access
external-net:
external: true # Use existing networkService Network Options
services:
api:
networks:
frontend:
aliases:
- api-server
- backend-api
backend:
ipv4_address: 172.20.0.10
networks:
frontend:
backend:
ipam:
config:
- subnet: 172.20.0.0/24Network Isolation Pattern
services:
# Public-facing
nginx:
image: nginx
ports:
- "80:80"
networks:
- public
- internal
# Internal only
api:
image: myapi
networks:
- internal
- database
# Database tier
db:
image: postgres
networks:
- database
networks:
public: # Internet-facing
internal: # App tier
database: # Data tier (most restricted)
internal: trueHost Network Mode
services:
monitoring:
image: prometheus
network_mode: hostContainer Network Mode
services:
app:
image: myapp
sidecar:
image: monitoring
network_mode: service:app # Share network with appDNS Configuration
services:
api:
dns:
- 8.8.8.8
- 8.8.4.4
dns_search:
- example.comComplete Networking Example
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
networks:
- proxy
depends_on:
- frontend
- api
frontend:
build: ./frontend
networks:
- proxy
api:
build: ./api
networks:
- proxy
- backend
environment:
- DATABASE_URL=postgres://postgres:secret@db:5432/app
- REDIS_URL=redis://redis:6379
db:
image: postgres:16-alpine
networks:
- backend
volumes:
- db-data:/var/lib/postgresql/data
redis:
image: redis:alpine
networks:
- backend
networks:
proxy:
name: app-proxy
backend:
name: app-backend
internal: true # No external access
volumes:
db-data:Troubleshooting
# List networks
docker network ls
# Inspect network
docker network inspect project_backend
# Check container connectivity
docker compose exec api ping db
docker compose exec api nslookup db - docker compose
- networking
- bridge
- service discovery