Utilisateur:Bahts/Brouillon

Définition et Fonctionnement de Docker modifier

Définition modifier

Docker est une plate-forme permettant de développer, d'expédier et d'exécuter diverses applications plus rapidement. Docker permet aux applications de s'exécuter séparément de l'infrastructure hôte et de traiter l'infrastructure comme une application gérée. Docker aide également à expédier le code plus rapidement, à tester plus rapidement, à déployer plus rapidement et à raccourcir le cycle entre l'écriture de code et l'exécution de code, Docker le fait en combinant une plate-forme de virtualisation de conteneurs légère avec des workflows et des outils qui aident à gérer et déployer des applications[1].

Fonctionnement modifier

 

Docker utilise une architecture client-serveur, les conteneurs clients communiquent avec le démon Docker qui se trouve dans la machine hôte. Le démon Docker s'occupe de la construction, de l'exécution et de la distribution des conteneurs Docker. Le démon Docker et le conteneur Docker peuvent être placés sur une seule machine ou peuvent également être placés sur une machine distante. Le démon Docker et les conteneurs communiquent via un pont, docker0. La figure suivante montre l'architecture Docker. Docker contient trois composants : images Docker, registres Docker, conteneurs Docker[2].

Images Docker modifier

Les images Docker représentent un modèle en lecture seule utilisé pour créer des conteneurs Docker. Par exemple, une image peut contenir un système d'exploitation Ubuntu 12.10 avec Apache et d'autres applications Web installées. Docker permet également de créer de nouvelles images et on peut également utiliser des images déjà créées[3].

Registres Docker modifier

Un registre Docker contient des images Docker. Il s'agit d'un magasin public ou privé pour le téléchargement et le téléchargement d'images Docker[4].

Conteneurs Docker modifier

Le conteneur Docker est similaire à un répertoire. Il contient tout le nécessaire pour qu'une application s'exécute. Les conteneurs sont créés à partir d'images Docker. Un conteneur peut être exécuté, démarré, arrêté, déplacé et supprimé[5].

Gestion des ressources dans Docker modifier

Docker utilise les fonctionnalités d'isolation des ressources du noyau Linux telles que les groupes de contrôle (le groupe de contrôle est une fonctionnalité du noyau Linux qui limite, prend en compte et isole l'utilisation des ressources) et les espaces de noms du noyau (variable ou identifiant) pour permettre à des « conteneurs » indépendants de s'exécuter dans un seul Instance Linux, évitant la surcharge de démarrage des machines virtuelles. L'isolation et la sécurité fournies par Docker permettent d'exécuter plusieurs conteneurs simultanément sur un seul hôte. Plusieurs conteneurs peuvent partager le même noyau, mais chaque conteneur peut être contraint de n'utiliser qu'une quantité définie de ressources disponibles sur la machine hôte[6].

Mémoire modifier

Par défaut, un conteneur n'a pas de contraintes de ressources et peut utiliser autant de ressource donnée que le permet le programmateur du noyau de l'hôte. Docker fournit néanmoins des moyens pour contrôler la quantité de mémoire ou de processeur qu'un conteneur peut utiliser[7].

CPU modifier

Par défaut, l'accès de chaque conteneur aux cycles CPU de la machine hôte est illimité. Il est possible de définir diverses contraintes pour limiter l'accès d'un conteneur donné à l'hôte cycles CPU de la machine. La plupart des utilisateurs utilisent et configurent le planificateur CFS par défaut . Il est également possible configurer le programmateur en temps réel[8].

Réseau modifier

Les réseaux de Docker sont actuellement configurés pour fournir le « meilleur effort » à tout le trafic; et les paramètres tels que la bande passante, la fiabilité et les paquets par seconde pour une application spécifique ne peuvent pas être garantis. Chaque conteneur reçoit donc une part égale de la bande passante[9].

Limites modifier

Conception modifier

Initialement limité à Linux, Docker a depuis été porté sur Windows dans le cadre de Windows Server 2016. Cette annonce fait suite à un partenariat signé par Docker avec Microsoft. Il n'en reste pas moins que les conteneurs créés sur Linux, ne pourront être portables sur Windows, et réciproquement. Il s'agit là de la limite majeure de Docker[10].

De plus, Docker ayant été conçu à l’origine pour faciliter le déploiement d’applications sans état, Docker est de plus en plus utilisé pour des applications ayant besoin de stocker des données de façon persistante. Ce qui amène les conteneurs à abriter des application avec état, nécessitant une persistance de données donc une dépendance à une autre infrastructure[11].

En outre, Le fait que les réseaux de Docker soient actuellement configurés pour fournir le « meilleur effort » à tout le trafic, implique qu'une application gourmande en bande passante entraîne des performances médiocres ou inacceptables pour toute autre application partageant le réseau Docker. Ceci est d'autant plus inquiétant car actuellement, aucune option n'est disponible pour configurer les partages réseau, la bande passante et la priorité, comme dans le cas d'autres ressources telles que le processeur et la mémoire[12].

