docker-compose avancé

Architecture du projet

├── Readme.md
├── docker
│   ├── db
│   │   └── mariadb
│   │       └── my.cnf
│   └── server
│       ├── Dockerfile
│       ├── apache
│       │   └── sites-enabled
│       │       └── site.conf
│       └── php
│           └── php.ini
├── docker-compose.yml
└── symfony

Fichier .env

APP_NAME=symfony_projet
APP_PORT=8100
APP_DB_ADMIN_PORT=8200
DB_PORT=33016

MYSQL_ROOT_PASS=supersecret
MYSQL_USER=app_user
MYSQL_PASS=secretpasswd
MYSQL_DB=symfony_projet

Fichier my.cnf

[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4

Fichier site.conf

<VirtualHost *:80>
   DocumentRoot /var/www/html/public
   <Directory /var/www/html/public>
         AllowOverride None
         Order Allow,Deny
         Allow from All

         <IfModule mod_rewrite.c>
            Options -MultiViews
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ index.php [QSA,L]
         </IfModule>
   </Directory>
</VirtualHost>

fichier Dockerfile dans docker/server

FROM php:8.1-apache

RUN a2enmod rewrite

RUN apt-get update && apt-get install -y git unzip zip

WORKDIR /var/www/html/

COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/

RUN install-php-extensions gd pdo_mysql bcmath zip intl opcache

COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer

# met à jour les informations pour git
RUN git config --global user.email "user@truc.com" && git config --global user.name "user"

RUN curl -sS https://get.symfony.com/cli/installer | bash \
&& mv /root/.symfony5/bin/symfony /usr/local/bin/symfony
## && symfony new symfony_project --version=stable --dir=/var/www/symfony

Fichier docker-compose.yml

networks:
symfony_projet_net:

services:
   server:
      build:
         context: .
         dockerfile: ./docker/server/Dockerfile
      container_name: '${APP_NAME}-server'
      ports:
         - '${APP_PORT}:80'
      working_dir: /var/www/html
      environment:
         - 'DATABASE_URL=mysql://${MYSQL_USER}:${MYSQL_PASS}@db_server:3306/${MYSQL_DB}?serverVersion=10.9'
      volumes:
         - ./symfony:/var/www/html
         - ./docker/server/apache/sites-enabled:/etc/apache2/sites-enabled
         - ./docker/server/php/php.ini:/usr/local/etc/php/conf.d/extra-php-config.ini
      depends_on:
         db_server:
         condition: service_healthy
      networks:
         - symfony_projet_net

   db_server:
      image: mariadb:10.9.3
      container_name: '${APP_NAME}-db'
      restart: always
      ports:
         - '${DB_PORT}:3306'
      environment:
         MYSQL_ROOT_PASSWORD: '${MYSQL_ROOT_PASS}'
         MYSQL_USER: '${MYSQL_USER}'
         MYSQL_PASSWORD: '${MYSQL_PASS}'
         MYSQL_DATABASE: '${MYSQL_DB}'
      volumes:
         - db_data:/var/lib/mysql
         - ./docker/db/mariadb/my.cnf:/etc/mysql/conf.d/my.cnf
      healthcheck:
         test: mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD
         interval: 5s
         retries: 5
      networks:
         - symfony_projet_net

   db_admin:
      image: phpmyadmin/phpmyadmin:5
      container_name: '${APP_NAME}-db-admin'
      ports:
         - '${APP_DB_ADMIN_PORT}:80'
      environment:
         PMA_HOST: db_server
      depends_on:
         db_server:
         condition: service_healthy
      volumes:
         - db_admin_data:/var/www/html
      networks:
         - symfony_projet_net

volumes:
   db_data:
   db_admin_data:

Observations/Questions

1. Observez l’usage des variables d’environnement dans .env. Ces variables peuvent ensuite être réutilisées dans les fichiers Docker comme dans docker-compose.yml : DATABASE_URL=mysql://${MYSQL_USER}:${MYSQL_PASS}@db_server:3306/${MYSQL_DB}?serverVersion=10.5`

  1. Observez les services. Combien y en a-t-il ?

  2. Observez le Dockerfile. Quelle est son utilité ? Ses différentes étapes ? Expliquez le fonctionnement des commandes COPY utilisées.

  3. Quels sont les volumes montés et leurs rôles ?

  4. Tester le service phpmyadmin.

  • Sur quel port tourne-t-il ?

  • Pourrait-on mettre ce numéro de port en paramètre ?

  • Quels sont les identifiants pour se connecter ?

  1. Pour le service correspondant à Apache/Symfony :

  • ouvrez un terminal sur le conteneur concerné : docker exec -it symfony_projet-server bash

  • placez-vous dans /var/www/html

  • Lancez la commande : composer create-project symfony/website-skeleton .

  • Qu’observez-vous dans votre dossier de travail ?

  • Testez si Symfony est bien accessible