Stop doing docker compose down && docker compose up for every code change. Docker Compose lets you restart individual services while keeping the rest running.

The solution

Restart just what changed:

# Restart only the web service
docker compose up -d web

# Your database, cache, and queue keep running!

This simple command saves minutes per restart. Your database keeps its data, Redis maintains its cache, message queues preserve their state.

Common patterns

Basic restart after code changes:

# Make your changes, then:
docker compose up -d api

Force recreate when config changed:

# When you've changed environment variables or volumes
docker compose up -d --force-recreate web

Rebuild and restart for local builds:

# After changing code in a service you build
docker compose up -d --build api

Pull latest image and restart:

docker compose pull web
docker compose up -d web

Real production example

Here’s our typical development workflow:

services:
  api:
    build: ./api
    volumes:
      - ./api:/app  # Code mounted for development
    depends_on:
      - postgres
      - redis

  postgres:
    image: postgres:15
    volumes:
      - pgdata:/var/lib/postgresql/data  # Persistent data

  redis:
    image: redis:7-alpine

Development session:

# Start everything
docker compose up -d

# Make API changes, restart just the API
docker compose up -d api

# Database and Redis stay running with all your test data!

Check what’s running

See the impact:

# Before restart
docker compose ps

Output:

NAME                STATUS          PORTS
myapp-api-1        Up 2 hours      0.0.0.0:3000->3000/tcp
myapp-postgres-1   Up 2 hours      5432/tcp
myapp-redis-1      Up 2 hours      6379/tcp

After docker compose up -d api:

NAME                STATUS          PORTS
myapp-api-1        Up 5 seconds    0.0.0.0:3000->3000/tcp
myapp-postgres-1   Up 2 hours      5432/tcp        # Still running!
myapp-redis-1      Up 2 hours      6379/tcp        # Still running!

Multiple services at once

Restart several services together:

docker compose up -d web api worker

Common pitfall

Dependencies won’t start automatically with --no-deps:

# This won't start postgres if it's not running
docker compose up -d --no-deps web

# This ensures dependencies are running
docker compose up -d web

Pro tip

During development, an even faster solution exists - use docker compose up --watch for automatic hot reloading:

# Instead of manually restarting services
docker compose up --watch

# Files change → services automatically reload!

This enables hot reloading when your code changes. We’ll cover this powerful feature in detail in an upcoming post.

Performance impact

In our Docker Desktop development:

  • Full restart (down && up): ~45 seconds, loses all state
  • Single service restart: ~3 seconds, preserves everything

That’s 15x faster, plus no data loss or cache warming.

Stop restarting everything. Restart what changed. Your development speed will thank you.

Further reading