Qu’est-ce que Docker ?

Un conteneur est un format d’empaquetage qui regroupe tout le code et les dépendances d’une application dans un format standard, qui permet une exécution rapide et de fiable dans l’ensemble des environnements informatiques. Un conteneur Docker est un conteneur exécutable populaire léger et autonome, qui comprend tous les éléments nécessaires pour exécuter une application, notamment les bibliothèques, les outils système, le code et le runtime. Docker est également une plateforme logicielle qui permet aux développeurs de créer, tester et déployer rapidement des applications en conteneur.

Les services Containers as a Service (CaaS) ou services de conteneurs sont des services cloud gérés qui gèrent le cycle de vie des conteneurs. Les services de conteneur aident à orchestrer (démarrer, arrêter, mettre à l’échelle) l’exécution des conteneurs. Grâce aux services de conteneur, vous pouvez simplifier, automatiser et accélérer le développement de vos applications et le cycle de vie de votre déploiement.

Docker et les services de conteneurs ont connu une adoption rapide et un énorme succès au cours des dernières années. Alors qu'il s'agissait d'une technologie open source presque inconnue et plutôt technique en 2013, Docker a évolué pour devenir un environnement d’exécution standardisé désormais officiellement pris en charge pour de nombreux produits Oracle Enterprise.

La terminologie de Docker

Docker:

Une plate-forme de conteneurs logicielle conçue pour développer, expédier et exécuter des applications utilisant la technologie des conteneurs. Docker est disponible en deux versions : une édition d'entreprise et une édition communautaire

Conteneur :

Contrairement à une machine virtuelle qui fournit la virtualisation matérielle, un conteneur fournit une virtualisation légère au niveau du système d'exploitation par l'abstraction de l'« espace utilisateur ». Les conteneurs partagent le noyau du système hôte avec d'autres conteneurs. Un conteneur, qui s'exécute sur le système d'exploitation hôte, est une unité logicielle standard qui rassemble le code et toutes ses dépendances, afin que les applications puissent s'exécuter rapidement et de manière fiable d'un environnement à un autre. Les conteneurs ne sont pas persistants et sont lancés à partir d'images.

Moteur Docker :

Ce logiciel hôte open source crée et exécute les conteneurs. Le moteur Docker fait office d'application client-serveur prenant en charge les conteneurs sur divers serveurs Windows et systèmes d'exploitation Linux, notamment Oracle Linux, CentOS, Debian, Fedora, RHEL, SUSE et Ubuntu.

Images Docker :

Ensemble de logiciels à exécuter en tant que conteneur contenant un ensemble d'instructions pour la création d'un conteneur pouvant être exécuté sur la plate-forme Docker. Les images ne sont pas modifiables ; pour apporter des modifications à une image, il faut en créer une nouvelle.

Registre Docker:

Emplacement pour stocker et télécharger des images. Le registre est une application côté serveur sans conservation de statut et évolutive qui stocke et distribue des images Docker.

Qui utilise Docker ?

Docker est une structure de développement d’applications ouverte conçue pour faciliter le travail des DevOps et des développeurs. Grâce à Docker, les développeurs peuvent créer, packager, livrer et exécuter des applications en toute simplicité, sous forme de conteneurs légers, portables et autonomes, qui peuvent fonctionner pratiquement n’importe où. Les conteneurs permettent aux développeurs de conditionner une application avec toutes ses dépendances et de la déployer en une seule unité. En fournissant des conteneurs d’applications prédéfinis et autonomes, les développeurs peuvent se concentrer sur le code de l’application et l’utiliser sans se soucier du système d’exploitation sous-jacent ou du système de déploiement.

De plus, les développeurs peuvent exploiter des milliers d’applications de conteneur open source qui sont déjà conçues pour s’exécuter dans un conteneur Docker. Pour les équipes DevOps, Docker se prête à l’intégration continue et aux chaînes d’outils de développement. Il réduit les contraintes et la complexité nécessaires au sein de leur architecture système pour déployer et gérer les applications. Avec l’introduction des services cloud d’orchestration de conteneurs, tout développeur peut développer des applications en conteneur localement dans son environnement de développement, puis déplacer et exécuter ces applications en conteneur en production vers des services cloud, tels que les services Kubernetes gérés.

Docker et les développeurs

