Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Rapport Docker

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 28

I.

Introduction à Docker :
Docker est un ensemble de plateformes et de services qui facilitent la création, le déploiement et la gestion
d'applications à l'aide de conteneurs. Les conteneurs Docker offrent une solution légère et portable pour l'emballage
des applications avec toutes leurs dépendances et en garantissant leur exécution cohérente quel que soit
l'environnement. En d'autres termes, Docker permet aux développeurs d'empaqueter une application avec toutes les
parties dont elle a besoin, telles que les bibliothèques et les autres dépendances, et de la déployer sous forme de
conteneur, ce qui garantit une portabilité et une cohérence maximales lors de son exécution sur différents
environnements, des ordinateurs portables de développement aux serveurs de production en passant par les
environnements cloud.

II. Réseau Docker:


Docker Network est un composant essentiel de l'écosystème Docker qui gère la connectivité réseau entre les conteneurs
Docker, l'hôte Docker et le monde extérieur. Il offre plusieurs types de réseaux pour permettre aux conteneurs de
communiquer entre eux et avec d'autres services, que ce soit localement sur l'hôte Docker ou à travers des
environnements distribués.

1. Types de réseau Docker :

Docker propose cinq pilotes réseau intégrés qui implémentent les fonctionnalités de base du réseau :

a. Bridge : Crée un pont logiciel entre l'hôte et le conteneur, permettant aux conteneurs connectés au réseau
de communiquer entre eux. Les conteneurs peuvent également accéder au réseau de l'hôte et à Internet,
mais ils restent isolés des dispositifs physiques sur le réseau local.
b. Host : Les conteneurs utilisant le mode réseau de l'hôte partagent la pile réseau de l'hôte sans aucune
isolation. Ils n'ont pas d'adresse IP propre et les liaisons de ports sont directement publiées sur l'interface
réseau de l'hôte.

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


c. Overlay : Les réseaux superposés sont des réseaux distribués qui couvrent plusieurs hôtes Docker. Ils
permettent à tous les conteneurs exécutés sur l'un des hôtes de communiquer directement entre eux sans
nécessiter de prise en charge du routage au niveau du système d'exploitation.
d. IPvLAN : Offre un contrôle précis sur les adresses IPv4 et IPv6 assignées aux conteneurs, ainsi que sur le
marquage et le routage des VLAN de couche 2 et 3.
e. Macvlan : Permet aux conteneurs d'apparaître comme des dispositifs physiques sur le réseau en leur
attribuant une adresse MAC unique. Cela nécessite la dédicace d'une interface physique de l'hôte au réseau
virtuel.

2. Choix du Type de Réseau Adapté :

Le choix du type de réseau dépend des besoins spécifiques de votre application et de votre environnement. En général :

• Les réseaux bridge sont recommandés pour la plupart des cas d'utilisation. Ils offrent une isolation et permettent aux
conteneurs de communiquer entre eux et avec le réseau de l'hôte.
• Les réseaux host sont adaptés lorsque vous avez besoin d'une intégration directe avec le réseau de l'hôte et que l'isolation
des conteneurs n'est pas une préoccupation majeure.
• Les réseaux overlay sont essentiels pour les environnements distribués où les conteneurs sur différents hôtes doivent
communiquer directement entre eux.
• Les réseaux macvlan sont utiles lorsque les conteneurs doivent apparaître comme des périphériques physiques sur le réseau
de l'hôte.
• Les réseaux IPvLAN sont une option avancée offrant un contrôle précis sur les adresses IP et le routage des conteneurs.

Il est également possible d'utiliser des plug-ins réseau tiers pour étendre les fonctionnalités du réseau Docker selon vos besoins
spécifiques. Enfin, la désactivation de la mise en réseau au niveau du conteneur avec l'option "none" peut renforcer la sécurité en
isolant complètement le conteneur du réseau.

3. Fonctionnement de la mise en réseau Docker :

Docker exploite la pile réseau de votre hôte pour mettre en place son système de mise en réseau. Il gère le trafic vers les
conteneurs en ajustant les règles iptables, ce qui assure l'isolation entre les réseaux Docker et votre hôte.

iptables, l'outil standard de filtrage de paquets Linux, définit le cheminement du trafic à travers la pile réseau de l'hôte. Les
réseaux Docker ajoutent des règles de filtrage pour diriger le trafic vers les applications des conteneurs, tout cela de manière
automatisée, évitant ainsi toute manipulation manuelle d'iptables.

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Chaque conteneur Docker possède son propre espace de noms réseau, grâce à une fonctionnalité du noyau Linux, assurant ainsi
des environnements virtuels isolés. De plus, les conteneurs établissent des interfaces réseau virtuelles sur l'hôte, leur permettant
de communiquer avec le réseau de l'hôte en dehors de leur espace de noms.

4. Gestion du réseau Docker :

a. Création du réseau Docker :

Pour créer un réseau, utilisez la commande docker network create. Vous pouvez spécifier le pilote à utiliser, tel qu’un pont ou un
hôte, en définissant l’indicateur -d. Un réseau de ponts sera créé si vous omettez l’indicateur.

Exécutez la commande suivante dans la première fenêtre de votre terminal :

b. Connexion de conteneurs à des réseaux :

Vous pouvez attacher de nouveaux conteneurs à un réseau en définissant l’indicateur --network avec votre commande docker run.

Exécutez cette commande dans la deuxième fenêtre de votre terminal :

Ensuite, ouvrez votre troisième fenêtre de terminal et démarrez un autre conteneur Ubuntu, cette fois sans l’indicateur --network :

Essayez maintenant de communiquer entre les deux conteneurs, en utilisant leurs noms :

