Configuration Initiale de DockerCoins avec Docker Compose

🚀 Démarrer l'application

1

Exécutez la commande suivante pour démarrer tous les services définis dans docker-compose.yml :

docker-compose up

Remarque : Cette commande télécharge les images nécessaires, les construit si besoin, et lance les conteneurs.

2

Une fois les services démarrés, vous verrez les logs des différents conteneurs s’afficher, comme :

rng-1     | 172.18.0.2 - - [08/Dec/2024 16:43:12] "GET /32 HTTP/1.1" 200 -
hasher-1  | 172.18.0.2 - - [08/Dec/2024:16:43:12 +0000] "POST / HTTP/1.1" 200 64 0.1027
worker-1  | INFO:__main__:1 units of work done, updating hash counter
3

Une fois les services en cours d'exécution, ouvrez un navigateur et accédez à :

http://localhost:8000

Cela affichera l'interface Web de DockerCoins où vous pourrez visualiser le taux de création des DockerCoins.


🖥️ Démarrer en arrière-plan

1

Pour exécuter l'application en arrière-plan, arrêtez d’abord la version actuelle avec Ctrl+C.

2

Relancez-la en mode détaché (background) :

docker-compose up -d

🔍 Afficher le détail d'une application

1

Utilisez la commande suivante pour lister les conteneurs en cours d'exécution et leurs détails :

docker-compose ps

⚙️ Passer une application à l’échelle

1

Pour augmenter le nombre de conteneurs exécutant un service (par exemple, worker), utilisez la commande :

docker-compose scale worker=2
2

Cela permettra de lancer un deuxième conteneur pour le service worker. Vérifiez les nouveaux conteneurs avec :

docker-compose ps

Sortie :

NAME                   IMAGE                COMMAND                  SERVICE   CREATED              STATUS              PORTS
dockercoins-hasher-1   dockercoins-hasher   "ruby hasher.rb"         hasher    26 minutes ago       Up 26 minutes       0.0.0.0:8002->80/tcp
dockercoins-redis-1    redis                "docker-entrypoint.s…"   redis     26 minutes ago       Up 26 minutes       6379/tcp
dockercoins-rng-1      dockercoins-rng      "python rng.py"          rng       26 minutes ago       Up 26 minutes       0.0.0.0:8001->80/tcp
dockercoins-webui-1    dockercoins-webui    "node webui.js"          webui     26 minutes ago       Up 26 minutes       0.0.0.0:8000->80/tcp
dockercoins-worker-1   dockercoins-worker   "python worker.py"       worker    26 minutes ago       Up 26 minutes
dockercoins-worker-2   dockercoins-worker   "python worker.py"       worker    About a minute ago   Up About a minute
3

Retournez à l'interface Web et notez le nouveau taux de création des DockerCoins.


🔍 Analyse des Performances et Détection du Goulot d’Étranglement

📊 Suivi de l’utilisation des ressources

Pour observer l’utilisation des ressources système pendant l’exécution des services DockerCoins, vous pouvez utiliser le Gestionnaire des tâches sous Windows ou PowerShell.

1

Ouvrez une nouvelle fenêtre PowerShell.

2

Exécutez la commande suivante pour lister les processus Docker et leurs consommations CPU et mémoire

Get-Process | Where-Object { $_.Name -like "com.docker*" } | Format-Table -Property Name, CPU, WS
  • Name : Le nom du processus Docker.

  • CPU : L’utilisation actuelle du CPU (en secondes de processeur).

  • WS : La mémoire consommée (Working Set) en octets.

Exemple de sortie

Name                     CPU        WS
----                     ---        --
com.docker.backend  46.03125 140042240
com.docker.backend     1.375  48955392
com.docker.build    1.078125  35799040
com.docker.dev-envs 0.078125  11960320

🔎 Analyse

  • com.docker.backend : Processus principal qui gère Docker Desktop.

    • CPU élevé : Indique une activité importante, comme le lancement ou l’exécution de plusieurs conteneurs.

    • Mémoire (WS) : Montre la consommation de mémoire réelle. Une augmentation significative peut indiquer un problème de gestion de ressources.

  • com.docker.build : Lié à la construction d'images Docker. Une activité ici peut indiquer des opérations docker build.


🚦 Détection du goulot d'étranglement

1

Identifier les ports des services