Les conteneurs peuvent être empaquetés par tout type de développeur. Dans le secteur des logiciels, il est courant de séparer les développeurs par spécialité : front-end, back-end, full-stack, etc. Même si ce sont généralement les développeurs de back-end qui créent les conteneurs, tout informaticien connaissant les concepts de base CaaS peut prendre part à ce domaine particulier du cycle de développement logiciel. Avant de préparer les dépendances de votre application, consultez developer.oracle.com et apprenez à connaître les outils que vous pouvez utiliser pour créer votre application ou votre programme.

Docker ou Kubernetes

Les conteneurs Linux existent depuis 2008, mais ils étaient méconnus jusqu’à l’émergence des conteneurs Docker en 2013. L’apparition des conteneurs Docker a été accompagnée de l’explosion de l’intérêt pour le développement et le déploiement d’applications en conteneur. Lorsque le nombre d’applications en conteneur augmenta pour englober des centaines de conteneurs déployés sur plusieurs serveurs, leur fonctionnement gagna en complexité. Comment coordonner, mettre à l’échelle, gérer et planifier des centaines de conteneurs ? Kubernetes peut aider dans cette tâche. Kubernetes est un système d’orchestration open source qui vous permet d’exécuter vos conteneurs et charges de travail Docker. Il aide à gérer les aspects complexes du fonctionnement lors du passage à l’échelle de plusieurs conteneurs déployés sur plusieurs serveurs. Le moteur Kubernetes orchestre automatiquement le cycle de vie du conteneur, en répartissant les conteneurs d’application sur l’ensemble de l’infrastructure d’hébergement. Kubernetes peut rapidement augmenter ou diminuer les ressources, en fonction de la demande. Il provisionne, planifie, supprime et surveille en permanence l’intégrité des conteneurs.

Fondamentaux de Docker

Les éléments de base de Docker sont les images et les conteneurs. Une image Docker contient tous les éléments nécessaires à l'exécution de votre logiciel : le code, un environnement d'exécution tel que Java Virtual Machine (JVM), des pilotes, des outils, des scripts, des bibliothèques, des déploiements, etc.

Un conteneur Docker est une instance en cours d’exécution d’une image Docker. Cependant, contrairement à la virtualisation classique avec un hyperviseur de type 1 ou de type 2, un conteneur Docker s’exécute sur le noyau du système d’exploitation hôte. Dans une image Docker, il n’y a pas de système d’exploitation séparé, comme illustré dans la figure 1.

les bases de docker
Illustration 1

Isolation ou virtualisation

Chaque conteneur Docker possède son propre système de fichiers, sa propre pile réseau (et par conséquent sa propre adresse IP), son propre espace de traitement et des limitations de ressources définies pour le processeur et la mémoire. Puisqu’un conteneur Docker n’a pas besoin de démarrer un système d’exploitation, il démarre instantanément. Docker s’appuie sur l’isolement, qui consiste à séparer les ressources d’un système d’exploitation hôte, par opposition à la virtualisation, qui consiste à offrir un système d’exploitation invité au-dessus du système d’exploitation hôte.

Système de fichiers incrémentiel

Système de fichiers incrémentiel
Illustration 2

Le système de fichiers d’une image Docker est organisé en couches, avec une sémantique de copie sur écriture. Il permet l’héritage et la réutilisation, l’économie des ressources sur le disque, ainsi que le téléchargement incrémentiel d’images.

Comme illustré à la figure 2, une image Docker avec un déploiement Weblogic pourrait être basée sur une image avec un domaine Oracle WebLogic Server, qui pourrait être basée sur une image Weblogic, qui est basée sur une image Java Development Kit (JDK), qui à son tour est basée sur une image de base Oracle Linux.

Registre Docker

Bien que les images Docker soient faciles à créer et que les développeurs apprécient leur simplicité et leur portabilité, ils ont rapidement découvert que la gestion de milliers d’images Docker est très difficile. Le registre Docker permet de relever ce défi. Le registre Docker est une méthode standard de stockage et de distribution des images Docker. Le registre est un référentiel open source sous licence d’autorisation Apache.

Le registre Docker permet également d’améliorer le contrôle d’accès et la sécurité des images Docker stockées dans son référentiel. Il gère la distribution des images et peut également s’intégrer aux flux de travail de développement d’applications. Les développeurs peuvent configurer leur propre registre Docker, ou utiliser un service de registre Docker hébergé tel que Docker Hub, Oracle Container Registry, Azure Container Registry, etc.