Les conteneurs ne sont pas encore dans le même réseau, ils ne peuvent donc pas communiquer directement entre eux.

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Utilisez votre première fenêtre de terminal pour joindre container2 au réseau :

Les conteneurs partagent désormais un réseau, ce qui leur permet de se découvrir mutuellement :

c. Utilisation de la mise en réseau de l’hôte :

Les réseaux bridge sont ce que vous utiliserez le plus souvent pour connecter vos conteneurs. Explorons également les capacités des réseaux
host, où les conteneurs se connectent directement aux interfaces de votre hôte. Vous pouvez activer la mise en réseau de l’hôte pour un conteneur
en le connectant au réseau host intégré :

NGINX écoute sur le port 80 par défaut. Étant donné que le conteneur utilise un réseau hôte, vous pouvez accéder à votre serveur NGINX
sur localhost :80 de votre hôte en dehors du conteneur, même si aucun port n’a été explicitement lié :

d. Désactivation de la mise en réseau Docker :

Lorsque la mise en réseau d’un conteneur est désactivée, il n’y a pas de connectivité disponible, que ce
soit avec d’autres conteneurs ou avec votre réseau plus large. Désactivez la mise en réseau en attachant
votre conteneur au réseau none :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


e. Suppression de conteneurs de réseaux :

Docker vous permet de gérer librement les connexions réseau sans redémarrer vos conteneurs. Dans la section précédente, vous avez vu
comment connecter un conteneur après sa création ; Il est également possible de supprimer des conteneurs des réseaux auxquels ils n’ont
plus besoin de participer :

Toutes les modifications que vous apportez s’appliqueront immédiatement.

f. Gestion de réseaux :

Vous pouvez répertorier tous vos réseaux Docker à l’aide de la commande network ls :

Pour supprimer un réseau, déconnectez ou arrêtez tous les conteneurs Docker qui l’utilisent, puis transmettez l’ID ou le nom du réseau
à network rm :

Vous pouvez supprimer automatiquement tous les réseaux inutilisés à l’aide de la commande network prune :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


III. Stockage dans Docker, Volumes et données
persistantes :
Par défaut, tous les fichiers créés à l'intérieur d'un conteneur sont stockés dans une couche de conteneur inscriptible.

Cela signifie que :

Les données ne persistent pas lorsque ce conteneur n'existe plus, et il peut être difficile d'extraire les données du conteneur si un autre
processus en a besoin.

La couche inscriptible d'un conteneur est étroitement liée à la machine hôte sur laquelle le conteneur s'exécute. Vous ne pouvez pas
déplacer facilement les données ailleurs.

Écrire dans une couche inscriptible de conteneur nécessite un pilote de stockage pour gérer le système de fichiers.

Le pilote de stockage fournit un système de fichiers en union, en utilisant le noyau Linux. Cette abstraction supplémentaire réduit les
performances par rapport à l'utilisation de volumes de données, qui écrivent directement sur le système de fichiers de l'hôte. Docker
propose deux options pour que les conteneurs stockent des fichiers sur la machine hôte, de sorte que les fichiers soient persistants
même après l'arrêt du conteneur : les volumes et les montages de liaison.

Par défaut, lorsqu'un conteneur crée des fichiers, ils sont stockés dans une couche de conteneur inscriptible. Les implications sont les
suivantes :

• Les données ne sont pas conservées une fois que le conteneur est supprimé, rendant difficile l'extraction de données si
nécessaire.
• Cette couche est étroitement liée à la machine hôte, ce qui limite la portabilité des données.
• Écrire dans cette couche nécessite un pilote de stockage, ce qui peut affecter les performances car il ajoute une abstraction
supplémentaire.
Pour rendre les données persistantes après l'arrêt du conteneur, Docker propose deux solutions : les volumes et les montages de
liaison.

1. Volumes :
Les volumes sont le mécanisme privilégié pour persister les données générées et utilisées par les conteneurs Docker. Alors que
les montages de liaison dépendent de la structure des répertoires et du système d'exploitation de la machine hôte, les volumes
sont entièrement gérés par Docker. Les volumes présentent plusieurs avantages par rapport aux montages de liaison :

• Facilité de sauvegarde et de migration.


• Gestion via l'interface de ligne de commande Docker ou l'API.
• Fonctionnalité sur les conteneurs Linux et Windows.
• Partage plus sécurisé entre plusieurs conteneurs.
• Possibilité de stockage distant, chiffrement ou autres fonctionnalités via des pilotes.
• Préremplissage du contenu par un conteneur.
• Meilleures performances sur Docker Desktop que les montages de liaison depuis Mac et Windows.

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


De plus, les volumes sont souvent un meilleur choix que la persistance des données dans la couche inscriptible d'un conteneur,
car un volume n'augmente pas la taille des conteneurs qui l'utilisent, et le contenu du volume existe en dehors du cycle de vie
d'un conteneur donné.

a. Utilisation de volumes Docker :

Voyons comment fonctionnent les volumes. Vous pouvez démarrer un conteneur avec un volume en définissant l’indicateur -v lorsque vous
appelez docker run.

La commande suivante démarre un nouveau conteneur Ubuntu 22.04 et y attache votre terminal (-it), prêt à exécuter des commandes de
démonstration dans les étapes suivantes. Un volume appelé demo_volume est monté sur /data à l’intérieur du conteneur. Exécutez la
commande maintenant :

Listez le contenu du répertoire /data de votre conteneur :

Le chemin d’accès existe, ce qui indique que le volume a été monté avec succès, mais qu’aucun fichier n’a encore été créé.

Ajoutez un fichier de test avec un contenu arbitraire :

Ensuite, détachez de votre conteneur en appuyant sur Ctrl+C ou en exécutant exit :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Le conteneur s’arrête immédiatement, car aucun autre processus n’est en cours d’exécution.

