Docker Compose Commands
Docker Compose provides a rich set of commands to manage your multi-container applications. This guide covers every essential command: up, down, logs, exec, build, pull, restart, and more, with practical examples and common use cases.
| Command | Description | Common Flags |
|---|---|---|
docker compose up | Start all services | -d, --build, --scale |
docker compose down | Stop and remove containers | -v, --rmi, --remove-orphans |
docker compose logs | View service logs | -f, --tail, --since |
docker compose exec | Run command in running container | -it, -e, -w, -u |
docker compose ps | List containers | -a, -q, --services |
docker compose build | Build or rebuild services | --no-cache, --pull, --parallel |
docker compose pull | Pull service images | --ignore-pull-failures, --include-deps |
docker compose restart | Restart services | --timeout, -t |
docker compose stop | Stop services | --timeout |
docker compose start | Start stopped services | None |
docker compose pause | Pause services | None |
docker compose unpause | Unpause services | None |
docker compose config | Validate and view config | --format, --quiet |
docker compose top | Display running processes | None |
docker compose events | Stream container events | --json |
docker compose port | Show public port mapping | --protocol |
docker compose images | List images used by services | -q |
docker compose version | Show Compose version | --short |
docker compose up is the most frequently used command. It reads your docker-compose.yml file, builds or pulls images, creates networks and volumes, and starts all containers. By default, it runs in the foreground and logs output to the terminal. Pressing Ctrl+C stops all containers.
For production or background development, use the -d flag to run in detached mode. Add --build to rebuild images before starting, and use --scale to run multiple instances of a service.
# Start all services (foreground)
docker compose up
# Start in background (detached mode)
docker compose up -d
# Rebuild images before starting
docker compose up -d --build
# Start only specific services
docker compose up -d web database
# Scale a service to 3 instances
docker compose up -d --scale worker=3
# Force recreate containers even if config unchanged
docker compose up -d --force-recreate
# Remove orphans (containers not defined in compose)
docker compose up -d --remove-orphans
# Timeout for graceful shutdown (default 10s)
docker compose up --timeout 30
docker compose down stops running containers and removes them. By default, it also removes the default network. Use -v to also remove named volumes (careful—this deletes persistent data). Use --rmi to remove images.
# Stop and remove containers, networks
docker compose down
# Also remove named volumes (WARNING: data loss)
docker compose down -v
# Also remove images used by services
docker compose down --rmi all # Remove all images
docker compose down --rmi local # Remove only custom images
# Remove orphan containers as well
docker compose down --remove-orphans
# Set timeout for graceful shutdown
docker compose down --timeout 30
docker compose down -v permanently deletes data stored in named volumes. Use with caution, especially for production databases.
Logs are essential for debugging. docker compose logs shows output from all services. Use -f to follow (tail) the logs in real-time. Use --tail to limit the number of lines.
# Show logs from all services
docker compose logs
# Follow logs (live streaming)
docker compose logs -f
# Show last 50 lines
docker compose logs --tail=50
# Show logs since timestamp
docker compose logs --since=2024-01-01
# Show logs for specific service only
docker compose logs web
# Follow logs for multiple services
docker compose logs -f web database
# Show timestamps
docker compose logs -t
# No color output (for scripts)
docker compose logs --no-color
docker compose exec runs a command in an already running container. This is invaluable for debugging, running migrations, or executing one-off tasks. Unlike docker compose run, exec does not create a new container.
# Get a shell inside the web container
docker compose exec web bash
# Run a single command
docker compose exec web npm run migrate
# Run command with environment variable
docker compose exec -e NODE_ENV=production web npm start
# Set working directory
docker compose exec -w /app web ls
# Run as specific user
docker compose exec -u node web npm test
# Run in interactive mode
docker compose exec -it web sh
# Run without TTY (for scripts)
docker compose exec -T web ls > output.txt
# Run on specific index (when scaled)
docker compose exec --index=1 web sh
docker compose exec database psql -U postgres to access PostgreSQL, or docker compose exec app python manage.py shell for Django.
docker compose build builds images for services defined with a build section. It's useful after code changes that require rebuilding the image. Use --no-cache to force a full rebuild without using the cache.
# Build all services
docker compose build
# Build specific service only
docker compose build app
# Build without using cache
docker compose build --no-cache
# Build in parallel (faster for multiple services)
docker compose build --parallel
# Pull latest base images before building
docker compose build --pull
# Build and then start
docker compose up -d --build
docker compose pull downloads the latest versions of images from registries. This is useful before starting services to ensure you have the latest patches. It does not restart running services.
# Pull all service images
docker compose pull
# Pull specific service
docker compose pull web
# Ignore pull failures for missing images
docker compose pull --ignore-pull-failures
# Pull images for dependencies first
docker compose pull --include-deps
# Quiet mode (no progress output)
docker compose pull --quiet
These commands control the running state of services without removing containers. Use restart to stop and start services, stop to stop them (preserving containers), and start to start stopped services.
# Restart all services
docker compose restart
# Restart specific service
docker compose restart web
# Restart with timeout (30 seconds)
docker compose restart --timeout 30
# Stop all services (containers preserved)
docker compose stop
# Stop specific service
docker compose stop database
# Start stopped services
docker compose start
# Start specific service
docker compose start web
docker compose ps shows the status of all containers managed by Compose, including their state, ports, and names. It's a quick way to check which services are running.
# Show all containers (default)
docker compose ps
# Show only container IDs
docker compose ps -q
# Show stopped containers as well
docker compose ps -a
# Show only service names
docker compose ps --services
# Filter by status
docker compose ps --filter "status=running"
docker compose ps --filter "status=exited"
# Validate compose file without running
docker compose config
# Validate and show resolved configuration
docker compose config --format yaml
# Quiet validation (exit code only)
docker compose config --quiet
# Show running processes inside containers
docker compose top
# Stream container events in real-time
docker compose events
docker compose events --json
# Show public port mapping
docker compose port web 80
docker compose port web 8080 --protocol udp
# List images used by services
docker compose images
# Show version info
docker compose version
docker compose version --short
You can use multiple compose files to override configurations for different environments. The -f flag lets you specify which files to use. Later files override earlier ones.
# Use custom compose file name
docker compose -f docker-compose.custom.yml up
# Use multiple files (prod overrides dev)
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# Override with environment-specific file
docker compose -f docker-compose.yml -f docker-compose.override.yml up
# Use project name to separate environments
docker compose -p staging -f docker-compose.yml up -d
docker compose -p production -f docker-compose.yml -f docker-compose.prod.yml up -d
# Development workflow
docker compose up -d # Start all services
docker compose logs -f app # Watch app logs
docker compose exec app bash # Enter app container
docker compose down # Stop everything
# Update after code change
docker compose build app # Rebuild app image
docker compose up -d --no-deps app # Restart only app
# Database migration
docker compose exec app npm run migrate
docker compose exec database pg_dump > backup.sql
# Testing
docker compose run --rm app npm test
docker compose down -v # Clean up after tests
# Production update
docker compose pull # Get latest images
docker compose up -d --build # Recreate with new images
docker compose down --remove-orphans # Clean up old containers
up creates and starts containers (or recreates if config changed). start only starts existing, stopped containers. Use up for first launch, start for restarting after a stop.docker compose logs -f <service-name> to follow logs for that service only. Example: docker compose logs -f web.docker compose exec web ls -la. The command runs directly without opening an interactive shell. Add -T to disable pseudo-TTY for scripts.docker compose build web (replace "web" with your service name). Then restart with docker compose up -d --no-deps web.up or restart, only the specified service is affected, not its dependencies.docker compose stop web to stop just the web service. Use docker compose start web to start it again.run creates a new container (like docker run), while exec runs in an existing container. Use exec for debugging running services; use run for one-off tasks like database migrations.docker compose version to see your version. Compose file version 3.8 works with Docker Engine 19.03+. For most users, version 3.8 is recommended.Mastering Docker Compose commands transforms how you manage multi-container applications. Practice these commands to become proficient in container orchestration.