0 XP
?
Avancé65 min45 XP

Objectifs de cette leçon

  • Conteneuriser une application Laravel
  • Configurer PHP-FPM et Nginx dans Docker
  • Gérer la base de données MySQL conteneurisée

Dockeriser Laravel 🐘

Architecture d'une stack Laravel Dockerisée

┌─────────────────────────────────────────────────┐
│                Docker Compose                     │
├─────────────────┬───────────────┬────────────────┤
│     Nginx       │   PHP-FPM     │    MySQL       │
│   (port 80)     │  (port 9000)  │  (port 3306)   │
│                 │               │                │
│  Sert les      │  Exécute      │  Base de       │
│  fichiers      │  le code      │  données       │
│  statiques     │  PHP          │                │
└────────┬────────┴───────┬───────┴───────┬────────┘
         │                │               │
         └────────────────┼───────────────┘
                          │
                     Réseau bridge

Structure du projet

laravel-docker/
├── docker/
│   ├── nginx/
│   │   └── default.conf
│   └── php/
│       └── Dockerfile
├── src/                     # Code Laravel
│   ├── app/
│   ├── routes/
│   ├── database/
│   └── ...
├── docker-compose.yml
├── .env
└── .dockerignore

docker-compose.yml

version: '3.8'

services:
  # Nginx - Sert les fichiers statiques
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./src:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
    networks:
      - laravel-network

  # PHP-FPM - Exécute le code Laravel
  php:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
    networks:
      - laravel-network

  # MySQL - Base de données
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - laravel-network

  # Composer - Installation des dépendances
  composer:
    image: composer:latest
    volumes:
      - ./src:/app
    command: install --no-dev --optimize-autoloader
    networks:
      - laravel-network

volumes:
  mysql-data:

networks:
  laravel-network:
    driver: bridge

Dockerfile PHP-FPM

FROM php:8.2-fpm-alpine

# Installer les extensions nécessaires
RUN apk add --no-cache \
    libzip-dev \
    oniguruma-dev \
    libpng-dev \
    icu-dev \
    && docker-php-ext-install \
    pdo_mysql \
    mbstring \
    zip \
    bcmath \
    gd \
    intl

# Installer Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

# Copier les fichiers d'abord
COPY . .

# Installer les dépendances Laravel
RUN composer install --no-dev --optimize-autoloader

# Permissions
RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache

EXPOSE 9000

CMD ["php-fpm"]

Configuration Nginx

# docker/nginx/default.conf
server {
    listen 80;
    server_name localhost;
    root /var/www/html/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\. {
        deny all;
    }
}

.env

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:xxx
APP_DEBUG=true
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=secret

DB_ROOT_PASSWORD=rootsecret

Commandes essentielles

# Démarrer la stack
docker compose up -d

# Installer les dépendances
docker compose run --rm composer install

# Créer la base de données
docker compose run --rm php artisan migrate

# Générer la clé APP_KEY
docker compose run --rm php artisan key:generate

# Créer un controller
docker compose run --rm php artisan make:controller UserController

# Voir les logs
docker compose logs -f nginx
docker compose logs -f php

# Accéder au shell PHP
docker compose exec php sh

Stockage et cache

# Créer le lien symbolique de stockage
docker compose run --rm php artisan storage:link

# Vider le cache
docker compose run --rm php artisan cache:clear
docker compose run --rm php artisan config:clear
docker compose run --rm php artisan route:clear

Exercices 🎯

  1. Stack complète : Créez une stack Laravel + MySQL + Nginx avec Docker Compose.
  2. Migrations : Exécutez les migrations dans le conteneur.
  3. API : Créez une route API test et vérifiez-la avec curl.
  4. Stockage : Configurez le stockage des fichiers uploadés avec un volume.

Prochaine leçon : Dockeriser React et Next.js.

Dockeriser Laravel
Cliquez sur chaque étape
📄Code source

Application Laravel avec Eloquent, routes, contrôleurs

Technologie
Laravel 11 + PHP-FPM + Nginx
1/5