Maintenant, démarrez un nouveau conteneur qui attache le même volume :

Le volume demo_volume existe déjà, Docker le réutilisera au lieu d’en créer un nouveau. Cette fois, le volume est monté sur un chemin
différent à l’intérieur du conteneur, mais lorsque vous répertoriez le contenu du chemin d’accès, vous verrez le fichier créé par le premier
conteneur :

Docker a conservé le contenu du volume après l’arrêt du premier conteneur, ce qui lui a permis d’être réutilisé avec votre conteneur de
remplacement.

L’exemple ci-dessus a montré comment Docker crée automatiquement des volumes lorsque vous référencez un nouveau nom pour la première
fois. Vous pouvez créer manuellement des volumes à l’avance à l’aide de la commande docker volume create :

Le volume peut ensuite être monté sur vos conteneurs de la même manière qu’auparavant :

b. Remplissage du contenu du volume :

Lorsque vous montez des volumes sur des chemins d'accès dans les conteneurs qui contiennent déjà des données, Docker copie ces
données existantes dans le nouveau volume. Cela prévient toute perte accidentelle de données et permet aux autres conteneurs
utilisant le même volume de voir également le contenu provenant des points de montage voisins.

c. Montage des volumes en lecture seule :

Les volumes sont montés en mode lecture-écriture par défaut. Pour monter un volume en mode lecture seule,
incluez ro ou readonly comme troisième champ dans l’indicateur -v de votre commande docker run :

$ docker run -it -v app_data:/app:ro alpine:latest

Le volume sera en lecture seule pour le conteneur, idéal pour partager des données entre plusieurs conteneurs où seuls certains ont
besoin de permissions d'écriture.
d. Réutilisation des volumes au démarrage des conteneurs :

Parfois, vous souhaiterez peut-être démarrer un nouveau conteneur avec les mêmes volumes qu’un conteneur existant sur votre
hôte. Au lieu de répéter la liste des options -v requises, vous pouvez utiliser --volumes-from pour inclure automatiquement
les volumes d’un autre conteneur :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


# Create the first container
$ docker run -d --name db -v app_data:/data database-image:latest

# Create the second container


$ docker run -d --name backup --volumes-from db backup-image:latest

Docker monte automatiquement tous les volumes déjà attachés au conteneur existant, en utilisant les mêmes chemins de destination
pour les monter dans le nouveau conteneur. Cette fonctionnalité simplifie la sauvegarde des volumes d'un conteneur, permettant de
les monter facilement dans un nouveau conteneur exécutant une image de sauvegarde dédiée

e. Utilisation de volumes dans Dockerfiles :

Docker permet aux images de définir des points de montage de volume à l’aide de l’instruction VOLUME Dockerfile. Lorsqu’un
conteneur est démarré à partir d’une image, Docker crée automatiquement de nouveaux volumes pour les points de montage
répertoriés dans le fichier Dockerfile.

Le fichier Dockerfile suivant monte toujours un volume sur /app_data à l’intérieur du conteneur, même si vous appelez docker
run sans l’indicateur -v :

FROM ubuntu:22.04
VOLUME /app_data

Vous pouvez toujours monter manuellement un volume nouveau ou existant sur des chemins référencés par les instructions VOLUME.
L’option -v remplace le contenu du fichier Dockerfile :

$ docker run -v custom_volume:/app_data app-image:latest

L’instruction VOLUME garantit que les chemins critiques sont toujours conservés lorsque les utilisateurs démarrent un nouveau
conteneur. Cependant, il doit être traité avec précaution car les utilisateurs ne s’attendront pas nécessairement à ce comportement.
L’utilisation de VOLUME supprime le choix de créer un conteneur purement éphémère à des fins de débogage ou de test.

f. Interaction avec les volumes Docker :

L’interface de ligne de commande Docker comprend un ensemble de commandes permettant d’interagir avec les volumes de votre
hôte.

Listez tous vos volumes avec docker volume ls :

$ docker volume ls
DRIVER VOLUME NAME
local app_data
local demo_volume

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Vous verrez le nom de chaque volume et le pilote de stockage sur lequel il est sauvegardé. Pour accéder à des informations plus
détaillées sur un volume spécifique, utilisez docker volume inspect à la place :

$ docker volume inspect demo_volume


[
{
"CreatedAt": "2023-03-16T14:05:55Z",
"Driver": "local",

"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/demo_volume/_data",
"Name": "demo_volume",
"Options": null,
"Scope": "local"
}
]

Supprimer un volume avec docker volume rm :


$ docker volume rm demo_volume
demo_volume

Les volumes qui sont actuellement montés sur un conteneur ne peuvent pas être supprimés à moins que vous n’ajoutiez l’option -
f (force) :

$ docker volume rm app_data -f


Pour nettoyer les volumes inutilisés, utilisez docker volume prune. Cette commande supprime les volumes non montés sur au moins
un conteneur. Vous recevrez une confirmation avant la suppression, et le terminal affichera l'espace disque libéré une fois l'opération
terminée.

$ docker network prune

2. Montages de liaison (Bind Mounts) :


Les montages de liaison existent depuis les débuts de Docker. Bien qu'ils offrent des fonctionnalités limitées par rapport aux volumes,
ils peuvent toujours être utiles. Lorsque vous utilisez un montage de liaison, un fichier ou un répertoire sur la machine hôte est monté
dans un conteneur. Le fichier ou le répertoire est référencé par son chemin absolu sur la machine hôte.

Les montages de liaison présentent quelques avantages :

• Le fichier ou le répertoire est disponible sur le système hôte même lorsque le service Docker n'est pas en cours
d'exécution.

