Docker en local : le workflow qui ne complique pas la vie

Le problème que Docker résout vraiment

Pas les microservices. Pas le scaling. En local, Docker sert à une chose : avoir le même environnement partout, sans installer PHP 8.3, PostgreSQL 16, Redis et Node 20 directement sur ta machine.

Structure de base

copier

projet/
├── docker-compose.yml
├── Dockerfile ← optionnel si tu utilises une image standard
└── src/

docker-compose.yml minimaliste pour un projet PHP

yaml copier

services:
app:
image: php:8.3-apache
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
depends_on:
- db

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

adminer:
image: adminer
ports:
- "8081:8080"

volumes:
pgdata:

Lance avec :

bash copier

docker compose up -d # démarrer en fond
docker compose logs -f # voir les logs
docker compose down # arrêter
docker compose down -v # arrêter + effacer les volumes

Entrer dans un conteneur

bash copier

docker compose exec app bash # shell dans le conteneur app
docker compose exec db psql -U dev monprojet # psql directement

Dockerfile quand l'image de base ne suffit pas

dockerfile copier

FROM php:8.3-apache

# Extensions PHP
RUN docker-php-ext-install pdo pdo_pgsql

# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html
COPY src/ .

RUN composer install --no-dev --optimize-autoloader

Variables d'environnement sans taper son mot de passe dans le YAML

bash copier

# .env (à la racine, jamais committé)
POSTGRES_PASSWORD=monsupermotdepasse

yaml copier

# docker-compose.yml
services:
db:
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

Docker Compose lit .env automatiquement.

Les commandes du quotidien

bash copier

docker ps # conteneurs en cours
docker images # images disponibles
docker system prune -f # nettoyer les images/conteneurs inutilisés
docker stats # CPU/RAM en temps réel
docker compose restart app # redémarrer un seul service
docker compose up -d --build app # rebuilder après changement du Dockerfile

Quand ne pas utiliser Docker en local

Sites statiques (HTML/CSS/JS pur) → un simple python -m http.server 8080 suffit

Scripts PHP simples → PHP built-in server : php -S localhost:8080

Tu travailles sur iPad ou machine lente → la surcharge Docker n'en vaut pas le coût

Ajoute .dockerignore à la racine pour éviter de copier node_modules, .git et .env dans l'image : ça réduit drastiquement le temps de build.