Docker Hub est un registre Docker hébergé géré par Docker. Docker Hub contient plus de 100 000 images de conteneurs provenant d’éditeurs de logiciels, de projets open source et de la communauté. Docker Hub contient des logiciels et des applications provenant de référentiels officiels tels que Nginx, Logstash, Apache HTTP, Grafana, MySQL, Ubuntu et Oracle Linux.

Lorsque vous démarrez un conteneur, Docker extraira automatiquement par défaut l’image correspondante du Docker Hub public si elle n’est pas disponible localement. De plus, vous pouvez également créer vos propres images et les pousser vers Docker Hub dans un référentiel public ou privé.

Figure 3 : capture d'écran Docker Registry
Illustration 3

Docker en tant que moteur d’exécution de microservices

L’idée de découper des applications monolithiques en petites parties de microservices est très répandue parmi les développeurs de logiciels actuellement.

Les microservices sont déployés indépendamment en tant que processus, utilisent des protocoles légers pour communiquer entre eux et chaque service possède ses données. Étant donné que les microservices adoptent une approche de gouvernance décentralisée, ils nécessitent une quantité assez élevée d’automatisation de l’infrastructure, de tests automatisés, de pipelines de CD entièrement automatisés et d’équipes DevOps compétentes et agiles.

Ce style architectural ne fait pas l’unanimité, mais il serait naïf de supposer qu’une application décomposée en microservices peut fonctionner simplement comme un ensemble de processus. Pour ne citer que quelques exigences, un microservice doit être indépendant de l’hôte et isolé au niveau du système d’exploitation. Il doit fonctionner dans les limites de ses ressources, doit être augmenté ou réduit, redémarré en cas d’échec, et découvert et connecté à d’autres microservices via une couche réseau définie par logiciel.

Par conséquent, exécuter un microservice dans un conteneur Docker est un excellent point de départ pour atteindre la plupart de ces objectifs.

Docker : deux dimensions clés

Docker transforme la façon dont nous construisons, livrons et exécutons des logiciels dans deux dimensions différentes :

  • Il permet de mener des applications du développement à la production en toute fiabilité.
  • Il offre un format d’image de référentiels pour passer du modèle on-premises au cloud.

Les deux dimensions sont présentées en détail dans les paragraphes suivants.

Image Docker : du développement à la production

Créer une image Docker avec toutes ses dépendances résout le problème « mais cela a fonctionné pour moi sur ma machine de développement ». Le principe est qu’une image Docker est créée automatiquement par un pipeline de construction à partir d’un référentiel de code source comme Git et initialement testée dans un environnement de développement. Cette image immuable est ensuite stockée dans un registre Docker.

Comme le montre la figure 4, cette même image est utilisée pour des tests de charge, d’intégration, d’acceptation, etc. La même image est utilisée dans tous les environnements. Des différences mineures mais nécessaires spécifiques à l’environnement, comme une URL JDBC pour une base de données de production, peuvent être introduites dans le conteneur sous forme de variables d’environnement ou de fichiers.

images docker
Illustration 4

Les statistiques montrent que 65 % de tous les cas d’utilisation actuels de Docker entrent dans le cadre du développement. En outre, 48 % des cas d'utilisation de Docker concerne l’intégration continue.

Docker et le cloud

Docker a influencé l'adoption des clouds publics. D’une part, les images Docker constituent le tout premier format de package commun qui peut être exécuté à la fois sur site et sur tous les principaux fournisseurs cloud. Les conteneurs Docker fonctionnent sur mon ordinateur portable de la même manière que sur Oracle Cloud.

D’autre part, puisque les conteneurs Docker fonctionnent sur tous les grands clouds publics, ils contribuent à démentir le préjugé de longue date selon lequel les clouds publics rendent dépendants. Tous les grands fournisseurs cloud proposent désormais Docker en tant que PaaS.

Versions de Docker : maturité de la technologie sous-jacente

Le rythme des versions de Docker est beaucoup plus rapide que le cycle de publication des logiciels d’entreprise traditionnels. Parfois, le rythme effréné des versions Docker, associé à la nouveauté du projet Docker, engendre des inquiétudes quant à la sécurité et à la stabilité de Docker.