• Les montages de liaison peuvent être créés n'importe où sur le système hôte.

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


a. Création et Gestion des Bind Mounts :

Lorsque vous utilisez un bind mount, un fichier ou un répertoire sur la machine hôte est monté dans un conteneur.
Contrairement aux volumes, l'emplacement d'un bind mount sur la machine hôte n'a pas besoin d'être contrôlé par Docker.

Prenons un exemple. Supposons que vous ayez un répertoire sur votre hôte à /home/user/my_directory, et que vous
souhaitez le rendre accessible à votre conteneur à /mnt/my_directory. Vous pouvez utiliser le drapeau -v ou --mount à cet
effet :

En utilisant -v :

docker run -d -v /home/

En utilisant --mount :

Dans les deux exemples, /home/user/my_directory est le chemin du répertoire source sur l'hôte, et /mnt/my_directory est le
chemin où le répertoire est monté dans le conteneur.

La principale différence entre -v et --mount est que la syntaxe --mount est plus verbeuse mais plus claire et plus facile à
utiliser, surtout pour les débutants.

3. Différences et cas d’utilisation pour les volumes et les bind mounts :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Cas d'utilisation des volumes :

• Stockage de données persistantes nécessitant une gestion facile.


• Partage de données entre plusieurs conteneurs.
• Facilité de sauvegarde et de migration des données.

Cas d'utilisation des bind mounts :

• Accès à des données spécifiques de la machine hôte.


• Besoin de contrôle précis sur l'emplacement des données.
• Applications nécessitant des performances optimales en accédant directement aux fichiers de la machine hôte.

4. Montages tmpfs :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Les volumes et les bind mounts vous permettent de partager des fichiers entre la machine hôte et le conteneur afin de persister les
données même après l'arrêt du conteneur.

Si vous utilisez Docker sur Linux, vous avez une troisième option : les montages tmpfs. Lorsque vous créez un conteneur avec un
montage tmpfs, le conteneur peut créer des fichiers en dehors de la couche inscriptible du conteneur.

Contrairement aux volumes et aux bind mounts, un montage tmpfs est temporaire et n'est persisté que dans la mémoire de l'hôte.
Lorsque le conteneur s'arrête, le montage tmpfs est supprimé et les fichiers écrits là ne seront pas persistés.

a. Avantages et Limitations des montages tmpfs :

Avantages :

Temporaire et n'est persisté que dans la mémoire de l'hôte. Idéal pour stocker temporairement des fichiers sensibles.

Limitations :

Impossible de partager des montages tmpfs entre les conteneurs.

Fonctionnalité disponible uniquement si Docker est exécuté sur Linux.

Les permissions sur les montages tmpfs peuvent être réinitialisées après le redémarrage du conteneur.

Choix du drapeau --tmpfs ou --mount :

En général, --mount est plus explicite et verbeux. La plus grande différence est que le drapeau --tmpfs ne prend pas en charge les
options configurables.

--tmpfs : Montage d'un montage tmpfs sans vous permettre de spécifier des options configurables, et peut seulement être utilisé avec
des conteneurs autonomes.

--mount : Composé de plusieurs paires clé-valeur, séparées par des virgules et chaque paire consistant en un tuple <clé>=<valeur>.
La syntaxe --mount est plus verbeuse que --tmpfs.

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Différences de comportement entre --tmpfs et --mount :

Le drapeau --tmpfs ne vous permet pas de spécifier des options configurables. Le drapeau --tmpfs ne peut pas être utilisé avec les
services swarm. Vous devez utiliser --mount.

Utilisation d'un montage tmpfs dans un conteneur :

Pour utiliser un montage tmpfs dans un conteneur, utilisez le drapeau --tmpfs, ou utilisez le drapeau --mount avec type=tmpfs et
des options de destination. Il n'y a pas de source pour les montages tmpfs.

Exemple d'utilisation :

Vérifiez que le montage est bien un montage tmpfs en regardant dans la section Monts de la sortie docker inspect.

Arrêtez et supprimez le conteneur :

Spécifiez des options tmpfs :

Les montages tmpfs permettent deux options de configuration, aucune n'est obligatoire. Si vous devez spécifier ces options, vous
devez utiliser le drapeau --mount, car le drapeau --tmpfs ne les prend pas en charge.

Options :

• tmpfs-size : Taille du montage tmpfs en octets. Illimitée par défaut.


• tmpfs-mode : Mode de fichier du tmpfs en octal. Par exemple, 700 ou 0770. Par défaut, 1777 ou accessible à tous en
écriture.

Exemple d'utilisation :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Cela configure le tmpfs-mode sur 1770, de sorte qu'il ne soit pas accessible en lecture à tous dans le conteneur.

IV. Sécurité Docker :

La sécurité Docker est un aspect crucial à considérer lors du déploiement et de l'utilisation de conteneurs dans un environnement de
production. Voici une expansion sur les quatre domaines principaux de sécurité Docker :

1. Espaces de noms du noyau et cgroups :

Ces fonctionnalités du noyau Linux sont essentielles pour l'isolation des conteneurs. Les espaces de noms permettent de créer des
instances virtuelles d'éléments du système tels que les processus, les réseaux et les systèmes de fichiers, garantissant ainsi que les
processus d'un conteneur ne peuvent pas voir ou affecter ceux d'un autre conteneur ou de l'hôte système. Les cgroups (control
groups) permettent de contrôler et de limiter les ressources système utilisées par les conteneurs, assurant ainsi un partage équitable
des ressources et prévenant les abus qui pourraient entraîner une dégradation des performances ou des pannes du système.

2. Surface d'attaque du démon Docker :

