Docker

  1. Introduction à la conteneurisation
  2. Architecture de Docker
Une image conteneur est un package portable qui contient des logiciels. C’est cette image qui, quand elle est exécutée, devient notre conteneur. Le conteneur est l’instance en mémoire d’une image. Une image conteneur est un package non modifiable qui contient tout le code d’une application, les packages système, les fichiers binaires, les bibliothèques, les fichiers de configuration et le système d’exploitation qui s’exécute dans le conteneur. Les conteneurs Docker s’exécutant sur Linux partagent le noyau du système d’exploitation de l’hôte et ne nécessitent pas de système d’exploitation de conteneur dès lors que le fichier binaire peut accéder directement au noyau du système d’exploitation.

Le système d’exploitation hôte est le système d’exploitation sur lequel le moteur Docker s’exécute. Les conteneurs Docker s’exécutant sur Linux partagent le noyau de l’OS hôte. Ils ne nécessitent pas d’OS de conteneur tant que le fichier binaire peut accéder directement à l’OS hôte.

L’OS de conteneur est celui qui fait partie de l’image packagée. Nous pouvons inclure différentes versions des systèmes d’exploitation Linux ou Windows dans un conteneur. L’OS de conteneur est isolé de l’OS hôte.

Une image de base est une image qui utilise l’image scratch de Docker. L’image scratch est une image conteneur vide qui ne crée pas de couche de système de fichiers. Cette image suppose que l’application que vous allez exécuter peut utiliser directement le noyau du système d’exploitation hôte.

Une image parente est une image conteneur à partir de laquelle vous créez vos images.

Par exemple, au lieu de créer une image à partir de scratch, puis d’installer Ubuntu, nous allons utiliser une image déjà basée sur Ubuntu. Nous pouvons même utiliser une image sur laquelle nginx est déjà installé. Une image parente comprend généralement un système d’exploitation de conteneur.

Un Dockerfile est un fichier texte qui contient les instructions que nous utilisons pour générer et exécuter une image Docker. Les aspects suivants de l’image sont définis :
  • L’image de base ou parente que nous utilisons pour créer l’image
  • Les commandes pour mettre à jour le système d’exploitation de base et installer des logiciels supplémentaires
  • Les artefacts de build à inclure, par exemple une application développée
  • Les services à exposer, comme une configuration de stockage et une configuration réseau
  • La commande à exécuter quand le conteneur est lancé
# Step 1: Specify the parent image for the new image FROM ubuntu:18.04 # Step 2: Update OS packages and install additional software RUN apt -y update && apt install -y wget nginx software-properties-common apt-transport-https \ && wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \ && dpkg -i packages-microsoft-prod.deb \ && add-apt-repository universe \ && apt -y update \ && apt install -y dotnet-sdk-3.0 # Step 3: Configure Nginx environment CMD service nginx start # Step 4: Configure Nginx environment COPY ./default /etc/nginx/sites-available/default # STEP 5: Configure work directory WORKDIR /app # STEP 6: Copy website code to container COPY ./website/. . # STEP 7: Configure network requirements EXPOSE 80:8080 # STEP 8: Define the entry point of the process that runs in the container ENTRYPOINT ["dotnet", "website.dll"]

Comment générer une image

Nous utilisons la commande docker build pour générer des images Docker. Supposons que nous utilisons la définition du Dockerfile précédent pour générer une image. Voici un exemple qui illustre la commande build :

docker build -t temp-ubuntu

Une étiquette d’image est une chaîne de caractères utilisée pour la gestion de versions d’une image. Si vous ne spécifiez pas d’étiquette, une image est étiquetée avec latest.

Pour Windows, Microsoft ne fournit pas d’images conteneur de base avec l’étiquette latest. Pour les images conteneur de base Windows, vous devez spécifier une étiquette que vous souhaitez utiliser. Par exemple, l’image conteneur de base Windows pour Server Core est mcr.microsoft.com/windows/servercore. Parmi ses étiquettes figurent ltsc2016, ltsc2019 et ltsc2022.

Voici un autre exemple. Supposons que vous voulez utiliser les images Docker des exemples .NET Core. Nous avons ici quatre versions de plateformes au choix :
mcr.microsoft.com/dotnet/core/samples:dotnetapp
mcr.microsoft.com/dotnet/core/samples:aspnetapp
mcr.microsoft.com/dotnet/core/samples:wcfservice
mcr.microsoft.com/dotnet/core/samples:wcfclient

Dans la liste d’images précédente, nous pouvons voir que Microsoft fournit plusieurs exemples de .NET Core. Les étiquettes spécifient les exemples auxquels l’image fait référence : ASP.NET, service WCF, etc.

Un fichier Dockerfile est un fichier texte qui contient des instructions sur la génération d’une image Docker. Le Kit de développement logiciel (SDK) .NET vous permet désormais de créer des conteneurs via la commande dotnet publish et de prendre en charge les mêmes commandes que le fichier Dockerfile. Un fichier Docker Compose est un fichier YAML qui regroupe plusieurs conteneurs Docker à des fins de génération et de déploiement.

Opérations sur les Conteneurs

Pour lancer l’exécution d’un conteneur, utilisez la commande Run.


