À partir d’une application existante :
Responsable informatique à l’IMT (Toulouse)
Membre de la PLM Team
Centres d’intérêts : programmation fonctionnelle, déploiement reproductible, architecture logicielle, self-hosting
https://github.com/JeromeDevome/GRR version cible : 4.3.X
PHP : >= 7.2.5 && <= 8.3
php : modules php-fileinfo, php-gd, php-mbstring, php-mysqli, php-mysqlnd, php-xml, php-intl, mysql : >= 5.4 && <= 5.7
https://devome.com/GRR/DOC/installation-et-mise-a-jour/installation
Permets à des utilisateurs de réserver des ressources d’un domaine dans un calendrier.
git clone --recurse-submodules \ https://plmlab.math.cnrs.fr/anf2024/grr-docker.git grr cd grr docker compose up # C-c pour arrêter
=> connexion : ADMINISTRATEUR/admin
Remarques :
app/src
.env
Observer le répertoire où est sauvegardée l’image
=> personnalisation/images/ressources/1-bb14175d9eff562ebc3fe42d20614aec/img_1.gif
docker compose ps -a NAME IMAGE COMMAND SERVICE grr-app-1 grr-app "/usr/local/bin/db_c…" app grr-db-1 mariadb:11.5.2 "docker-entrypoint.s…" db grr-init-1 mariadb:11.5.2 "docker-entrypoint.s…" init
docker volume ls | grep grr_ local grr_db_data local grr_uploads
docker network ls | grep grr_default 8a06c789788f grr_default bridge local
À la mode docker
docker exec -ti grr-app-1 /bin/bash
À la mode docker compose
docker compose exec -ti app /bin/bash
Se généralise bien à toutes les commandes que vous connaissez sur docker :
docker compose [exec/run/kill/build/images/ps/pull/push]
docker compose
agit comme un wrapper pour docker pour les conteneurs définis dans compose.yaml
Pour au final arriver à un découpage en conteneur, on s’intéresse aux différents processus nécessaires à l’application.
Pour l’utilisateur, le fonctionnement est le suivant :
navigateur -> [ http -> php -> mariadb ] navigateur -> [ http -> php -> ressources statiques ] navigateur -> [ http -> ressources statiques ]
ressources statique = du stockage
Si vous le souhaitez, en particulier pour des raison de performance, la partie http elle-même peut être scindée en plusieurs parties, pour assurer les fonctionnalités suivantes :
Par réseau ou par stockage
Ici :
http <-> app partagent des fichiers, typiquement les ressources css/js/images qui doivent être servies par la couche http mais peuvent être gérées par l’application php.
la partie base de données ne communique qu’avec la partie application
app <-> mariadb sur tcp -> mysql
Principes :
modularité/SoC Separation of Concerns : gérer séparément des choses différentes permet:
Persistence
Rappel : un conteneur docker est immutable, tout changement est écrit dans un overlay qui est perdu au redémarrage.
Les données persistentes sont gérées dans des volumes.
Grr: forte adhérence entre la partie app et la partie http, puisqu’un stockage sous forme de fichiers est commun.
2 solutions possibles sans modifier l’application :
apache + mod php
-> un seul processus en écoute, apache -> un seul volume de données non partagé
image de base : php:8.3-apache
FROM php:8.3-apache
Pour faire tourner GRR, on va utiliser 2 conteneurs
Une des forces de l’écosystème Docker
https://hub.docker.com/ : registry par défaut utiliser par pull
Pour GRR, on choisit :
Fichier unique permettant de définir tous les éléments d’une application
À voir plus tard en TP :
&ref
anchor, *ref
alias. yq: anchor and aliasx-whatever
est ignoréprincipes : issus des bonnes pratiques en développement DEVOPS
Injection automatique des variables d’environnement définies dans .env
image Mariadb 11.5 utilisée directement
À savoir :
/var/lib/mysql
MARIADB_*
compose.yaml L10-24, introduction du volume db_data
On construit nous-même une image On suit le processus d’installation de GRR, et on adapte.
Dans le Dockerfile : installation des dépendances php et binaires
ARG
est utilisé dans le Dockerfile pour positionner la version de l’image de base utilisée.
ARG : utilisé dans la phase build : Dockerfile -> image
ENV : utilisé quand un conteneur s’exécute : image -> conteneur
connect.inc.php
service init
, basé sur la même image image Mariadb 11.5
On change la commande lancée pour un script spécifique d’initialisation de la base de donnée initdb.sh
dependson : db service healthy, on utilise le healthcheck du conteneur db
docker compose run -ti --rm init /bin/bash # inside source /init/init_db.sh declare -f # list all functions sql
Pour configurer un conteneur, on combine :
MAIS !!!
docker inspect grr-docker-app-1| jq '.[0].Config.Env'
Pour déployer : voir la suite !
kompose --provider openshift --file compose.yaml convert -o k8s/
Permet d’obtenir un mapping initial entre les objets gérés par docker-compose et les objets kubernetes.
docker compose up -d # -d : detach dockur compose logs app|db -f # see the logs
Se connecter à chaque conteneur pour investiguer/mettre au point
Exemple avec le conteneur app
:
docker compose exec -ti --rm app /bin/bash
Le réseau pour commencer.
Point de départ :
docker network inspect grr_default # chercher l'id ip l # trouver le bridge avec l'id correspondant # regarder les veth associés
De manière plus globale : les fonctions inspect
de docker sont excellentes
pour comprendre la machinerie utilisée.
Utilisez maintenant docker volume inspect
pour trouver l’endroit réel où sont stockés les fichiers correspondant aux différents volumes.
Déplacer la définition du mot de passe admin de la variable d’environnement à un secret.
Le mot de passe est actuellement utilisé dans init/scripts/init_db.sh
à partir de la variable GRR_ADMIN_PASSWORD
définie dans le .env
.
init
Ajouter un service backup
dans votre application.
Ce service doit être appelé pour réaliser un backup de la base de données ET des ressources statiques.
indices :
uploads
existantne pas démarrer automatiquement : utiliser un profil spécifiques