Le démon Docker est le point d'entrée principal pour interagir avec le système de conteneurisation. Il nécessite des privilèges étendus
pour fonctionner correctement, ce qui en fait une cible potentielle pour les attaquants. Il est important de limiter l'accès au démon
Docker uniquement aux utilisateurs de confiance et de sécuriser les points de terminaison de l'API Docker. Cela peut être réalisé en
utilisant des mécanismes d'authentification robustes, en configurant des pare-feu pour restreindre l'accès aux ports Docker, en utilisant
des réseaux privés virtuels (VPN) pour l'accès à distance, et en surveillant régulièrement les journaux d'activité du démon Docker pour
détecter les activités suspectes.

3. Fonctionnalités du noyau Linux :

Docker utilise les fonctionnalités de sécurité du noyau Linux pour renforcer l'isolation des conteneurs. Par exemple, Docker démarre
les conteneurs avec un ensemble restreint de capacités, ce qui limite les privilèges du conteneur et réduit la surface d'attaque
potentielle. De plus, Docker prend en charge des fonctionnalités de sécurité telles que SELinux (Security-Enhanced Linux) et
AppArmor, qui permettent de définir des politiques de sécurité granulaires pour contrôler les actions des processus dans les
conteneurs. En activant ces fonctionnalités, les administrateurs peuvent renforcer la sécurité des conteneurs en restreignant leurs
capacités et en limitant leur accès aux ressources système sensibles.

4. Vérification de la signature Docker Content Trust :

Docker Content Trust (DCT) est une fonctionnalité de sécurité qui garantit l'authenticité et l'intégrité des images Docker en utilisant
des signatures numériques. Lorsque DCT est activé, Docker vérifie la signature numérique de chaque image téléchargée à partir d'un
référentiel Docker avant de l'exécuter, garantissant ainsi que seules les images signées par des entités de confiance peuvent être
exécutées sur les hôtes Docker. Cela réduit le risque d'exécution d'images malveillantes ou altérées et renforce la confiance dans les
sources d'images Docker.

En combinant ces meilleures pratiques de sécurité, les administrateurs peuvent renforcer la sécurité de leurs déploiements Docker et
réduire les risques associés à l'utilisation de conteneurs dans des environnements de production sensibles.

V. Docker Compose :
Docker Compose est un outil permettant de définir et d’exécuter des applications multi-conteneurs. C’est la clé d’une
expérience de développement et de déploiement rationalisée et efficace.

1. Avantages :
Docker-compose présente plusieurs avantages significatifs pour les développeurs :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


1. Facilité de portabilité : Avec Docker Compose, la création et la suppression d'un environnement de développement complet se
fait en quelques commandes simples telles que docker-compose up et docker-compose down. Cette facilité permet aux
développeurs de maintenir leur environnement de développement centralisé et de déployer facilement leurs applications.

2. Simplification des tests : Une fonctionnalité puissante de Docker Compose est sa capacité à exécuter rapidement et de manière
reproductible des tests de bout en bout dans des environnements isolés. Au lieu de tester une application sur son système
d'exploitation local, les développeurs peuvent exécuter des tests dans des environnements similaires à ceux de production, ce qui
augmente la fiabilité des tests.

3. Isolation des environnements : En utilisant des noms de projet, Docker Compose permet d'isoler les environnements les uns des
autres. Cela signifie qu'il est possible d'exécuter plusieurs copies du même environnement sur une seule machine sans qu'ils
n'interfèrent les uns avec les autres, offrant ainsi une meilleure isolation et une gestion plus efficace des projets et services.

2. Cas d’utilisation :

Certains cas d'utilisation courants de Docker-compose incluent :

1. Déploiements sur un seul hôte : Bien que Docker Compose ait été initialement axé sur le développement et les tests, il est
désormais largement utilisé pour déployer et gérer des déploiements de conteneurs complets sur un seul système hôte. Cela
simplifie la gestion des applications dans un environnement de production.

2. Environnements de développement : Docker Compose facilite l'exécution d'applications dans des environnements de
développement isolés. En utilisant un fichier Compose, toutes les dépendances de l'application, telles que les bases de données et les
caches, peuvent être gérées et chaque conteneur peut être créé avec une seule commande, ce qui accélère le processus de
développement.

3. Tests automatisés : Les environnements isolés créés avec Docker Compose sont également utiles pour exécuter des tests
automatisés. Cela permet de reproduire de manière fiable les conditions de production pour tester l'application, ce qui contribue à
garantir la qualité et la fiabilité du logiciel.

En résumé, Docker-compose offre une solution pratique pour la gestion des environnements de développement, des tests et des
déploiements, ce qui en fait un outil essentiel pour les développeurs modernes.

3. Structure du fichier Docker Compose :

La structure du fichier Docker Compose est fondamentale pour la gestion efficace des conteneurs Docker. Voici un résumé concis des
principaux éléments du fichier et des concepts associés :

1. Version du fichier : Définit la version du format du fichier Compose utilisé.

2. Services : Contient la liste des services (conteneurs) à créer et à gérer.

3. Volumes : Définit les volumes utilisés pour stocker les données générées par les conteneurs.

4. Réseaux : Spécifie les réseaux sur lesquels les conteneurs seront connectés.

Un exemple de fichier Compose écris en Yaml peut ressembler à ceci :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Services :
La balise de services contient tous les conteneurs inclus dans le fichier Compose et agit en tant que balise parente.

Image de base (Build)


L’image de base d’un conteneur peut être définie à l’aide d’une image préexistante disponible sur DockerHub ou en créant des
images à l’aide d’un fichier Dockerfile.

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Ports :
L’exposition des ports dans Compose fonctionne de la même manière que dans le fichier Dockerfile. Nous distinguons deux
méthodes différentes d’exposition du port :

Exposition du port aux services liés :

