20 févr. 2025 | Connexion

Blog

Symfony 7 avec Docker

Symfony 7 avec Docker

Développement web Administration système
Symfony PHP MySQL Nginx Mail Docker

il y a 9 jours citizenz7 2 commentaires 7023 lectures

Retrouvez le tuto complet sur Youtube !

Ce que nous voulons : docker-compose, PHP 8.3-fpm, Nginx, MariaDB, PhpMyAdmin, Mailpit
Avec ces applis, nous aurons un environnement de travail quasi complet (serveur web, PHP, MySQL, Mail)

Je pars du principe que docker et docker compose sont disponibles sur votre machine.

1. Créons premièrement un nouveau dossier : MonApp (ou ce que vous voulez :D )
2. On se place dans MonApp/ et on crée un fichier docker-compose.yaml avec "plein de choses" dedans, à savoir : PHP, MariaDB, Mailpit, Nginx, PhpMyAdmin

services:
  php:
    image: php:8.3-fpm

    build: .
    container_name: php
    volumes:
      - ./app:/var/www/html
      - ./php.ini:/usr/local/etc/php/php.ini
    environment:
      - SYMFONY_ENV=dev
    ports:
      - "9000:9000"
    depends_on:
      - mariadb

  mariadb:
    image: mariadb:latest
    container_name: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: symfony
      MYSQL_USER: symfony
      MYSQL_PASSWORD: symfony
    ports:
      - "3307:3306" # Le port local est maintenant 3307
    volumes:
      - db_data:/var/lib/mysql

  mailpit:
    image: axllent/mailpit:latest
    container_name: mailpit
    ports:
      - "1025:1025"
      - "8025:8025"
    environment:
      - MAILPIT_RELAY=127.0.0.1:25

  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "8080:80"
    volumes:
      - ./app:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    container_name: phpmyadmin
    environment:
      PMA_HOST: mariadb # Nom du conteneur MariaDB
      PMA_PORT: 3306    # Port interne utilisé par phpMyAdmin
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "8081:80" # Accès à phpMyAdmin via le port 8081
    depends_on:
      - mariadb

volumes:
  db_data:

 
3. On va créer un fichier Dockerfile qui va se charger de configurer PHP en ajoutant notamment quelques "plugins" :

FROM php:8.3-fpm

RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev

RUN docker-php-ext-install opcache
RUN pecl install apcu
RUN docker-php-ext-enable apcu
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug

COPY php.ini /usr/local/etc/php/php.ini

4. On va ensuite créer un fichier php.ini pour configurer PHP :

display_errors = On
memory_limit = 1024M
upload_max_filesize = 128M
post_max_size = 128M

[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000

[apcu]
apc.enabled=1
apc.shm_size=32M
apc.ttl=7200
apc.gc_ttl=3600

[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_port=9001
xdebug.remote_host=localhost

5. Enfin, on va créer un fichier nginx.conf qui va permettre à Nginx (serveur web) de "servir" les fichiers du projet :

server {
    listen 80;
    server_name localhost;

    root /var/www/html/public;
    index index.php index.html;

    location / {
        try_files $uri /index.php$is_args$args;
    }

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

    location ~ /\.ht {
        deny all;
    }
}

6. Pour résumer, vous devez avoir les fichiers suivants :

MonApp
   docker-compose.yaml
   Dockerfile
   nginx.conf
   php.ini

7. On va créer un nouveau projet Symfony 7 dans le dossier MonApp/. Par convention, j'utilise "app" comme nom de projet :

symfony new --webapp app

8. On se retrouve donc avec l'arborescence suivante :

MonApp
   app/
   docker-compose.yaml
   Dockerfile
   nginx.conf
   php.ini

9. On reste à la racine du projet et on va lancer docker avec :

docker-compose up -d

Pour arrêter docker :

docker-compose stop

Pour supprimer les containers :

docker-compose down
 
10. Voilà : si tout s'est bien passé, à ce niveau nous avons un projet Symfony 7 "vierge" qui tourne avec les autres services sur les url suivantes :
Symfony : http://127.0.0.1:8080
PhpMyAdmin : http://127.0.0.1:8081
Mailpit : http://127.0.0.1:8025

NOTE :
Pour des questions pratiques, j'ai volontairement "routé" le port MySQL de 3306 vers 3307 pour ce projet docker car j'ai déjà un serveur MariaDB qui tourne en local sur ma machine... sur le port 3306

NOTE 2 :
Si vous rencontrez des problèmes de droits sur var/cache et var/log, modifier les permissions comme suit :

docker-compose exec php chmod -R 777 var/cache

docker-compose exec php chmod -R 777 var/log

2 commentaires


Typo, le 13-02-2025 à 14:43:49

Hello, le Dockerfile n'est jamais utilisé, est-ce normal ? En effet, dans aucun service il y a un build du Dockerfile

citizenz7, le 14-02-2025 à 18:58:36

@Typo, Oups ! My bad, c'est corrigé. Merci.

Nb d'articles actifs : 55 | Nb de commentaires : 44 | Nb de catégories : 8 | Nb de tags : 32 | Nb total de lectures : 242 418
2025 citizenz.info • Some rights reserved GPLv3 • Version 3.3.5 • Journal du hacker

Ah, le printemps ! La nature se réveille, les oiseaux reviennent, on crame des mecs... (Arthur, Kaamelott, Livre II, La Fête du Printemps)