Présentation
Les conteneurs Docker sont conçus pour fonctionner n'importe où - dans un centre de données interne, le cloud ou un environnement hybride et multi-cloud. Prêts à l'emploi, les conteneurs Docker ont tendance à surpasser les autres méthodes de virtualisation, mais ils peuvent être encore optimisés pour offrir des performances encore meilleures.
Cet article explique les raisons des performances sous-optimales de Docker dans certains scénarios et propose des solutions à appliquer à votre système pour optimiser les déploiements de Docker.
Qu'est-ce qui cause le ralentissement des performances de Docker ?
Docker est un système complexe qui dépend de plusieurs facteurs, notamment les configurations de l'hôte et la qualité du réseau. Voici quelques-unes des raisons les plus courantes pour lesquelles Docker est lent.
Ressources mal allouées
Lorsque les conteneurs Docker n'ont pas accès à suffisamment de ressources, ils rencontrent rapidement des problèmes de performances. En fonction de la taille moyenne de l'image d'un projet et du nombre de conteneurs que vous exécutez, les hôtes et le réseau doivent être en mesure de supporter la charge de travail.
Taille de l'image Docker
Docker utilise des images pour créer des conteneurs. Les images se composent du code source, des bibliothèques et des dépendances nécessaires au bon fonctionnement de l'application. Un conteneur Docker créé à partir d'une image est un environnement stable pour le développement et les tests.
Cependant, les images Docker peu maniables consomment beaucoup de ressources et monopolisent l'ensemble du système. Étant donné que la taille de l'image est un terme relatif et dépend des besoins d'une application particulière, cette déclaration fait principalement référence à à quel point l'image est optimisée ou gonflée de fichiers inutiles .
Taille du contexte du fichier Docker
La docker build
La commande utilise deux sources pour créer une image - un Dockerfile et un contexte. Un contexte est l'ensemble de fichiers dans un emplacement spécifié auquel le processus de génération peut se référer. Si la taille du contexte est trop grande, les performances de construction peuvent être affectées.
Configuration Docker par défaut toujours utilisée
Même si la configuration par défaut de Docker fournit des paramètres raisonnables pour que Docker fonctionne immédiatement, chaque système est spécifique. Options de démarrage du démon mal configurées, mise en réseau , et d'autres paramètres peuvent dégrader les performances de Docker.
Latence du réseau
À moins que vous ne créiez votre registre, Docker utilisera Dockerhub pour récupérer directement les images. Le déplacement d'une grande quantité de données sur Internet fait que la latence du réseau devient un facteur dans les performances générales de Docker.
Comment optimiser les performances de Docker
Il existe plusieurs façons d'accélérer les performances de votre Docker, allant des améliorations matérielles aux ajustements à l'intérieur même de Docker.
Allouer correctement les ressources
Les performances de la machine hôte influencent les performances des conteneurs. Un CPU lent ou une RAM insuffisante peuvent devenir un goulot d'étranglement, ralentissant les performances de Docker.
Lorsque les performances de Docker ralentissent, vérifiez votre CPU, l'utilisation de la mémoire et l'espace disque disponible. Envisagez de mettre à niveau votre système si un composant ne fonctionne pas comme prévu.
Lorsqu'il s'agit d'un conteneur spécifique qui fonctionne moins bien que prévu, il peut être utile de vérifier les métriques spécifiques au conteneur.
Les docker stats
La commande affiche les données métriques importantes sur les conteneurs en cours d'exécution. Utilisez-le pour diagnostiquer les problèmes potentiels.
docker stats
La sortie de la commande affiche :
- Utilisation du processeur.
- Utilisation de la mémoire et limite par conteneur
- Pourcentage de consommation de mémoire.
- NET I/O :trafic réseau Docker
- BLOCK I/O – Données écrites sur les périphériques de bloc hôte.
- PIDS :nombre de threads créés par un conteneur.
Optimiser les images Docker
Tout d'abord, vérifiez la taille de l'image construite en utilisant la commande suivante :
docker images
La sortie répertorie le référentiel, la balise, l'ID, le temps écoulé depuis la création et la taille de l'image :
Vérifiez le Dockerfile de l'image et assurez-vous que le contexte du fichier n'est pas trop volumineux. Le contexte répertorie les fichiers dont Docker a besoin pour créer un conteneur.
La taille du contexte est affichée dans la sortie de la docker build
commande :
docker build -t [image-name] .
Dans l'exemple suivant, la taille du contexte est de 4,641 Mo :
Si le contexte de construction de l'image est trop grand, créez un .dockerignore dans le répertoire racine du contexte et ajoutez-y les fichiers inutiles. Docker ignorera les fichiers qui y sont répertoriés lors de la création de l'image.
Voici un exemple de .dockerignore fichier :
temp*
*/temp*
La première ligne indique à Docker d'exclure du contexte tous les fichiers et répertoires dont les noms commencent par temp
dans le répertoire racine. Le second fait de même pour n'importe quel sous-répertoire de la racine.
Vérifiez les dépendances
Lors de l'installation de dépendances, les images Docker basées sur Debian peuvent générer des binaires et des fichiers supplémentaires. Certaines de ces interdépendances ne sont pas nécessaires au fonctionnement normal du conteneur et peuvent être supprimées.
Pour supprimer manuellement les interdépendances inutiles, utilisez les commandes répertoriées ci-dessous.
Supprimer les packages dans /var/cache
:
apt clean
Supprimer les packages obsolètes :
apt autoclean
Supprimez les interdépendances utilisées par les packages supprimés :
apt autoremove
Envisagez de passer à l'architecture de microservices
Les applications monolithiques ont tendance à être plus lentes que les applications construites à l'aide d'une architecture de microservices. Si vos conteneurs Docker ont du mal à fonctionner, cela peut être dû à la taille de l'application à l'intérieur du conteneur. La migration de l'application vers des microservices permet de répartir la charge de travail entre plusieurs conteneurs.
Utilisez des ressources dédiées
Dans les environnements cloud, les VM partagent souvent des ressources matérielles avec d'autres VM sur le même serveur. Cependant, l'hébergement de conteneurs sur le matériel dédié de Bare Metal Cloud élimine les frais généraux de virtualisation et améliore les performances des conteneurs. Les applications conteneurisées ne partagent pas les ressources système telles que la RAM et le processeur, ce qui ne réduit pas la latence et permet aux applications d'utiliser pleinement le matériel.
Utiliser un système d'exploitation léger
Les systèmes d'exploitation complets tels que Windows, macOS ou les distributions Linux commerciales consomment une grande partie des ressources système, ce qui en laisse moins que nécessaire pour des performances Docker optimales. Les distributions légères telles que RancherOS, CoreOS Container Linux, Alpine Linux et VMware Photon OS ont été optimisées pour fonctionner avec les conteneurs Docker. La création d'images sur un système léger peut économiser jusqu'à 100 Mo de la taille finale de l'image, ce qui améliore considérablement la vitesse.
Mettre en cache les couches Dockerfile
Utilisez la mise en cache des calques pour améliorer la vitesse de création d'images. Lorsque Docker commence à créer une image, il recherche dans le cache des couches contenant des signatures similaires et les utilise dans le processus. Cette fonctionnalité accélère le processus de construction.
Si vous souhaitez spécifier l'image préexistante comme source de cache, utilisez le --cache-from
choix :
docker build --cache-from [image-to-cache-from] -t [next-build] -f [path-to-dockerfile]