Enfin, le plus grand défi dans le cas du stockage d'informations sensibles dans un conteneur Docker en tant que sauvegarde est de se conformer à la conformité PCI. Les informations sensibles (telles que les informations bancaires) pouvant être stockées en interne, certaines mesures doivent être prises en compte. Docker ne fournit pas encore de solutions à ces défis dans Community Edition[13].

Performances modifier

Concernant l'évaluation des performances des conteneurs en termes d'interférence inter-conteneur (causée par deux conteneurs s'exécutant simultanément) et intra-conteneur (causée entre deux microservices s'exécutant à l'intérieur d'un conteneur):

- Au niveau CPU, les interférences inter-conteneurs sont moindres que les interférences intra-conteneurs en considérant un type de microservices similaire parce que dans le cas d'une architecture intra-conteneur, en considerant un type de microservices similaire, il y a manque d'épinglage des ressources qui fait que les microservices se disputent le même cœur même si davantage de cœurs sont disponibles[14].

- Au niveau des I/O et réseaux, les performances des microservices colocalisés à l'intérieur d'un seul conteneur sont comparables aux performances des microservices s'exécutant dans plusieurs conteneurs. Aussi, la contrainte de ressources des groupes de contrôle n'a pas d'impact significatif sur les microservices intensifs en réseau[15].

En général, les interférences intra-conteneurs sont plus élévés que les les interférences intra-conteneurs[16].

Solutions modifier

Amélioration de la qualité du réseau modifier

 
 

La solution consiste en un classificateur de paquets et un ordonnanceur de priorités. Les paquets dans les flux sont classés et ajoutés à l'une des trois files d'attente prioritaires disponibles. Le planificateur retire les paquets de la file d'attente et envoie chaque paquet à un conteneur en fonction de la priorité de la file d'attente. La solution fournit elle-même la fonctionnalité permettant d'attribuer des priorités aux conteneurs. Les valeurs de priorité sont élevées, moyenne et faible, où moyenne est la valeur par défaut attribuée à un conteneur. Le classificateur de paquets et le planificateur sont construits au-dessus du pont docker0, qui donne la priorité à l'accès réseau des conteneurs. Une part plus élevée de la bande passante totale du réseau disponible est fournie aux conteneurs avec une priorité plus élevée[17].


Gestion des ressources modifier

Mémoire modifier

Docker peut imposer des limites de mémoire dure, ce qui permet au conteneur de ne plus en utiliser qu'une quantité donnée de mémoire utilisateur ou système, ou des limites logicielles, qui permettent au conteneur d'utiliser autant de mémoire qu'il en a besoin, sauf si certaines conditions sont remplies, comme lorsque le noyau détecte une mémoire insuffisante ou une contention sur la machine hôte. Certaines de ces options ont des effets différents lorsqu'elles sont utilisées seules ou lorsque plus de une option est définie[18].

CPU modifier

Le CFS est le planificateur de CPU du noyau Linux pour les processus Linux normaux. Nombreuses les indicateurs d'exécution permettent de configurer la quantité d'accès aux ressources CPU de votre conteneur. Lorsque vous utilisez ces paramètres, Docker modifie les paramètres du groupe de contrôle du conteneur sur la machine hôte[19].

Kubernetes modifier

Le container devenant une "commodité", l'enjeu se situe désormais aux niveaux des orchestrateurs, notamment Kubernetes[20].

Outils complémentaires à Docker modifier

LinuxKit modifier

Kit d'outils open source conçu pour assembler une distribution Linux à partir de composants systèmes embarqués dans des containers[21].

Ulimit modifier

Docker a notamment introduit la possibilité d'appliquer une limite de consommation de ressource pour les containers d'une même machine[22].

Kitematic modifier

Apporte à Docker une solution graphique de gestion de containers[23].

Notes et Références modifier

