Démarrer un nouveau projet symfony 6 comme un sénior sous docker


Aug 6, 2023 Symfony


En tant que développeur sénior, la création d'un nouveau projet sous symfony se fait via docker, cet article décrit les différentes étapes de création du projet symfony.


Symfony, depuis sa version 6 nécessite la version 8 de php minimum. Nous allons donc avant de créer notre projet symfony , créer un container docker sous php 8. Nous utiliserons ensuite apache 2 comme serveur web.  

  1. Création d’un container avec PHP 8

Créer le fichier docker-compose.yaml à la racine du répertoire de votre projet

Nous allons utiliser l’image de php basé sur la version alpine linux qui est une distribution linux ultra légère et orientée sécurité.

Et nous allons mapper le répertoire local de notre projet au répertoire /app de notre container php.

Voici le contenu minimale de notre fichier docker-compose.yaml à ce stade :

services:
 php:
   image: php:8.2-fpm-alpine3.18
   container_name:
my_php
   volumes:
      - .:/app
   working_dir:
/app

Nous  allons rentrer dans notre container en ssh (l’instruction working_dir: /app permet d’arriver directement dans le dossier /app de notre container)

docker exec -it my_php sh

On vérifie qu’on a la bonne version de php via la commande : php -v

PHP 8.2.8 (cli) (built: Jul 10 2023 22:24:17) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.8, Copyright (c) Zend Technologies

  1. Création du projet symfony 6

Documentation : https://symfony.com/download

Nous allons d’abord installer la cli (command line interface) de symfony.

Pour cela nous allons installer l’outil bash (la distribution alpine n’est pas fourni avec bash par défaut) puis la cli symfony et ensuite git.

Nous allons donc lancer les commandes ci-dessous :

apk update && apk add bash
wget https://get.symfony.com/cli/installer -O - | bash

export PATH="$HOME/.symfony5/bin:$PATH"

apk add git

Configurer git avec votre username et email.

git config --global user.name my_username

git config --global user.email my_email@test.com

Nous allons ensuite installer composer en exécutant les commandes ci-dessous :

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

Nous pouvons maintenant créer notre projet symfony :

symfony new my_project_docker  --version="6.3.*" --webapp

Nous allons maintenant déplacer tous les fichiers du répertoire /app/my_project_docker de notre container vers le répertoire /app et supprimer le répertoire my_project_docker.

rm my_project_docker/docker-compose*.yml