Exposition du port au système hôte :

Commandes :
Les commandes sont utilisées pour exécuter des actions une fois le conteneur démarré et remplacer l’action CMD dans votre fichier
Dockerfile.

Volumes :
Les volumes Docker sont essentiels pour stocker les données utilisées par les conteneurs, et ils offrent plusieurs options de
configuration :

1. Volume Normal : Définit simplement un chemin spécifique, et Docker crée un volume pour celui-ci automatiquement. Par
exemple :

2.Cartographie des Chemins d'Accès : Permet de définir un mappage absolu entre un chemin sur le système hôte et un chemin
dans le conteneur. Par exemple :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


3.Volume Nommé : Ce type de volume a un nom spécifique qui le rend plus facile à utiliser sur plusieurs conteneurs. Utile pour
partager des données entre plusieurs conteneurs et services. Par exemple :

Dépendances :
Les dépendances dans Docker servent à garantir qu'un service particulier est disponible avant le démarrage du conteneur qui en
dépend. Ceci est crucial lorsque vous avez un service qui ne peut pas fonctionner sans un autre, par exemple un CMS (Système de
Gestion de Contenu) sans sa base de données.

Voici un exemple simple avec un CMS Ghost qui dépend de la base de données MySQL pour fonctionner, utilisant la commande
depends_on :

Variables d’environements :
Les variables d’environnement sont cruciales pour importer des données de configuration dans vos applications Docker. Elles sont
souvent utilisées lorsque vous avez des configurations dépendant du système d'exploitation hôte ou d'autres variables susceptibles de
changer.

Il existe plusieurs méthodes pour passer des variables d'environnement dans votre fichier Compose :

1.Définition directe : Vous pouvez définir des variables d'environnement directement dans un conteneur en utilisant la clé
environment. Par exemple :

2.Passage depuis le shell : Vous pouvez également transmettre des variables d'environnement de votre shell directement à un
conteneur en définissant simplement une clé d'environnement dans votre fichier Compose sans lui donner de valeur. Par exemple :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


3.Utilisation d'un fichier .env : Parfois, lorsque plusieurs variables d'environnement sont nécessaires, leur gestion dans le fichier
Compose peut devenir complexe. Dans de tels cas, les fichiers .env sont utiles. Ces fichiers contiennent toutes les variables
d'environnement de votre conteneur et peuvent être ajoutés à l'aide d'une seule ligne dans votre fichier Compose. Par exemple :

Réseaux :
Les réseaux jouent un rôle crucial dans la définition des règles de communication entre les conteneurs, ainsi qu'entre les conteneurs et
le système hôte. Ils permettent de créer des applications qui fonctionnent ensemble de manière sécurisée en fournissant une isolation
complète des conteneurs.

Par défaut, Docker Compose configure un réseau unique pour chaque conteneur. Chaque conteneur rejoint automatiquement le réseau
par défaut, ce qui le rend accessible à la fois par les autres conteneurs du réseau et détectable par le nom d'hôte défini dans le fichier
Compose.

Cependant, vous pouvez spécifier des réseaux personnalisés pour créer des topologies plus complexes et spécifier des pilotes et des
options réseau.

Voici comment spécifier des réseaux personnalisés dans votre fichier Compose :

Chaque service peut ensuite spécifier les réseaux auxquels il doit se connecter en utilisant le mot-clé networks :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


De plus, vous pouvez fournir un nom personnalisé à votre réseau (disponible depuis la version 3.5) :

Si vous avez des réseaux externes préexistants, vous pouvez les utiliser avec Docker Compose en utilisant l'option external :

Enfin, au lieu de définir vos propres réseaux, vous pouvez modifier les paramètres du réseau par défaut en définissant une entrée
avec le nom default sous le mot-clé networks :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Liaison de conteneurs :
Vous pouvez également définir des alias supplémentaires pour vos conteneurs que les services peuvent utiliser pour communiquer
entre eux. Les services d’un même réseau peuvent déjà se joindre les uns aux autres. Les liens ne définissent alors que d’autres noms
sous lesquels le conteneur peut être atteint.

4. CLI :

La CLI de Docker-Compose offre un ensemble de commandes similaire à celui de Docker, mais orienté vers la gestion des architectures
multi-conteneurs définies dans le fichier docker-compose.yml. Voici une liste des commandes les plus couramment utilisées :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


5. Utilisation de plusieurs fichiers :

L'utilisation de plusieurs fichiers Docker Compose vous permet de personnaliser et de modifier votre application pour différents
environnements, tels que le développement, la pré-production et la production, ainsi que pour exécuter des tâches d'administration
ou des tests sur votre application.

Par défaut, Docker Compose lit deux fichiers: docker-compose.yml et docker-compose.override.yml. Le fichier docker-
compose.override.yml est facultatif et peut être utilisé pour stocker des remplacements de services existants ou définir de
nouveaux services.

Pour utiliser plusieurs fichiers de remplacement ou un fichier avec un nom différent, vous pouvez utiliser l'option -f avec la commande
docker-compose up. Le fichier Compose de base doit être spécifié en premier avec l'option -f.

Lorsque vous utilisez plusieurs fichiers de configuration, assurez-vous que les chemins d'accès sont relatifs au fichier Compose de base
spécifié en premier avec l'option -f.

Voici un exemple de ce qui peut être fait en utilisant cette technique:

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Dans cet exemple, nous remplaçons l'ancienne commande npm run dev par la nouvelle npm run start, ce qui démarre votre
site web en mode production au lieu du mode développement.

Lorsque vous utilisez plusieurs valeurs pour des options telles que ports, expose, DNS et tmpfs, Docker Compose concatène les
valeurs au lieu de les remplacer, comme illustré dans l'exemple suivant:

