Back to Blog
DevOps8 min read

Docker Compose for Local Development Environments

Set up consistent development environments across your team with Docker Compose.

March 18, 2024
#Docker#DevOps#Local Dev

Why Docker Compose?


  • **Consistency**: Same environment for all developers
  • **Isolation**: Services don't interfere with each other
  • **Speed**: Quick setup for new team members
  • **Production-like**: Mirror production architecture
  • Basic Compose File


    version: '3.8'


    services:

    app:

    build:

    context: .

    target: development

    ports:

    - "3000:3000"

    volumes:

    - .:/app

    - /app/node_modules

    environment:

    - NODE_ENV=development

    - DATABASE_URL=postgres://user:pass@db:5432/mydb

    - REDIS_URL=redis://redis:6379

    depends_on:

    db:

    condition: service_healthy

    redis:

    condition: service_started

    command: npm run dev


    db:

    image: postgres:15-alpine

    volumes:

    - postgres_data:/var/lib/postgresql/data

    environment:

    POSTGRES_USER: user

    POSTGRES_PASSWORD: pass

    POSTGRES_DB: mydb

    healthcheck:

    test: ["CMD-SHELL", "pg_isready -U user -d mydb"]

    interval: 5s

    timeout: 5s

    retries: 5


    redis:

    image: redis:7-alpine

    volumes:

    - redis_data:/data


    mailhog:

    image: mailhog/mailhog

    ports:

    - "1025:1025"

    - "8025:8025"


    volumes:

    postgres_data:

    redis_data:

    Multi-stage Dockerfile


    FROM node:20-alpine AS builder

    WORKDIR /app

    COPY package*.json ./

    RUN npm ci

    COPY . .

    RUN npm run build


    FROM node:20-alpine AS development

    WORKDIR /app

    COPY package*.json ./

    RUN npm ci

    COPY . .

    EXPOSE 3000

    CMD ["npm", "run", "dev"]


    FROM node:20-alpine AS production

    WORKDIR /app

    COPY --from=builder /app/dist ./dist

    COPY --from=builder /app/node_modules ./node_modules

    EXPOSE 3000

    CMD ["node", "dist/main.js"]

    Common Commands


    docker-compose up -d


    docker-compose logs -f app


    docker-compose down


    docker-compose up --build


    docker-compose exec app sh

    Conclusion


    Docker Compose transforms team collaboration. New developers can start contributing in minutes instead of days.

    version: '3.8' services: app: build: context: . target: development ports: - "3000:3000" volumes: - .:/app - /app/node_modules environment: - NODE_ENV=development - DATABASE_URL=postgres://user:pass@db:5432/mydb - REDIS_URL=redis://redis:6379 depends_on: db: condition: service_healthy redis: condition: service_started command: npm run dev db: image: postgres:15-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: mydb healthcheck: test: ["CMD-SHELL", "pg_isready -U user -d mydb"] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine volumes: - redis_data:/data mailhog: image: mailhog/mailhog ports: - "1025:1025" - "8025:8025" volumes: postgres_data: redis_data:
    # Build stage FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # Development stage FROM node:20-alpine AS development WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . EXPOSE 3000 CMD ["npm", "run", "dev"] # Production stage FROM node:20-alpine AS production WORKDIR /app COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules EXPOSE 3000 CMD ["node", "dist/main.js"]
    # Start all services docker-compose up -d # View logs docker-compose logs -f app # Stop all services docker-compose down # Rebuild containers docker-compose up --build # Run command in service docker-compose exec app sh

    Need Help with Your Project?

    Our team can help you implement these patterns in your application.

    Get in Touch