Avant de tester les services, identifiez leurs ports dans le fichier docker-compose.yml ou à l’aide de la commande suivante :

docker-compose ps

Exemple de sortie :

NAME                   IMAGE                COMMAND                  SERVICE   CREATED          STATUS          PORTS
dockercoins-hasher-1   dockercoins-hasher   "ruby hasher.rb"         hasher    52 minutes ago   Up 52 minutes   0.0.0.0:8002->80/tcp
dockercoins-redis-1    redis                "docker-entrypoint.s…"   redis     52 minutes ago   Up 52 minutes   6379/tcp
dockercoins-rng-1      dockercoins-rng      "python rng.py"          rng       52 minutes ago   Up 52 minutes   0.0.0.0:8001->80/tcp
dockercoins-webui-1    dockercoins-webui    "node webui.js"          webui     52 minutes ago   Up 52 minutes   0.0.0.0:8000->80/tcp
  • Le service RNG est mappé sur 8001.

  • Le service Hasher est mappé sur 8002.

2

Mesurer les temps de réponse avec curl

Utilisez la commande intégrée Measure-Command dans PowerShell pour tester la latence des services. Voici comment procéder :

Service RNG

1

Ouvrez PowerShell ou CMD.

2

Testez le service RNG :

Measure-Command { curl http://localhost:8001 }
3

Exemple de sortie :

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 96
Ticks             : 969118
TotalDays         : 1.12166435185185E-06
TotalHours        : 2.69199444444444E-05
TotalMinutes      : 0.00161519666666667
TotalSeconds      : 0.0969118
TotalMilliseconds : 96.9118

Service Hasher

1

Testez le service Hasher :

Measure-Command { curl http://localhost:8002 }
2

Exemple de sortie :

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 19
Ticks             : 190129
TotalDays         : 2.20056712962963E-07
TotalHours        : 5.28136111111111E-06
TotalMinutes      : 0.000316881666666667
TotalSeconds      : 0.0190129
TotalMilliseconds : 19.0129
3

Analyser les résultats


🛑 Arrêter et Nettoyer l’Application

1

Arrêter et Supprimer tous les Conteneurs

Exécutez la commande suivante pour arrêter tous les conteneurs en cours d'exécution et les supprimer :

docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
  • docker ps -a -q : Récupère les IDs de tous les conteneurs (en cours d'exécution ou arrêtés).

  • docker stop : Arrête les conteneurs spécifiés.

  • docker rm : Supprime les conteneurs spécifiés.

2

Supprimer tous les Volumes

Pour supprimer tous les volumes Docker inutilisés :

docker volume prune -f
  • prune -f : Force la suppression des volumes sans demander confirmation.

3

Supprimer toutes les Images

Pour supprimer toutes les images Docker inutilisées :

docker image prune -a -f
  • -a : Supprime toutes les images inutilisées, y compris celles qui ne sont pas associées à un conteneur.

  • -f : Force la suppression sans confirmation.

4

Supprimer tous les Réseaux Non Utilisés

Pour nettoyer les réseaux non utilisés :

docker network prune -f
  • Supprime tous les réseaux Docker qui ne sont pas actuellement utilisés par au moins un conteneur.

5

Supprimer les Builds Docker Inutilisés

Pour supprimer tous les builds Docker mis en cache :

docker builder prune -f
  • builder prune : Supprime les données de cache associées aux builds Docker.

  • -f : Force la suppression sans confirmation.

🔄 Vérifier le nettoyage

Après avoir effectué ces étapes, vérifiez que l’hôte est propre :

1

Listez les conteneurs restants

docker ps -a

Résultat attendu : Aucun conteneur ne doit apparaître.

2

Listez les volumes restants

docker volume ls

Résultat attendu : Aucun volume inutilisé ne doit apparaître.

3

Listez les images restantes

docker images

Résultat attendu : Aucune image inutile ne doit être affichée.

4

Listez les builds restants

docker builder ls

Résultat attendu : Aucun build inutile ne doit être affichée.


🔧 Astuces pour Dépannage

🚧 Erreurs lors de la création des services (exemple : docker-compose up échoue)

  • Problème : Les ports réseau nécessaires (8000, 8001, 8002, etc.) sont déjà utilisés.

    • Solution : Vérifiez les ports en cours d'utilisation avec la commande :

      netstat -ano | findstr :8000

      Arrêtez le processus responsable avec :

      taskkill /PID <PID> /F

      Ou modifiez les ports dans le fichier docker-compose.yml.

  • Problème : Une image Docker manque ou est corrompue.

    • Solution : Re-téléchargez l'image :

      docker-compose pull

🔄 Services qui ne démarrent pas correctement

  • Problème : Le service reste en état Restarting.

    • Solution : Consultez les logs du service pour identifier le problème :

      docker-compose logs <service_name>

      Vérifiez les dépendances du service (par exemple, Redis doit être actif pour WebUI).

🐢 Problèmes de latence ou lenteur

Problème : Le service RNG est le goulot d’étranglement.

  • Solution :

    • Ajoutez des ressources à RNG (CPU, RAM) dans votre VM.

    • Optimisez le code du service RNG.

    • Distribuez RNG sur plusieurs conteneurs.

📉 Commande docker-compose scale échoue

Problème : Ressources insuffisantes sur l’hôte Docker.

  • Solution :

    • Vérifiez la charge de votre système avec :

      docker stats
    • Augmentez les ressources allouées à Docker Desktop (paramètres > ressources).

🗑️ Conteneurs ou volumes ne se suppriment pas

Problème : Erreur liée aux volumes ou conteneurs occupés.

  • Solution : Forcez la suppression avec :

    docker rm -f $(docker ps -a -q)
    docker volume prune -f

⚙️ Erreurs avec Measure-Command ou curl

Problème : curl n'est pas installé sur votre système.

  • Solution : Installez curl via le gestionnaire de paquets Windows :

    winget install curl

📝 Résumé des Commandes

Commande

Description

docker-compose up

Démarre tous les services définis dans docker-compose.yml.

docker-compose up -d

Démarre les services en mode détaché (background).

docker-compose scale worker=2

Augmente le nombre de conteneurs du service worker à 2.

docker ps

Liste les conteneurs actifs sur l’hôte Docker.

docker-compose ps

Affiche les services actifs pour le projet Docker Compose actuel.

docker-compose logs <service>

Affiche les logs d’un service spécifique.

docker stats

Affiche les métriques d’utilisation des conteneurs actifs (CPU, mémoire, etc.).

Measure-Command { curl <URL> }

Mesure la latence d’un service (en ms) sur un port donné.

docker stop $(docker ps -a -q)

Arrête tous les conteneurs actifs.

docker rm $(docker ps -a -q)

Supprime tous les conteneurs arrêtés.

docker volume prune -f

Supprime tous les volumes inutilisés.

docker image prune -a -f

Supprime toutes les images inutilisées.

docker network prune -f

Supprime tous les réseaux inutilisés.

docker builder prune -f

Supprime les builds mis en cache.


🎯 Conclusion

L'application DockerCoins permet de visualiser et d'expérimenter avec des concepts clés de Docker, comme les conteneurs, les réseaux, et l'orchestration de services. L'analyse du fichier docker-compose.yml a révélé une architecture bien structurée avec cinq services distincts, chacun jouant un rôle précis dans le processus de génération de DockerCoins. Parmi eux, seul le service redis utilise une image officielle, tandis que les autres sont construits localement.

Le déploiement et l'exécution de l'application montrent comment les services interagissent pour générer des DockerCoins. Bien que l'augmentation du nombre de conteneurs du service worker améliore le taux de génération, elle met également en évidence les limites du système, attribuées à des goulots d'étranglement comme le service rng. Ces observations soulignent l'importance de comprendre et de résoudre les problèmes de performance dans des systèmes distribués.

Les outils disponibles sur Windows, tels que curl et PowerShell, permettent de mesurer la latence des services. Ces tests ont confirmé que rng, avec une latence de 204 ms, est le principal goulot d'étranglement, comparé à seulement 40 ms pour hasher.

Le nettoyage des ressources avec des commandes Docker a été effectué pour arrêter et supprimer les conteneurs, volumes, images, et réseaux inutilisés, montrant l'importance d'une gestion proactive des ressources dans un environnement Docker.

Ce projet a fourni une exploration approfondie de l'écosystème Docker et a mis en lumière les étapes nécessaires pour analyser, déployer, optimiser et nettoyer une application conteneurisée. Il constitue une base solide pour des explorations futures, notamment dans l'orchestration à grande échelle avec Docker Swarm.

Last updated