Pour répertorier des conteneurs en cours d’exécution, exécutez la commande docker ps. Pour afficher tous les conteneurs quel que soit leur état, passez l’argument -a.

Le logiciel Docker configure automatiquement un registre d’images local sur votre machine. Vous pouvez visualiser les images de ce registre avec la commande docker images.

Vous pouvez supprimer une image du registre Docker local avec la commande docker rmi.

Pour démarrer un conteneur, utilisez la commande docker run. Vous devez seulement spécifier l’image à exécuter avec son nom ou son ID pour lancer le conteneur à partir de l’image. Un conteneur lancé de cette manière fournit une expérience interactive.

Ici, pour exécuter le conteneur avec notre site web en arrière-plan, ajoutez l’indicateur -d.

Persistance de Données

Les conteneurs peuvent utiliser deux options pour rendre les données persistantes. La première option est d’utiliser des volumes ; la deuxième est d’utiliser des montages de liaison.

Un volume est stocké sur le système de fichiers de l’hôte à un emplacement de dossier spécifique. Choisissez un dossier dans lequel vous savez que les données ne seront pas modifiées par des processus non-Docker.

Docker crée et gère le nouveau volume en exécutant la commande docker volume create. Cette commande peut faire partie de notre définition Dockerfile, ce qui signifie que vous pouvez créer des volumes dans le cadre du processus de création d’un conteneur. Docker crée le volume s’il n’existe pas quand vous essayez de monter le volume pour la première fois dans un conteneur.



D’un point de vue conceptuel, un montage de liaison est identique à un volume, mais au lieu d’utiliser un dossier spécifique, vous pouvez monter n’importe quel fichier ou dossier sur l’hôte. Vous souhaitez également que l’hôte puisse modifier le contenu de ces montages. Tout comme les volumes, le montage de liaison est créé si vous le montez mais il n’existe pas encore sur l’hôte.

Les montages de liaison ont des fonctionnalités limitées par rapport aux volumes, et même s’ils sont plus performants, ils dépendent de la présence sur l’hôte d’une structure de dossiers spécifique.

Un montage de liaison, tout comme un volume, est stocké sur le système de fichiers de l’hôte à un emplacement de dossier spécifique. Cependant, les données du montage de liaison sont destinées à être mises à jour par l’hôte. Le contenu de resolve.conf est censé être modifié par l’hôte, et il est utilisé à la fois par le conteneur et par l’hôte.

Les volumes sont considérés comme étant la stratégie de prédilection pour le stockage de données avec les conteneurs.

Pour les conteneurs Windows, une autre option est disponible : vous pouvez monter un chemin SMB en tant que volume et le présenter à des conteneurs. Cela permet aux conteneurs sur différents hôtes d’utiliser le même stockage persistant.

Configuration réseau

La configuration réseau par défaut de Docker permet d’isoler les conteneurs sur l’hôte Docker. Cette fonctionnalité vous permet de générer et de configurer des applications qui peuvent communiquer entre elles de façon sécurisée.

Docker fournit différents paramètres réseau pour Linux et Windows.

Pour Linux, il existe six options réseau préconfigurées :
  • « Bridge » (pont) : Le réseau de pont est la configuration par défaut appliquée aux conteneurs quand ils sont lancés sans autre spécification de la configuration réseau. Ce réseau est un réseau privé interne utilisé par le conteneur. Il isole le réseau du conteneur du réseau de l’hôte Docker.
  • « Host » (hôte) : Le réseau hôte vous permet d’exécuter le conteneur directement sur le réseau de l’hôte. Cette configuration supprime efficacement l’isolation entre l’hôte et le conteneur au niveau du réseau.
  • Overlay
  • IPvLan
  • MACvLan
  • Aucun

Pour Windows, il existe six options réseau préconfigurées :

  • NAT (Network Address Translation)
  • Mode transparent
  • Overlay
  • L2Bridge
  • L2Tunnel
  • Aucun

Bridge

Dans notre exemple, votre portail de suivi est accessible aux clients via le port 80. Vous devrez mapper le port 80 du conteneur à un port disponible sur l’hôte. Le port 8080 est ouvert sur l’hôte, ce qui vous permet de définir l’indicateur comme suit :

--publish 8080:80

Hote

Sur Windows, le réseau hôte n’est pas disponible. Sur les hôtes Windows, il n’y a pas d’option permettant de partager la même adresse IP (pile réseau) entre l’hôte et le conteneur. Le réseau NAT fonctionne essentiellement comme un pont réseau, et l’option Superposition fournit une adresse IP au conteneur à partir du même réseau que l’hôte, mais pas la même adresse IP.

Par exemple, vous pouvez déployer des conteneurs Docker sur Azure Container Instances, Azure App Service et Azure Kubernetes Services. Chacune de ces options vous offre des fonctionnalités et des possibilités différentes.

Par exemple, Azure Container Instances vous permet de vous concentrer sur la conception et la création de vos applications sans devoir gérer l’infrastructure. Et quand vous avez un grand nombre de conteneurs à orchestrer, le service Azure Kubernetes facilite le déploiement et la gestion des déploiements de conteneurs à grande échelle.

Commentaires

Posts les plus consultés de ce blog

Sécurité des Applications

Principes de la Programmation Orientée Objet

Principe de Responsabilité Unique