VI. Docker Swarm :


Le mode Swarm est le système d’orchestration intégré de Docker pour la mise à l’échelle des conteneurs sur un cluster de machines
physiques. Plusieurs clients indépendants exécutant Docker Engine mettent en commun leurs ressources, formant un essaim.

La fonctionnalité est fournie avec Docker et comprend tout ce dont vous avez besoin pour déployer des applications sur plusieurs
nœuds. Le mode Essaim dispose d’un modèle de mise à l’échelle déclaratif dans lequel vous indiquez le nombre de réplicas dont vous
avez besoin. Le gestionnaire d’essaim prend des mesures pour faire correspondre le nombre réel de réplicas à votre demande, en
créant et en détruisant des conteneurs si nécessaire.

1. Création d’un essaim avec Docker Swarm :

Pour créer votre propre essaim avec Docker Swarm, suivez ces étapes détaillées :

1. Prérequis : Assurez-vous d'avoir installé Docker sur toutes les machines que vous souhaitez inclure dans votre essaim.
Vous devez avoir le package Docker CE complet.
2. Désignation d'un gestionnaire d'essaim : Choisissez l'une de vos machines pour agir en tant que gestionnaire de
l'essaim. Ce nœud sera responsable de l'orchestration du cluster en émettant des demandes de planification de conteneurs
aux autres nœuds.
• Exécutez la commande docker swarm init sur le gestionnaire pour démarrer le processus de configuration
du cluster.
• Utilisez l'option --advertise-addr pour spécifier l'adresse IP réelle de votre nœud de gestionnaire. Par
exemple : docker swarm init --advertise-addr 192.168.0.1.
• Cette commande générera une commande que vous devrez exécuter sur vos nœuds secondaires pour qu'ils
rejoignent l'essaim.

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


3. Ajout de nœuds au cluster :
• Après avoir exécuté la commande docker swarm init sur le gestionnaire, vous obtiendrez une commande à
exécuter sur les nœuds secondaires pour les rejoindre à l'essaim. Cette commande ressemblera à docker
swarm join.
• Exécutez cette commande sur chaque nœud secondaire que vous souhaitez ajouter à l'essaim. Cela les rendra
éligibles pour héberger des conteneurs.
4. Vérification de l'état du cluster :
• Une fois que vous avez ajouté tous vos nœuds, vous pouvez vérifier l'état du cluster en exécutant la commande
docker info.
• Assurez-vous que la section "Swarm" de la sortie de la commande indique que l'essaim est "active". Vérifiez
également que le nombre de "nœuds" correspond au nombre de nœuds que vous avez ajoutés.

5. Inspection des nœuds :


• Vous pouvez obtenir des détails supplémentaires sur les nœuds individuels en exécutant la commande docker
node ls.
• Cette commande affiche l'ID unique de chaque nœud, son nom d'hôte et son état actuel. Les nœuds avec une
disponibilité "active" et un état "prêt" sont sains et prêts à prendre en charge vos charges de travail. Le nœud
avec le statut "leader" est celui qui a la responsabilité globale du cluster.

En suivant ces étapes, vous pouvez créer votre propre essaim Docker Swarm, composé de plusieurs nœuds, prêt à héberger et à
gérer des conteneurs de manière distribuée.

2. Déploiement d’un conteneur :


Une fois que vos nœuds Docker Swarm sont prêts, vous pouvez déployer des conteneurs dans votre essaim en utilisant le concept de
"services". Voici comment procéder :

1. Création d'un service : Utilisez la commande docker service create pour créer un nouveau service. Vous spécifiez
le nombre de réplicas que vous souhaitez créer à partir de l'image Docker spécifiée.

--rep
Cette commande crée un service nommé "apache" avec 3 réplicas, utilisant l'image Docker du serveur Web Apache
(httpd:latest).

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


2. Gestion des réplicas : Docker Swarm maintiendra en permanence le nombre de réplicas demandées. Si l'un des nœuds du
cluster est mis hors service, les réplicas qu'il hébergeait seront automatiquement reprogrammées sur d'autres nœuds pour
garantir que le nombre spécifié de réplicas est toujours maintenu.
3. Tolérance aux pannes : En déployant plusieurs réplicas du service sur différents nœuds de l'essaim, vous assurez une
certaine résilience contre les arrêts de conteneurs ou les pannes de nœuds. Même si un nœud tombe en panne, les autres
réplicas continueront de servir le trafic.

En résumé, avec Docker Swarm, vous pouvez déployer des services composés de plusieurs réplicas de conteneurs, assurant ainsi une
haute disponibilité et une tolérance aux pannes pour vos applications distribuées.

3. Services de mise à l’échelle

Pour mettre à l'échelle les services dans Docker Swarm, vous avez deux options principales :

1. Utiliser la commande docker service scale : Avec cette commande, vous pouvez spécifier directement le nombre
de réplicas que vous souhaitez pour un service donné.

apache=5
Cette commande mettra à l'échelle le service "apache" pour avoir 5 réplicas. Docker ajoutera deux nouvelles instances de
conteneur pour que le nombre total de réplicas atteigne 5. Les nouvelles instances seront planifiées sur des nœuds
disposant de capacité disponible.
2. Utiliser la commande docker service update : Avec cette commande, vous pouvez mettre à jour divers aspects d'un
service, y compris le nombre de réplicas.

--replicas=5
Cette commande mettra également à l'échelle le service "apache" pour avoir 5 réplicas. Cependant, contrairement à la
commande docker service scale, vous pouvez annuler cette modification en utilisant une commande de rollback
dédiée.

docker service rollback ap


Cette commande rétablira le service à son état précédent, c'est-à-dire avec 3 réplicas. Docker détruira les instances de
conteneur supplémentaires pour ramener le nombre de réplicas actifs à l'état précédent.

