Si tu as déjà passé 3 heures à installer des dépendances sur un nouveau poste, cet article est pour toi. Docker résout ce problème de manière élégante : tout ton environnement tient dans un fichier.

Le problème

Chaque projet a ses propres besoins :

  • Node 18 pour le projet A, Node 20 pour le projet B
  • PostgreSQL 14 ici, MySQL 8 là
  • Redis, RabbitMQ, Elasticsearch…

Installer tout ça nativement, c’est le chaos.

La solution : Docker Compose

Un seul fichier docker-compose.yml et tout ton stack tourne :

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      DATABASE_URL: postgres://dev:dev@db:5432/myapp
    depends_on:
      - db
      - redis

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: dev
      POSTGRES_PASSWORD: dev
      POSTGRES_DB: myapp
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  pgdata:

Le Dockerfile

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .

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

Les commandes essentielles

# Lancer tout le stack
docker compose up -d

# Voir les logs
docker compose logs -f app

# Entrer dans un container
docker compose exec app sh

# Tout arrêter et nettoyer
docker compose down -v

Tips de productivité

  1. Utilise des volumes nommés pour persister les données de la DB entre les redémarrages
  2. Monte ton code en volume pour le hot-reload
  3. Exclue node_modules du volume monté (sinon c’est lent sur Windows/Mac)
  4. Crée un Makefile pour simplifier les commandes :
.PHONY: up down logs shell

up:
	docker compose up -d

down:
	docker compose down

logs:
	docker compose logs -f

shell:
	docker compose exec app sh

Conclusion

Docker, c’est comme un bon pedalboard : une fois que tout est branché et configuré, tu n’y touches plus. Tu branches, tu joues.

“Works on my machine” n’est plus une excuse, c’est une garantie.