Bien que Docker et sa ligne de commande, le daemon Docker, son API et des outils tels que Docker Swarm, Docker Machine et Docker Compose n’ont évolué qu’au cours des trois dernières années, les fonctionnalités de noyau Linux sous-jacentes sont disponibles dans chaque noyau Linux depuis près d’une décennie.

Google est un exemple marquant d’un des premiers utilisateurs de la technologie des conteneurs. Google utilisait les conteneurs Linux avant même que Docker n’existe. De plus, Google exécute tout dans un conteneur. Selon des estimations, Google lance plusieurs milliards de conteneurs par semaine.

Historique des cgroups et des espaces de noms

Les fonctionnalités du noyau Linux sous-jacentes utilisées par Docker sont les cgroups (groupes de contrôle) et les espaces de noms. En 2008, les cgroups ont été introduits dans le noyau Linux sur la base du travail précédemment effectué par les développeurs Google 1. Ils limitent et tiennent compte de l’utilisation des ressources d’un ensemble de processus du système d’exploitation.

Le noyau Linux utilise un espace de noms pour isoler les ressources système des processus les unes par rapport aux autres. Le premier espace de noms, c’est-à-dire l’espace de noms de montage, a vu le jour en 2002.2

Container Cloud Services

La première partie de cet article expliquait quelques concepts importants concernant Docker. Cependant, dans un environnement de production, il ne suffit pas d’exécuter une application dans un conteneur Docker.

La configuration et le fonctionnement d’un environnement de production nécessitent du matériel pour exécuter les conteneurs. Les logiciels tels que Docker, ainsi que les référentiels et les gestionnaires de clusters, doivent être installés, mis à niveau et corrigés. Si plusieurs conteneurs Docker communiquent entre les hôtes, un réseau doit être créé. Les conteneurs en cluster doivent être redémarrés en cas d’échec. En outre, un ensemble de conteneurs reliés entre eux doit être aussi facile à déployer qu’une instance unique d’application logique. Prenons l’exemple d’un équilibreur de charge, quelques serveurs web, des instances Oracle WebLogic Server avec un serveur d’administration, un serveur géré et une base de données. Gérer les applications en conteneur à grande échelle nécessite un système d’orchestration de conteneurs comme Kubernetes ou Docker Swarm. Le déploiement, la gestion et l’exploitation de systèmes d’orchestration tels que Kubernetes peuvent être difficiles et prendre du temps.

Pour faciliter la création d’applications en conteneur et la rendre plus efficace pour les développeurs, les fournisseurs cloud proposent des services de conteneur cloud ou Containers as a Service (CaaS). Les services de conteneur cloud aident les développeurs et les équipes opérationnelles à rationaliser et à gérer le cycle de vie des conteneurs de manière automatisée. Ces services d’orchestration, généralement créés avec Kubernetes, permettent aux équipes DevOps de gérer et d’exploiter plus facilement des applications en conteneur à grande échelle. Oracle Container Engine for Kubernetes et Azure Kubernetes Service sont deux exemples de services cloud gérés par l’orchestration de conteneurs plébiscités.

Oracle Container Engine for Kubernetes est un service entièrement géré, évolutif et hautement disponible que vous pouvez utiliser pour déployer vos applications en conteneur dans le cloud. Utilisez Container Engine for Kubernetes (parfois abrégé en OKE) lorsque votre équipe de développement souhaite créer, déployer et gérer de manière fiable les applications cloud natives.

Images Docker d'Oracle

Les conteneurs peuvent être empaquetés par tout type de développeur. Dans le secteur des logiciels, il est courant de séparer les développeurs par spécialité : front-end, back-end, full-stack, etc. Même si ce sont généralement les développeurs de back-end qui créent les conteneurs, tout informaticien connaissant les concepts de base CaaS peut prendre part à ce domaine particulier du cycle de développement logiciel. Avant de préparer les dépendances de votre application, consultez developer.oracle.com et apprenez à connaître les outils que vous pouvez utiliser pour créer votre application ou votre programme.

Vous trouverez ci-dessous quelques sources pour obtenir ou créer des images Docker pour les produits Oracle. Le référentiel Oracle GitHub pour les images Docker contient des fichiers Docker et des exemples pour créer des images Docker pour les produits commerciaux Oracle et les projets open source sponsorisés par Oracle.

Atelier pratique sur Docker : développement conteneurisé avec Docker

Références

  1. Cgroups (Wikipédia)
  2. Espaces de noms Linux (Wikipédia)