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.

up down logs exec build
Quick Command Reference
Command Description Common Flags
docker compose upStart all services-d, --build, --scale
docker compose downStop and remove containers-v, --rmi, --remove-orphans
docker compose logsView service logs-f, --tail, --since
docker compose execRun command in running container-it, -e, -w, -u
docker compose psList containers-a, -q, --services
docker compose buildBuild or rebuild services--no-cache, --pull, --parallel
docker compose pullPull service images--ignore-pull-failures, --include-deps
docker compose restartRestart services--timeout, -t
docker compose stopStop services--timeout
docker compose startStart stopped servicesNone
docker compose pausePause servicesNone
docker compose unpauseUnpause servicesNone
docker compose configValidate and view config--format, --quiet
docker compose topDisplay running processesNone
docker compose eventsStream container events--json
docker compose portShow public port mapping--protocol
docker compose imagesList images used by services-q
docker compose versionShow Compose version--short
docker compose up: Start All Services

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: Stop and Remove Containers

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.
docker compose logs: View Service Logs

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: Run Commands in Running Containers

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
Common use: docker compose exec database psql -U postgres to access PostgreSQL, or docker compose exec app python manage.py shell for Django.
docker compose build: Build or Rebuild Services

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: Pull Latest Images

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
docker compose restart, stop, start: Manage Service State

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: List Containers

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"
Advanced Commands: config, top, events, port
# 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
Working with Multiple Compose Files

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
Common Workflow Examples
# 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
Frequently Asked Questions
What's the difference between docker compose up and docker compose start?
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.
How do I see logs for a specific service?
Use docker compose logs -f <service-name> to follow logs for that service only. Example: docker compose logs -f web.
Can I run a command in a container without a shell?
Yes: docker compose exec web ls -la. The command runs directly without opening an interactive shell. Add -T to disable pseudo-TTY for scripts.
How do I rebuild only one service?
Use docker compose build web (replace "web" with your service name). Then restart with docker compose up -d --no-deps web.
What does --no-deps mean?
It prevents Docker from also starting dependent services. When used with up or restart, only the specified service is affected, not its dependencies.
How do I stop only one service without stopping others?
Use docker compose stop web to stop just the web service. Use docker compose start web to start it again.
What's the difference between docker compose run and exec?
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.
How do I view Compose version compatibility?
Use 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.
Previous: Docker Compose Basics Next: Environment Variables in Compose

Mastering Docker Compose commands transforms how you manage multi-container applications. Practice these commands to become proficient in container orchestration.