Docker Compose Commands & Setup
Docker Compose commands and configuration patterns for multi-container applications.
Basic Commands
1# Start services
2docker-compose up
3docker-compose up -d # Detached mode
4
5# Start specific services
6docker-compose up app db
7
8# Build and start
9docker-compose up --build
10
11# Stop services
12docker-compose stop
13
14# Stop and remove containers
15docker-compose down
16
17# Stop and remove containers, volumes, images
18docker-compose down -v --rmi all
19
20# View logs
21docker-compose logs
22docker-compose logs -f # Follow
23docker-compose logs -f app # Specific service
24
25# List containers
26docker-compose ps
27
28# Execute command in service
29docker-compose exec app bash
30docker-compose exec db psql -U postgres
31
32# Run one-off command
33docker-compose run app npm test
34docker-compose run --rm app npm test # Remove after
35
36# View config
37docker-compose config
38
39# Validate config
40docker-compose config --quiet
41
42# Build services
43docker-compose build
44docker-compose build --no-cache
45
46# Pull images
47docker-compose pull
48
49# Restart services
50docker-compose restart
51docker-compose restart app
52
53# Pause services
54docker-compose pause
55
56# Unpause services
57docker-compose unpause
58
59# View service logs
60docker-compose logs --tail=100 app
Complete Examples
Full-Stack Web App
1version: '3.8'
2
3services:
4 # Frontend
5 frontend:
6 build:
7 context: ./frontend
8 dockerfile: Dockerfile
9 target: production
10 image: myapp-frontend:latest
11 container_name: frontend
12 ports:
13 - "3000:3000"
14 environment:
15 - REACT_APP_API_URL=http://localhost:8080
16 volumes:
17 - ./frontend:/app
18 - /app/node_modules
19 networks:
20 - app-network
21 depends_on:
22 - backend
23 restart: unless-stopped
24
25 # Backend API
26 backend:
27 build:
28 context: ./backend
29 dockerfile: Dockerfile
30 image: myapp-backend:latest
31 container_name: backend
32 ports:
33 - "8080:8080"
34 environment:
35 - NODE_ENV=production
36 - DATABASE_URL=postgres://postgres:password@db:5432/mydb
37 - REDIS_URL=redis://redis:6379
38 - JWT_SECRET=${JWT_SECRET}
39 env_file:
40 - .env
41 volumes:
42 - ./backend:/app
43 - /app/node_modules
44 - uploads:/app/uploads
45 networks:
46 - app-network
47 depends_on:
48 db:
49 condition: service_healthy
50 redis:
51 condition: service_started
52 restart: unless-stopped
53 healthcheck:
54 test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
55 interval: 30s
56 timeout: 10s
57 retries: 3
58 start_period: 40s
59
60 # PostgreSQL Database
61 db:
62 image: postgres:15-alpine
63 container_name: postgres
64 environment:
65 POSTGRES_DB: mydb
66 POSTGRES_USER: postgres
67 POSTGRES_PASSWORD: password
68 volumes:
69 - postgres-data:/var/lib/postgresql/data
70 - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
71 networks:
72 - app-network
73 ports:
74 - "5432:5432"
75 restart: unless-stopped
76 healthcheck:
77 test: ["CMD-SHELL", "pg_isready -U postgres"]
78 interval: 10s
79 timeout: 5s
80 retries: 5
81
82 # Redis Cache
83 redis:
84 image: redis:7-alpine
85 container_name: redis
86 command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}
87 volumes:
88 - redis-data:/data
89 networks:
90 - app-network
91 ports:
92 - "6379:6379"
93 restart: unless-stopped
94 healthcheck:
95 test: ["CMD", "redis-cli", "ping"]
96 interval: 10s
97 timeout: 3s
98 retries: 3
99
100 # Nginx Reverse Proxy
101 nginx:
102 image: nginx:alpine
103 container_name: nginx
104 ports:
105 - "80:80"
106 - "443:443"
107 volumes:
108 - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
109 - ./nginx/ssl:/etc/nginx/ssl:ro
110 networks:
111 - app-network
112 depends_on:
113 - frontend
114 - backend
115 restart: unless-stopped
116
117volumes:
118 postgres-data:
119 redis-data:
120 uploads:
121
122networks:
123 app-network:
124 driver: bridge
Microservices Architecture
1version: '3.8'
2
3services:
4 # API Gateway
5 gateway:
6 build: ./gateway
7 ports:
8 - "8080:8080"
9 environment:
10 - AUTH_SERVICE_URL=http://auth:8081
11 - USER_SERVICE_URL=http://user:8082
12 - ORDER_SERVICE_URL=http://order:8083
13 networks:
14 - microservices
15 depends_on:
16 - auth
17 - user
18 - order
19
20 # Auth Service
21 auth:
22 build: ./services/auth
23 environment:
24 - DATABASE_URL=postgres://postgres:password@auth-db:5432/auth
25 - JWT_SECRET=${JWT_SECRET}
26 networks:
27 - microservices
28 - auth-network
29 depends_on:
30 - auth-db
31
32 auth-db:
33 image: postgres:15-alpine
34 environment:
35 POSTGRES_DB: auth
36 POSTGRES_PASSWORD: password
37 volumes:
38 - auth-db-data:/var/lib/postgresql/data
39 networks:
40 - auth-network
41
42 # User Service
43 user:
44 build: ./services/user
45 environment:
46 - DATABASE_URL=postgres://postgres:password@user-db:5432/users
47 networks:
48 - microservices
49 - user-network
50 depends_on:
51 - user-db
52
53 user-db:
54 image: postgres:15-alpine
55 environment:
56 POSTGRES_DB: users
57 POSTGRES_PASSWORD: password
58 volumes:
59 - user-db-data:/var/lib/postgresql/data
60 networks:
61 - user-network
62
63 # Order Service
64 order:
65 build: ./services/order
66 environment:
67 - DATABASE_URL=postgres://postgres:password@order-db:5432/orders
68 - RABBITMQ_URL=amqp://rabbitmq:5672
69 networks:
70 - microservices
71 - order-network
72 depends_on:
73 - order-db
74 - rabbitmq
75
76 order-db:
77 image: postgres:15-alpine
78 environment:
79 POSTGRES_DB: orders
80 POSTGRES_PASSWORD: password
81 volumes:
82 - order-db-data:/var/lib/postgresql/data
83 networks:
84 - order-network
85
86 # Message Queue
87 rabbitmq:
88 image: rabbitmq:3-management-alpine
89 ports:
90 - "5672:5672"
91 - "15672:15672"
92 environment:
93 RABBITMQ_DEFAULT_USER: admin
94 RABBITMQ_DEFAULT_PASS: password
95 volumes:
96 - rabbitmq-data:/var/lib/rabbitmq
97 networks:
98 - microservices
99
100volumes:
101 auth-db-data:
102 user-db-data:
103 order-db-data:
104 rabbitmq-data:
105
106networks:
107 microservices:
108 driver: bridge
109 auth-network:
110 driver: bridge
111 user-network:
112 driver: bridge
113 order-network:
114 driver: bridge
Development Environment
1version: '3.8'
2
3services:
4 app:
5 build:
6 context: .
7 target: development
8 volumes:
9 - .:/app
10 - /app/node_modules
11 ports:
12 - "3000:3000"
13 environment:
14 - NODE_ENV=development
15 - DATABASE_URL=postgres://postgres:password@db:5432/dev
16 command: npm run dev
17 networks:
18 - dev-network
19 depends_on:
20 - db
21 - redis
22
23 db:
24 image: postgres:15-alpine
25 environment:
26 POSTGRES_DB: dev
27 POSTGRES_PASSWORD: password
28 volumes:
29 - postgres-dev-data:/var/lib/postgresql/data
30 ports:
31 - "5432:5432"
32 networks:
33 - dev-network
34
35 redis:
36 image: redis:7-alpine
37 ports:
38 - "6379:6379"
39 networks:
40 - dev-network
41
42 # Database admin tool
43 adminer:
44 image: adminer
45 ports:
46 - "8080:8080"
47 networks:
48 - dev-network
49 depends_on:
50 - db
51
52 # Redis admin tool
53 redis-commander:
54 image: rediscommander/redis-commander:latest
55 environment:
56 - REDIS_HOSTS=local:redis:6379
57 ports:
58 - "8081:8081"
59 networks:
60 - dev-network
61 depends_on:
62 - redis
63
64volumes:
65 postgres-dev-data:
66
67networks:
68 dev-network:
69 driver: bridge
Advanced Patterns
Override Files
docker-compose.yml (base):
1version: '3.8'
2services:
3 app:
4 image: myapp:latest
5 environment:
6 - NODE_ENV=production
docker-compose.override.yml (development):
1version: '3.8'
2services:
3 app:
4 build: .
5 volumes:
6 - .:/app
7 environment:
8 - NODE_ENV=development
9 command: npm run dev
docker-compose.prod.yml (production):
1version: '3.8'
2services:
3 app:
4 image: myapp:${VERSION}
5 restart: always
6 deploy:
7 replicas: 3
8 resources:
9 limits:
10 cpus: '0.5'
11 memory: 512M
1# Use override (default)
2docker-compose up
3
4# Use specific file
5docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
6
7# Multiple override files
8docker-compose -f docker-compose.yml -f docker-compose.override.yml -f docker-compose.local.yml up
Environment Variables
.env file:
1# Database
2POSTGRES_DB=mydb
3POSTGRES_USER=postgres
4POSTGRES_PASSWORD=secretpassword
5
6# Application
7NODE_ENV=production
8JWT_SECRET=your-secret-key
9API_PORT=8080
10
11# Redis
12REDIS_PASSWORD=redispassword
13
14# Version
15VERSION=1.0.0
docker-compose.yml:
1version: '3.8'
2services:
3 app:
4 image: myapp:${VERSION:-latest}
5 environment:
6 - NODE_ENV=${NODE_ENV}
7 - JWT_SECRET=${JWT_SECRET}
8 ports:
9 - "${API_PORT}:8080"
Health Checks
1services:
2 app:
3 healthcheck:
4 test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
5 interval: 30s
6 timeout: 10s
7 retries: 3
8 start_period: 40s
9
10 db:
11 healthcheck:
12 test: ["CMD-SHELL", "pg_isready -U postgres"]
13 interval: 10s
14 timeout: 5s
15 retries: 5
16
17 redis:
18 healthcheck:
19 test: ["CMD", "redis-cli", "ping"]
20 interval: 10s
21 timeout: 3s
22 retries: 3
Resource Limits
1services:
2 app:
3 deploy:
4 resources:
5 limits:
6 cpus: '0.50'
7 memory: 512M
8 reservations:
9 cpus: '0.25'
10 memory: 256M
Logging
1services:
2 app:
3 logging:
4 driver: "json-file"
5 options:
6 max-size: "10m"
7 max-file: "3"
Makefile Integration
1.PHONY: up down build logs shell test clean
2
3up:
4 docker-compose up -d
5
6down:
7 docker-compose down
8
9build:
10 docker-compose build
11
12logs:
13 docker-compose logs -f
14
15shell:
16 docker-compose exec app bash
17
18test:
19 docker-compose run --rm app npm test
20
21clean:
22 docker-compose down -v --rmi all
23 docker system prune -f
Troubleshooting
1# View service logs
2docker-compose logs -f app
3
4# Rebuild service
5docker-compose up -d --build app
6
7# Recreate containers
8docker-compose up -d --force-recreate
9
10# Remove volumes
11docker-compose down -v
12
13# Check service health
14docker-compose ps
15
16# Validate compose file
17docker-compose config
18
19# View service IPs
20docker-compose exec app cat /etc/hosts
Notes
Best Practices:
- ✅ Use version control for docker-compose.yml
- ✅ Use .env files for secrets (don't commit)
- ✅ Use health checks for critical services
- ✅ Set restart policies for production
- ✅ Use named volumes for data persistence
- ✅ Use networks to isolate services
- ✅ Set resource limits in production
- ✅ Use depends_on with health checks
- ✅ Use override files for different environments
Related Snippets
- Docker Commands Cheatsheet
Essential Docker commands for daily container management. Quick reference for … - Docker Image Optimization
Techniques for building small, efficient Docker images with focus on Alpine, …