269 lines
3.8 KiB
Markdown
269 lines
3.8 KiB
Markdown
# Docker Compose Reference
|
|
|
|
## File Structure
|
|
|
|
```yaml
|
|
name: project-name # Optional, defaults to directory name
|
|
|
|
services:
|
|
service-name:
|
|
# Image or build
|
|
image: image:tag
|
|
build:
|
|
context: ./path
|
|
dockerfile: Dockerfile
|
|
|
|
# Networking
|
|
ports:
|
|
- "host:container"
|
|
networks:
|
|
- network-name
|
|
|
|
# Storage
|
|
volumes:
|
|
- named-volume:/path
|
|
- ./host-path:/container-path
|
|
|
|
# Environment
|
|
environment:
|
|
KEY: value
|
|
env_file:
|
|
- .env
|
|
|
|
# Dependencies
|
|
depends_on:
|
|
- other-service
|
|
|
|
# Lifecycle
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
|
|
# Resources
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '0.5'
|
|
memory: 512M
|
|
reservations:
|
|
memory: 256M
|
|
|
|
networks:
|
|
network-name:
|
|
driver: bridge
|
|
|
|
volumes:
|
|
named-volume:
|
|
```
|
|
|
|
## Service Options
|
|
|
|
### Image vs Build
|
|
|
|
```yaml
|
|
# Use existing image
|
|
image: nginx:1.25-alpine
|
|
|
|
# Build from Dockerfile
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
args:
|
|
BUILD_ARG: value
|
|
```
|
|
|
|
### Port Mapping
|
|
|
|
```yaml
|
|
ports:
|
|
- "80:80" # host:container
|
|
- "443:443"
|
|
- "127.0.0.1:8080:80" # localhost only
|
|
- "8080-8090:8080-8090" # range
|
|
```
|
|
|
|
### Environment Variables
|
|
|
|
```yaml
|
|
# Inline
|
|
environment:
|
|
DATABASE_URL: postgres://db:5432/app
|
|
DEBUG: "false"
|
|
|
|
# From file
|
|
env_file:
|
|
- .env
|
|
- .env.local
|
|
```
|
|
|
|
### Dependencies
|
|
|
|
```yaml
|
|
depends_on:
|
|
- db
|
|
- redis
|
|
|
|
# With conditions (compose v2.1+)
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
```
|
|
|
|
### Restart Policies
|
|
|
|
| Policy | Behavior |
|
|
|--------|----------|
|
|
| no | Never restart (default) |
|
|
| always | Always restart |
|
|
| unless-stopped | Restart unless manually stopped |
|
|
| on-failure | Restart only on error exit |
|
|
|
|
### Health Checks
|
|
|
|
```yaml
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost/health"]
|
|
interval: 30s # Time between checks
|
|
timeout: 10s # Check timeout
|
|
retries: 3 # Failures before unhealthy
|
|
start_period: 40s # Grace period on startup
|
|
```
|
|
|
|
### Resource Limits
|
|
|
|
```yaml
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
cpus: '2'
|
|
memory: 1G
|
|
reservations:
|
|
cpus: '0.5'
|
|
memory: 256M
|
|
```
|
|
|
|
## Network Configuration
|
|
|
|
### Custom Network
|
|
|
|
```yaml
|
|
networks:
|
|
frontend:
|
|
driver: bridge
|
|
backend:
|
|
driver: bridge
|
|
internal: true # No external access
|
|
```
|
|
|
|
### External Network
|
|
|
|
```yaml
|
|
networks:
|
|
existing-network:
|
|
external: true
|
|
```
|
|
|
|
### Macvlan Network
|
|
|
|
```yaml
|
|
networks:
|
|
lan:
|
|
driver: macvlan
|
|
driver_opts:
|
|
parent: eth0
|
|
ipam:
|
|
config:
|
|
- subnet: 192.168.1.0/24
|
|
gateway: 192.168.1.1
|
|
```
|
|
|
|
## Volume Configuration
|
|
|
|
### Named Volume
|
|
|
|
```yaml
|
|
volumes:
|
|
data:
|
|
driver: local
|
|
|
|
services:
|
|
db:
|
|
volumes:
|
|
- data:/var/lib/mysql
|
|
```
|
|
|
|
### Bind Mount
|
|
|
|
```yaml
|
|
services:
|
|
web:
|
|
volumes:
|
|
- ./config:/etc/app/config:ro
|
|
- ./data:/app/data
|
|
```
|
|
|
|
### tmpfs Mount
|
|
|
|
```yaml
|
|
services:
|
|
app:
|
|
tmpfs:
|
|
- /tmp
|
|
- /run
|
|
```
|
|
|
|
## Multi-Environment Setup
|
|
|
|
### Using .env Files
|
|
|
|
```bash
|
|
# .env
|
|
COMPOSE_PROJECT_NAME=myapp
|
|
IMAGE_TAG=latest
|
|
```
|
|
|
|
```yaml
|
|
# docker-compose.yaml
|
|
services:
|
|
app:
|
|
image: myapp:${IMAGE_TAG}
|
|
```
|
|
|
|
### Override Files
|
|
|
|
```bash
|
|
# Base config
|
|
docker-compose.yaml
|
|
|
|
# Development overrides
|
|
docker-compose.override.yaml # Auto-loaded
|
|
|
|
# Production
|
|
docker compose -f docker-compose.yaml -f docker-compose.prod.yaml up
|
|
```
|
|
|
|
## Useful Commands
|
|
|
|
```bash
|
|
# Start with rebuild
|
|
docker compose up -d --build
|
|
|
|
# Scale service
|
|
docker compose up -d --scale web=3
|
|
|
|
# View config after variable substitution
|
|
docker compose config
|
|
|
|
# Execute command in service
|
|
docker compose exec web sh
|
|
|
|
# View service logs
|
|
docker compose logs -f web
|
|
|
|
# Restart single service
|
|
docker compose restart web
|
|
```
|