En résumé, que vous utilisiez la commande docker service scale ou docker service update, vous pouvez facilement
ajuster le nombre de réplicas de vos services dans Docker Swarm pour répondre aux besoins de votre application. De plus, la
possibilité de rollback avec docker service rollback offre une flexibilité supplémentaire lors de la gestion des mises à l'échelle
des services.

4. Mises à jour continues :


Les mises à jour continues dans Docker Swarm permettent de déployer des services révisés de manière incrémentielle, en contrôlant
le délai entre le déploiement du service révisé sur chaque nœud de l'essaim. Cela offre une souplesse qui permet d'intervenir
rapidement en cas de régressions détectées, car tous les nœuds ne reçoivent pas la nouvelle version simultanément.

Pour activer les mises à jour propagées, vous pouvez utiliser l'indicateur --update-delay, spécifiant le délai entre chaque
déploiement sur les nœuds de l'essaim. Ce délai est exprimé en heures, minutes et secondes. De plus, vous pouvez ajuster le nombre
de tâches mises à jour en une seule opération avec l'indicateur --update-parallelism.

Voici un exemple illustrant comment mettre à l'échelle un service à 10 réplicas, en mettant à jour trois conteneurs à la fois avec un
délai de cinq minutes entre chaque lot :

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


docker service scale --name apache --replicas=10 --update-delay 5m --update-parallelism 3

Cette commande mettra à l'échelle le service "apache" pour avoir 10 réplicas. Elle introduira également un délai de 5 minutes entre
chaque lot de mise à jour, et trois conteneurs seront mis à jour simultanément. Cela permet de contrôler le rythme des mises à jour
et de limiter l'impact en cas de problèmes rencontrés avec la nouvelle version déployée.

5. Gestion des services :


La gestion des services dans Docker Swarm s'effectue à l'aide de nombreuses commandes familières de Docker, préfixées par
docker service. Voici quelques-unes de ces commandes :

• docker service inspect [NOM_DU_SERVICE]: Cette commande permet d'inspecter les données techniques d'un
service spécifique dans l'essaim. Elle fournit des détails sur la configuration du service, les réplicas en cours d'exécution, etc.
• docker service logs [NOM_DU_SERVICE]: Utilisée pour afficher la sortie du journal associée à un service spécifique.
Cela peut être utile pour diagnostiquer les problèmes ou surveiller l'état d'un service.
• docker service ls: Cette commande répertorie tous les services en cours d'exécution dans l'essaim, en fournissant des
informations telles que le nom du service, le nombre de réplicas en cours d'exécution, etc.
• docker service ps [NOM_DU_SERVICE]: Affiche les instances de conteneur individuelles encapsulées par un service
spécifique. Elle fournit des détails sur chaque réplica du service, tels que son ID, son état, etc.
• docker service rm [NOM_DU_SERVICE]: Supprime un service avec tous ses réplicas de l'essaim. Notez qu'il n'y a pas
d'invite de confirmation, donc cette opération est irréversible.

En plus de ces commandes de base, les services disposent d'un ensemble complet d'options de configuration qui peuvent être
appliquées lors de la création du service ou ultérieurement avec la commande docker service update. Ces options incluent la
configuration des variables d'environnement, les commandes de vérification de l'état, les paramètres DNS, les étiquettes et les
conditions de redémarrage. Les instances de conteneur en cours d'exécution ne sont généralement pas détruites lors de la mise à
jour des options du service, sauf si certaines configurations nécessitent une récréation pour prendre effet

6. Exposition des ports réseaux :

L'exposition des ports réseau dans Docker Swarm permet de rendre les services accessibles depuis l'extérieur de l'essaim. Voici
comment cela fonctionne :

1. Exposition des ports avec --publish : Lors de la création d'un service avec docker service create, vous pouvez
utiliser l'option --publish pour exposer un port du conteneur sur un port public spécifique du nœud hôte. Par exemple :
docker service create --name apache --replicas 5 publish published=8080,target=80 nginx:latest :latest
Cette commande expose le port 80 du conteneur NGINX sur le port 8080 de chaque nœud hôte. Ainsi, vous pouvez
accéder à l'instance du service NGINX en utilisant le port 8080 sur n'importe lequel des nœuds de travail de l'essaim.
2. Mode host pour publier des ports sur les nœuds individuels : En ajoutant l'option mode=host, vous pouvez publier
des ports de conteneur sur les nœuds individuels où les tâches sont en cours d'exécution. Cela signifie que le service ne
sera exposé que sur les nœuds qui hébergent réellement les instances du service. Ceci est utile lorsque vous souhaitez
vous connecter à une instance spécifique du service. Par exemple :
docker service create --name apache --replicas 5 --publish mode=host,target=80 nginx:latest

Cette commande expose le port 80 du conteneur NGINX sur le port 80 de chaque nœud individuel qui héberge une
instance du service NGINX.
3. Réseaux superposés : Docker Swarm prend en charge les réseaux superposés, qui fonctionnent de manière similaire aux
réseaux Docker ordinaires. L'ajout d'un service à un réseau superposé permet à ses conteneurs de communiquer avec tous
les autres services du même réseau. Par exemple :

--name service2 --network demo-network my-image

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka


Les tâches créées par service1 et service2 peuvent se rejoindre via le réseau demo-network, ce qui facilite la
communication entre les différents services au sein de l'essaim. Le réseau par défaut appelé ingress fournit également la
fonctionnalité de maillage de routage standard, permettant au trafic d'accéder aux services exposés

Réalisé par Eya Raouine , Fatma Hamada, Wiem Ben Mlouka

Vous aimerez peut-être aussi