Bibliographie modifier

  *(en) E. N. Preeth, Fr. Jaison Paul Mulerickal, Biju Paul et Yedhu Sastri, « Evaluation of Docker containers based on hardware utilization », IEEE Xplore,‎ (ISBN 978-1-4673-7349-4, DOI 10.1109/ICCC.2015.7432984)

  *(en) Devki Nandan Jha, Saurabh Garg, Prem Prakash Jayaraman et Rajkumar Buyya, « A Holistic Evaluation of Docker Containers for Interfering Microservices », IEEE Xplore,‎ (ISBN 978-1-5386-7250-1, ISSN 2474-2473, DOI 10.1109/SCC.2018.00012)

  *(en) Young Jin Kim, Young Choon Lee, Hyuck Han et Sooyong Kang, « Hierarchical Recursive Resource Sharing for Containerized Applications », Springer, Cham,‎ (ISBN 978-3-030-03596-9, DOI 10.1007/978-3-030-03596-9_56)

  *(en) Stephen Soltesz, Herbert P. Pötzl, Marc Eric Fiuczynski et Andy C. Bavier, « Container-based operating system virtualization: a scalable, high-performance alternative to hypervisors », Association for Computing Machinery,‎ (ISBN 9781595936363, DOI 10.1145/1272996.1273025)

  *(en) Mochamad Rexa Mei Bella, Mahendra Data et Widhi Yahya, « Web Server Load Balancing Based On Memory Utilization Using Docker Swarm », IEEE Xplore,‎ (ISBN 978-1-5386-7407-9, DOI 10.1109/SIET.2018.8693212)

  *Ying Mao, Yuqi Fu, Suwen Gu, Sudip Vhaduri, Long Cheng, Qingzhi Liu, « Resource Management Schemes for Cloud-Native Platforms with Computing Containers of Docker and Kubernetes »,

  *(en) Fawaz Paraiso, Stéphanie Challita, Yahya Al-Dhuraibi et Philippe Merle, « Model-Driven Management of Docker Containers », IEEE Xplore,‎ (ISBN 978-1-5090-2619-7, DOI 10.1109/CLOUD.2016.0100)

  *(en) Kejiang Ye et Yunjie Ji, « Performance Tuning and Modeling for Big Data Applications in Docker Containers », IEEE Xplore,‎ (ISBN 978-1-5386-3486-8, DOI 10.1109/NAS.2017.8026871)

  *(en) Lin Cai, Yong Qi et Wei Wei, « Improving Resource Usages of Containers Through Auto-Tuning Container Resource Parameters », IEEE Access,‎ (ISSN 2169-3536, DOI 10.1109/ACCESS.2019.2927279)

  *(en) Emiliano Casalicchio et Vanessa Perciballi, « Measuring Docker Performance: What a Mess!!! », Association for Computing Machinery,‎ (ISBN 9781595936363, DOI 10.1145/1272996.1273025)

  *(en) Xin Xu, Huiqun Yu et Xin Pei, « A Novel Resource Scheduling Approach in Container Based Clouds », IEEE Xplore,‎ (ISBN 978-1-4799-7981-3, DOI 10.1109/CLOUD.2016.0100)

  *(en) Pieter-Jan Maenhaut, Bruno Volckaert, Veerle Ongenae et Filip De Turck, « Resource Management in a Containerized Cloud: Status and Challenges », Springer,‎ (DOI 10.1007/s10922-019-09504-0)

  *(en) Chandra Prakash, Prashanth Prashanth, Umesh Bellur et Purushottam Kulkarni, « Deterministic Container Resource Management in Derivative Clouds », IEEE Xplore,‎ (ISBN 978-1-5386-5008-0, DOI 10.1109/IC2E.2018.00030)

  *(en) Luciano Baresi, Sam Guinea, Giovanni Quattrocchi et Damian A. Tamburri, « MicroCloud: A Container-Based Solution for Efficient Resource Management in the Cloud », IEEE Xplore,‎ (ISSN 0045-7906, DOI 10.1109/SmartCloud.2016.42)

  *(en) Víctor Medel, Rafael Tolosana-Calasanz, José Ángel Bañares et Unai Arronategui, « Characterising resource management performance in Kubernetes », ELSEVIER (Computers & Electrical Engineering, Volume 68),‎ (ISBN 978-1-5090-5263-9, DOI 10.1016/j.compeleceng.2018.03.041)

  *(en) Jing Gu, Shengbo Song, Ying Li et Hanmei Luo, « GaiaGPU: Sharing GPUs in Container Clouds », IEEE Xplore,‎ (ISBN 978-1-7281-1141-4, DOI 10.1109/BDCloud.2018.00077)

  *(en) Ayush Dusia, Yang Yang et Michela Taufer, « Network Quality of Service in Docker Containers », IEEE Xplore,‎ (ISBN 978-1-4673-6598-7, ISSN 1552-5244, DOI 10.1109/CLUSTER.2015.96)

  *(en) Hao Zeng, Baosheng Wang, Wenping Deng et Weiqi Zhang, « Measurement and Evaluation for Docker Container Networking », IEEE Xplore,‎ (ISBN 978-1-5386-2209-4, DOI 10.1109/CyberC.2017.78)

  *(en) Vasily Tarasov, Lukas Rupprecht, Dimitris Skourtis et Amit Warke, « In Search of the Ideal Storage Configuration for Docker Containers », IEEE Xplore,‎ (ISBN 978-1-5090-6558-5, DOI 10.1109/FAS-W.2017.148)

  *(en) Aleksandr Krasnov, Richard R. Maiti et Deanna M. Wilborne, « Data Storage Security in Docker », IEEE Xplore,‎ (ISBN 978-1-7281-6861-6, ISSN 1558-058X, DOI 10.1109/SoutheastCon44009.2020.9249757)

  *(en) Jun Wu et Tung-I Yang, « Dynamic CPU allocation for Docker containerized mixed-criticality real-time systems », IEEE Xplore,‎ (ISBN 978-1-5386-4342-6, DOI 10.1109/ICASI.2018.8394587)

Liens externes modifier

  (en) « Runtime options with Memory, CPUs, and GPUs », sur https://docs.docker.com,

  (en) « Docker Container Resource Management: CPU, RAM and IO: Part 1 », sur https://www.alibabacloud.com,

  « Qu’est-ce que Docker? Quelles sont les limites de la technologie? Ses évolutions et son adaptation aux besoins des environnements de production », sur https://www.linkedin.com,