mv my_project_docker/* .

mv my_project_docker/.env .

mv my_project_docker/.gitignore .
rm -rf my_project_docker

Nous avons maintenant un projet sous symfony 6 et php 8

Nous allons maintenant installer un serveur web apache pour tester notre application.

 

  1. Création du serveur web

Nous allons modifier notre fichier docker-compose.yaml pour y ajouter le serveur web apache.

services:

  php:

    image: php:8.2-fpm-alpine3.18

    container_name: my_php

    volumes:

      - .:/app

    working_dir: /app

    ports:

      - 9000:9000

  apache:

    build:

      context: ./docker

    container_name: my_apache

    volumes:

      - .:/app

    working_dir: /app

    ports:

      - 8080:80

    depends_on:

      - php

    environment:

      WEB_APP_HOST: localhost:8080

      PHP_HOST: my_php:9000

Créer le répertoire docker à la racine de votre projet et créer un fichier Dockerfile, un fichier httpd-vhosts.conf et un fichier httpd.conf

Mettez le contenu ci-dessous dans le fichier Dockerfile afin de surcharger les fichiers de configuration d’apache

FROM httpd:alpine3.18

COPY httpd.conf /usr/local/apache2/conf/httpd.conf
COPY httpd-vhosts.conf /usr/local/apache2/conf/extra/httpd-vhosts.conf

Mettez le contenu ci-dessous dans le fichier httpd-vhosts.conf pour configurer notre vhost

<VirtualHost *:80>
ServerName ${WEB_APP_HOST}
ServerAdmin webmaster@localhost

DocumentRoot "/app/public"

<Directory "/app/public">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted

DirectoryIndex index.php

<FilesMatch \.php$>
SetHandler "proxy:fcgi://${PHP_HOST}"
</FilesMatch>
</Directory>
</VirtualHost>

Nous allons copier le fichier de configuration d’apache httpd.conf dans notre dossier local docker pour le surcharger :

docker exec -it my_apache sh
cat /usr/local/apache2/conf/httpd.conf >> docker/httpd-vhosts.conf

Ouvrez le fichier docker/httpd.conf et décommenter les lignes listées ci-dessous

Ligne 524

Include conf/extra/httpd-vhosts.conf

Ligne 142

LoadModule proxy_module modules/mod_proxy.so

Ligne 146

LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

Ligne 199

LoadModule rewrite_module modules/mod_rewrite.so

Remplacer les lignes 265 et 266 :

DocumentRoot "/usr/local/apache2/htdocs"

<Directory "/usr/local/apache2/htdocs">

par :

DocumentRoot "/app/public"

<Directory "/app/public">

Recréer les container :

docker-compose up -d --build --force-recreate

  1. Lancement du projet

Nous allons maintenant installer composer dans notre container php

Créer un fichier docker/phpDockerfile avec le contenu ci-dessous qui permet de partir de la même image et d’installer composer et la cli symfony en plus

FROM php:8.2-fpm-alpine3.18

# install composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
php -r
"if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" && \
php composer-setup.php && \
php -r
"unlink('composer-setup.php');"

RUN mv composer.phar /usr/local/bin/composer


RUN apk update && apk add bash && apk add git
RUN mkdir /app
WORKDIR /app
RUN wget https://get.symfony.com/cli/installer -O - | bash
RUN mv $HOME/.symfony5/bin/symfony /usr/local/bin/symfony

RUN git config --global user.name my_username && git config --global user.email my_username@test.com

Note : remplacer my_username par vos identifiants

Puis modifier le contenu du fichier docker-compose.yaml avec le contenu ci-dessous afin que l’image de notre container php soit créer à partir du Dockerfile que l’on vient de créer :

services:
 php:
   build:
     context: ./docker
     dockerfile: phpDockerfile
   container_name: my_php
   volumes:
     - .:/app
   working_dir: /app
   ports:
     -
9000:9000
 apache:
   build:
     context: ./docker
   container_name: my_apache
   volumes:
     - .:/app
   working_dir: /app
   ports:
     -
8080:80
   depends_on:
     - php
   environment:
     WEB_APP_HOST: localhost:
8080
     PHP_HOST: my_php:
9000

Lancer la commande

composer install

Aller sur l’url http://localhost:8080, on arrive bien sur la page d’accueil par défaut de symfony

  1. Création de la base de données mariadb sous docker

Nous allons maintenant créer une base de données mariadb pour notre application.

Ajouter dans le fichier docker-compose.yaml le container mariadb et le container adminer qui est un outil web (équivalent à phpmyadmin) qui permet de naviguer dans les données de notre base de données

services:
 php:
   build:
     context: ./docker
     dockerfile: phpDockerfile
   container_name: my_php
   volumes:
     - .:/app
   working_dir: /app
   ports:
     -
9000:9000
 apache:
   build:
     context: ./docker
   container_name: my_apache
   volumes:
     - .:/app
   working_dir: /app
   ports:
     -
8080:80
   depends_on:
     - php
   environment:
     WEB_APP_HOST: localhost:
8080
     PHP_HOST: my_php:
9000
 db:
   image: mariadb
   container_name: my_mariadb
   environment:
     MARIADB_ROOT_PASSWORD: root
   volumes:
     - ./mysqldata:/var/lib/mysql
 adminer:
   image: adminer
   container_name: my_adminer
   ports:
     -
8090:8080


symfony
long