Docker

Docker est une plateforme open source de conteneurisation qui permet de développer, déployer et exécuter des applications dans des conteneurs.

Lancé en 2013, Docker a révolutionné le développement de logiciels en introduisant une approche standardisée pour empaqueter les applications et leurs dépendances dans des conteneurs.

Ces conteneurs peuvent être exécutés sur n'importe quel système Linux, Windows ou macOS supportant Docker, offrant ainsi une grande portabilité et facilité de déploiement.

Présentation

Présentation

Docker

Qu'est-ce que Docker ?

Conteneurs : Docker utilise la virtualisation au niveau du système d'exploitation pour exécuter des applications dans des conteneurs. Un conteneur encapsule une application et ses dépendances dans un environnement exécutable, séparé du système hôte. Cela garantit que l'application fonctionne de manière uniforme dans n'importe quel environnement Docker.

image.png

Images Docker : Les conteneurs sont créés à partir d'images Docker, qui sont des modèles immuables contenant le code de l'application, les bibliothèques, les outils, les dépendances, et toutes les autres nécessités pour exécuter une application. Les images sont stockées dans des registres Docker, comme Docker Hub, et peuvent être téléchargées et utilisées pour créer des conteneurs.

Docker Engine : Le moteur Docker est l'application client-serveur qui construit et exécute les conteneurs à l'aide de la technologie de conteneurisation du système d'exploitation. Il fournit l'environnement d'exécution pour les conteneurs et gère leur cycle de vie.

image.png

Dockerfile : Un fichier texte qui contient toutes les commandes qu'un utilisateur peut appeler sur la ligne de commande pour assembler une image Docker. Il simplifie le processus de création d'images en automatisant les étapes.

Environnement Docker

image.png

Utilité de Docker

Consistance et Isolation : Docker assure que votre application fonctionne de la même manière dans tous les environnements, depuis le développement jusqu'à la production, en isolant les applications dans des conteneurs. Cela élimine le problème du "fonctionne sur ma machine".

Rapidité et Légèreté : Les conteneurs Docker partagent le même noyau de système d'exploitation, mais s'exécutent comme des processus isolés. Cela les rend beaucoup plus légers et plus rapides que les machines virtuelles traditionnelles.

Déploiement Facile : Docker permet un déploiement facile et rapide des applications. Avec Docker, les développeurs peuvent facilement empaqueter une application et ses dépendances dans une image Docker, qui peut ensuite être exécutée n'importe où.

Développement, Intégration et Déploiement Continus : Docker facilite les pratiques de CI/CD en permettant aux développeurs de créer et tester des applications dans des environnements conteneurisés, puis de déployer ces conteneurs dans des environnements de production.

Écosystème et Standardisation : Docker possède un vaste écosystème de technologies complémentaires pour le réseau, le stockage, la sécurité, etc. De plus, il a établi un standard dans l'industrie pour la conteneurisation, avec un large support et une communauté active.

Conclusion

Docker offre une solution puissante et flexible pour le développement et le déploiement d'applications. En utilisant la conteneurisation, Docker simplifie le processus de garantie que les applications fonctionneront dans n'importe quel environnement, tout en améliorant l'efficacité et la productivité des développeurs.

Que ce soit pour des applications simples ou des architectures de services complexes, Docker fournit les outils nécessaires pour construire, livrer et gérer des applications modernes avec moins de friction.

Présentation

Un peu d'histoire

L'histoire de Docker est celle d'une innovation qui a révolutionné le monde du développement logiciel et de la conteneurisation. Docker, Inc., l'entreprise derrière cette technologie, a été fondée par Solomon Hykes, Sebastien Pahl, et Kamel Founadi.

Le voyage de Docker a commencé en mars 2013, lorsqu'il a été lancé comme un projet open source lors de la conférence PyCon. 

Les Débuts

2013 : Docker est introduit au public. À l'origine, Docker utilisait la technologie LXC (Linux Containers) pour la virtualisation au niveau du système d'exploitation, permettant aux conteneurs de s'exécuter isolément sur un même hôte Linux. L'idée était de permettre aux développeurs d'empaqueter une application et ses dépendances dans un conteneur virtuel qui pourrait être exécuté sur n'importe quel système Linux.

Croissance Rapide et Adoption

2014-2015 : Docker gagne rapidement en popularité dans la communauté du développement logiciel. Son approche innovante de la conteneurisation simplifie le déploiement d'applications, ce qui attire l'attention des développeurs et des entreprises du monde entier. Docker, Inc. reçoit d'importants investissements, ce qui lui permet d'étendre son équipe et d'accélérer le développement de nouvelles fonctionnalités.

Évolution Technique

2014 : Docker introduit sa propre interface pour la gestion des conteneurs, appelée libcontainer, remplaçant LXC pour offrir une meilleure portabilité et intégration. Cette période voit également le lancement de Docker Hub, un service de registre d'images Docker qui facilite le partage et la distribution d'images conteneurisées.

Expansion de l'Écosystème

2015 et au-delà : L'écosystème Docker s'étend avec le développement d'outils complémentaires tels que Docker Compose pour la définition et l'exécution d'applications multi-conteneurs, Docker Swarm pour l'orchestration de conteneurs, et l'introduction de Docker for Windows et Docker for Mac, améliorant l'expérience des développeurs sur ces plateformes.

Docker et l'Orchestration de Conteneurs

2017 : Docker annonce le support natif de Kubernetes, l'outil d'orchestration de conteneurs open source de Google, dans Docker Enterprise. Cette décision reflète la popularité croissante de Kubernetes dans la gestion de déploiements conteneurisés à grande échelle et marque un moment important dans l'histoire de Docker, soulignant sa volonté de s'adapter aux besoins de l'industrie.

Changements Organisationnels

2019-2020 : Docker, Inc. restructure ses activités pour se concentrer davantage sur les développeurs et les petites équipes, vendant sa division entreprise à Mirantis, une entreprise de services cloud. Cette période marque également un recentrage sur le développement de Docker Desktop et Docker Hub, ainsi que sur l'amélioration de l'expérience de développement logiciel avec Docker.

L'Impact de Docker

Docker a non seulement simplifié le développement et le déploiement d'applications mais a également joué un rôle clé dans la popularisation de la conteneurisation et des architectures microservices. En rendant les conteneurs accessibles et faciles à utiliser, Docker a permis aux équipes de développement de créer des applications plus modulaires, évolutives et faciles à gérer.

En résumé, l'histoire de Docker est marquée par une croissance rapide, une innovation continue et une capacité à façonner et à répondre aux tendances de l'industrie du logiciel. Malgré les défis et les changements dans son parcours, Docker reste une pierre angulaire dans l'écosystème du développement logiciel moderne, facilitant la vie des développeurs et influençant la manière dont les applications sont construites, déployées et gérées à l'échelle mondiale.

Présentation

Caractéristiques

Conteneurisation et Isolation

Développement et Déploiement Simplifiés

Écosystème et Portabilité

Gestion des Images et des Conteneurs

Sécurité

Communauté et Support

En résumé, Docker a transformé le paysage du développement logiciel en offrant une solution efficace pour la conteneurisation des applications, garantissant leur cohérence à travers différents environnements de développement, de test et de production.

Sa facilité d'utilisation, sa portabilité, et son vaste écosystème en font un outil indispensable pour les développeurs, les administrateurs système et les équipes DevOps cherchant à améliorer l'efficacité et la fiabilité de leurs processus de développement et de déploiement d'applications.

Présentation

YAML

Qu'est-ce que YAML ?

YAML, qui signifie "YAML Ain't Markup Language" (une récursivité pour "YAML n'est pas un langage de balisage"), est un format de sérialisation de données lisible par l'homme, souvent utilisé pour écrire des fichiers de configuration ou pour échanger des données entre langages de programmation.

Sa simplicité et sa lisibilité ont fait de YAML un choix populaire pour de nombreux outils de développement, déploiement, et automatisation, y compris Docker Compose, les configurations de CI/CD comme GitHub Actions ou GitLab CI, et les systèmes de gestion de configuration comme Ansible.

Caractéristiques 

Lisibilité : YAML est conçu pour être facile à lire et à comprendre par les humains, utilisant une indentation pour représenter la structure des données (semblable à Python).

Polyvalence : Il peut représenter les structures de données communes, telles que les scalaires (p. ex., chaînes, nombres), les listes (arrays), et les dictionnaires (objets), ce qui le rend très flexible pour différents cas d'usage.

Compatibilité : YAML est interopérable avec différents langages de programmation, permettant de sérialiser et désérialiser facilement des structures de données complexes.

Utilité de YAML

Fichiers de Configuration : Sa lisibilité et sa simplicité font de YAML un choix idéal pour les fichiers de configuration, où il est important que les configurations soient compréhensibles et modifiables facilement.

Définition d'Infrastructures et de Déploiements : Des outils comme Docker Compose et Kubernetes utilisent YAML pour permettre aux développeurs et aux opérateurs de définir des infrastructures de conteneurs, des réseaux, des volumes, et des politiques de déploiement de manière déclarative.

Automatisation et Orchestration : YAML est largement utilisé dans des systèmes d'automatisation et d'orchestration comme Ansible pour décrire les tâches d'automatisation, les configurations système, et les déploiements d'applications.

CI/CD : Les pipelines d'intégration et de déploiement continus sont souvent configurés via des fichiers YAML, permettant de définir les étapes du pipeline, les environnements, et les scripts d'exécution de manière claire et structurée.

Syntaxe de base de YAML

Voici quelques éléments clés de la syntaxe YAML :

Indentation : YAML utilise l'indentation pour représenter la hiérarchie des données. L'indentation doit être faite avec des espaces, pas avec des tabulations.

Listes : Les éléments d'une liste sont précédés d'un tiret (-).

Dictionnaires (Maps) : Les dictionnaires sont des ensembles de paires clé-valeur, où chaque paire est séparée par deux points (:).

Commentaires : Les commentaires commencent par un dièse (#) et s'étendent jusqu'à la fin de la ligne.

Exemple d'un docker-compose.yml

version: '3.8'  # Spécifie la version de la syntaxe Docker Compose utilisée

services:  # Définit les services, c'est-à-dire les conteneurs à exécuter
  web:  # Nom du service web
    image: nginx:latest  # Utilise l'image Docker officielle de Nginx
    ports:
      - "80:80"  # Redirige le port 80 du conteneur vers le port 80 de l'hôte
    volumes:
      - ./html:/usr/share/nginx/html  # Montage d'un volume pour personnaliser le contenu servi par Nginx
    depends_on:
      - db  # Indique que le service web dépend de la base de données et doit attendre son démarrage

  db:  # Nom du service de base de données
    image: postgres:13  # Utilise l'image Docker officielle de PostgreSQL version 13
    volumes:
      - db_data:/var/lib/postgresql/data  # Utilise un volume nommé pour la persistance des données de la base de données
    environment:  # Définit les variables d'environnement pour la configuration de la base de données
      POSTGRES_DB: exampledb  # Nom de la base de données à créer
      POSTGRES_USER: exampleuser  # Nom de l'utilisateur de la base de données
      POSTGRES_PASSWORD: examplepass  # Mot de passe de l'utilisateur de la base de données

volumes:  # Déclare les volumes utilisés par les services
  db_data:  # Nom du volume pour la persistance des données PostgreSQL

Dans cet exemple, deux services sont définis :

  1. Service web (web) :

    • Utilise l'image nginx:latest pour créer un conteneur Nginx servant de serveur web.
    • Les requêtes sur le port 80 de l'hôte sont redirigées vers le port 80 du conteneur, permettant d'accéder au serveur web depuis l'extérieur du conteneur.
    • Un volume est monté pour personnaliser le contenu servi par Nginx, permettant d'ajouter ou de modifier les fichiers HTML dans le dossier ./html de l'hôte.
  2. Service de base de données (db) :

    • Utilise l'image postgres:13 pour créer un conteneur PostgreSQL servant de base de données.
    • Les données de la base de données sont stockées dans un volume nommé db_data, assurant leur persistance indépendamment du cycle de vie du conteneur.
    • Les variables d'environnement sont utilisées pour configurer la base de données, y compris le nom de la base de données, l'utilisateur et le mot de passe.

Ce fichier docker-compose.yml montre comment utiliser Docker Compose pour configurer et lier ensemble une application web simple et un service de base de données, illustrant l'utilité des volumes, des ports, des dépendances entre services, et des variables d'environnement dans la configuration de services Docker.

Présentation

Dockerfile

Qu'est-ce qu'un Dockerfile ?

Un Dockerfile est un fichier texte qui contient toutes les commandes qu'un utilisateur peut appeler sur la ligne de commande pour assembler une image Docker. Il sert de script pour automatiser le processus de création d'images Docker, en définissant un ensemble d'étapes successives qui doivent être exécutées pour construire l'image finale. 

Structure d'un Dockerfile

Un Dockerfile typique inclut une série de directives, chacune spécifiant une partie de l'image Docker et comment elle doit être construite.

Voici quelques-unes des directives les plus courantes :

Exemple :

# Utilise une image de base officielle de Python 3.8
FROM python:3.8-slim

# Définit le répertoire de travail dans le conteneur
WORKDIR /app

# Copie les fichiers requirements.txt dans le conteneur pour installer les dépendances
COPY requirements.txt ./

# Installe les dépendances Python spécifiées dans requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Copie le reste du code source de l'application dans le conteneur
COPY . .

# Expose le port 5000 sur lequel l'application va s'exécuter
EXPOSE 5000

# Commande exécutée au démarrage du conteneur pour lancer l'application
CMD ["python", "./app.py"]

Dans cet exemple, le Dockerfile crée une image pour une application Python simple :

Ce Dockerfile illustre comment préparer un environnement pour une application Python, en installant des dépendances et en configurant l'application pour qu'elle soit prête à être exécutée dans un conteneur Docker.

Présentation

Image Docker

Qu'est-ce qu'une Image Docker ?

Les images Docker sont des modèles immuables utilisés pour créer des conteneurs Docker. Elles constituent la base de la conteneurisation avec Docker, permettant de paquetiser le code, les outils, les bibliothèques, les dépendances, et tous les fichiers nécessaires à l'exécution d'une application dans un environnement isolé. 

Les images Docker sont essentielles pour assurer la portabilité, la reproductibilité et la scalabilité des applications dans divers environnements de déploiement.

Caractéristiques des Images Docker

Création et Utilisation des Images Docker

Création d'une Image

La création d'une image Docker commence généralement par l'écriture d'un Dockerfile, qui définit les étapes nécessaires pour assembler l'image, incluant la base à utiliser, les fichiers à copier, les commandes à exécuter, etc. Une fois le Dockerfile prêt, une image peut être créée en exécutant la commande :

docker build -t monimage:tag .

Cette commande construit une nouvelle image Docker à partir du Dockerfile dans le répertoire courant, en lui attribuant un nom (monimage) et un tag (tag).

Utilisation d'une Image

Pour exécuter un conteneur basé sur une image Docker, on utilise la commande :

docker run -d --name monconteneur monimage:tag

Cela crée et démarre un nouveau conteneur nommé monconteneur à partir de l'image monimage:tag. Le conteneur s'exécute en arrière-plan (-d pour "detached").

Gestion des Images Docker

Les images Docker peuvent être listées, modifiées, supprimées, et partagées à travers des commandes Docker. Par exemple :

Exemple création d'une image docker :

Dockerfile

# Définir l'image de base. Ici, on utilise l'image officielle Python 3.8 en version "slim" pour une image finale plus légère.
FROM python:3.8-slim

# Définir le répertoire de travail dans le conteneur. Toutes les commandes qui suivent seront exécutées dans ce répertoire.
WORKDIR /app

# Copier le fichier requirements.txt dans le répertoire de travail (/app) du conteneur. Ce fichier liste les dépendances de l'application.
COPY requirements.txt .

# Installer les dépendances Python listées dans requirements.txt. L'option --no-cache-dir est utilisée pour minimiser la taille de l'image.
RUN pip install --no-cache-dir -r requirements.txt

# Copier les autres fichiers de l'application du répertoire courant sur l'hôte dans le répertoire de travail du conteneur.
COPY . .

# Exposer le port sur lequel l'application va s'exécuter. Cela ne publie pas le port, mais sert de documentation entre celui qui déploie l'image et l'image elle-même.
EXPOSE 5000

# Définir la commande par défaut pour exécuter l'application. Ici, on lance l'application Flask en utilisant le serveur de développement de Flask.
CMD ["flask", "run", "--host=0.0.0.0"]

Pour cet exemple, supposons que vous avez une application Flask simple. Le fichier requirements.txt pourrait ressembler à ceci :

Flask==1.1.2

Et une application Flask de base, app.py, pourrait ressembler à :

Après avoir créé votre Dockerfile et placé requirements.txt et app.py dans le même dossier, vous pouvez construire l'image Docker avec la commande suivante (n'oubliez pas de remplacer <tag> par le nom et le tag de votre choix) :

docker build -t monapplicationflask:<tag> .

Cette commande construira une image Docker basée sur le Dockerfile du répertoire courant, en téléchargeant l'image Python, en installant les dépendances, et en copiant les fichiers de l'application dans l'image.

Pour exécuter un conteneur basé sur votre image nouvellement créée, utilisez :

docker run -p 5000:5000 monapplicationflask:<tag>

Cela démarrera un conteneur de votre image monapplicationflask, mappant le port 5000 du conteneur au port 5000 de votre hôte, permettant ainsi d'accéder à votre application Flask en naviguant vers http://localhost:5000 dans votre navigateur.

Conclusion

Les images Docker sont au cœur de la plateforme Docker, permettant de créer des conteneurs qui exécutent des applications de manière isolée et reproductible.

Grâce à leur architecture en couches, leur immutabilité, et la facilité avec laquelle elles peuvent être partagées et stockées, les images Docker simplifient le déploiement et la gestion des applications dans des environnements de développement, de test, et de production.

Présentation

Docker Hub

Qu'est-ce que Docker Hub ?

Docker Hub est une plateforme de service de registre gérée qui permet aux développeurs et aux équipes DevOps de partager et de distribuer des conteneurs Docker.

C'est un service centralisé pour trouver et partager des images Docker, offrant à la fois des répertoires publics et privés pour gérer et stocker des images Docker. Voici un aperçu plus détaillé du rôle et des fonctionnalités de Docker Hub.

image.png

 

Rôle principal de Docker Hub

Fonctionnalités clés de Docker Hub

En images 

Sur Docker Hub, vous avez la flexibilité de contrôler l'accès à vos images Docker en choisissant de rendre vos dépôts publics ou privés. 

Cette fonctionnalité vous permet de partager librement vos images avec la communauté ou de les réserver exclusivement pour votre usage personnel ou celui de votre équipe.

 

image.png

 

image.png


Dans cet exemple, je vais vous montrer comment télécharger une image depuis un dépôt privé en exécutant une commande `docker pull`, tout en m'authentifiant avec mes identifiants.


image.png


image.png

 

Pour afficher la liste des images Docker téléchargées sur votre système, utilisez la commande `docker images` ou son alias `docker image ls`.

image.png


Vous pouvez également visualiser les images Docker téléchargées sur votre système via une interface graphique en utilisant Portainer. Après avoir configuré Portainer, accédez à la section "Images" pour voir la liste des images.

 

image.png

image.png

Site web : Docker Hub

Conclusion

Docker Hub joue un rôle central dans l'écosystème Docker en servant de hub pour la distribution, le partage, et la gestion des images Docker.

Que vous soyez un développeur travaillant sur un projet open-source, une petite équipe développant une application, ou une grande entreprise déployant des services à l'échelle, Docker Hub offre les outils et les services nécessaires pour faciliter le travail avec des conteneurs Docker.

Présentation

Docker Compose

Qu'est-ce que Docker Compose ?

Docker Compose est un outil pour définir et exécuter des applications multi-conteneurs Docker. Il permet aux développeurs de déclarer, dans un fichier YAML, l'ensemble des services, réseaux et volumes nécessaires à leur application, simplifiant ainsi le processus de configuration et d'exécution de l'application dans un environnement Docker. Docker Compose se concentre sur l'automatisation du déploiement d'applications composées de multiples conteneurs qui doivent travailler ensemble de manière cohérente. 

Fichier docker-compose.yml : Au cœur de Docker Compose se trouve le fichier docker-compose.yml, qui décrit les services qui composent l'application, y compris leur configuration, les réseaux personnalisés, et les volumes. Ce fichier YAML permet une définition déclarative de toute l'infrastructure nécessaire à l'application, rendant le déploiement reproductible et facile à comprendre.

Services : Dans le contexte de Docker Compose, un service est une application ou un processus exécuté dans un conteneur. Un fichier Compose peut définir plusieurs services, et Docker Compose se charge de les démarrer et de les lier ensemble en fonction des configurations définies.

Réseaux : Docker Compose permet de définir des réseaux personnalisés pour faciliter la communication entre les conteneurs. Cela est particulièrement utile pour segmenter et gérer le trafic entre les services d'une application.

Volumes : Pour la persistance des données, Docker Compose permet de définir des volumes qui peuvent être montés dans les conteneurs, assurant que les données importantes ne sont pas perdues lors de l'arrêt ou de la destruction des conteneurs.

image.png

Utilité de Docker Compose

Simplicité et Rapidité de Déploiement : Docker Compose simplifie le déploiement d'applications composées de plusieurs services conteneurisés. Avec un seul fichier de configuration et quelques commandes, les développeurs peuvent lancer toute une application, rendant le processus rapide et reproductible.

Développement Local et Tests : Docker Compose est idéal pour le développement et les tests locaux, permettant aux développeurs de créer un environnement qui imite de près l'environnement de production, mais sur leur machine locale.

Intégration et Déploiement Continus : Les fichiers Compose peuvent être utilisés dans des pipelines CI/CD pour automatiser le déploiement d'applications. Cela facilite la mise en place de pratiques d'intégration et de déploiement continus.

Isolation des Environnements : Docker Compose permet de créer des environnements isolés pour différentes instances d'une application ou pour différents projets, évitant ainsi les conflits entre eux.

Gestion Facile des Dépendances : En définissant explicitement les services et leurs relations dans le fichier docker-compose.yml, Docker Compose gère automatiquement les dépendances entre les conteneurs, s'assurant que les services sont démarrés dans l'ordre correct.

Conclusion

Docker Compose est un outil essentiel pour les développeurs travaillant avec des applications Dockerisées, en particulier celles qui s'appuient sur plusieurs services interdépendants. Il offre une approche simplifiée et automatisée pour la gestion des applications conteneurisées, rendant le développement, les tests et le déploiement plus rapides et plus fiables.

Avec Docker Compose, les complexités de la configuration des services, de la gestion des réseaux et de la persistance des données sont réduites, permettant aux développeurs de se concentrer sur le développement de l'application elle-même.

Présentation

Docker Swarm

Qu'est-ce que Docker Swarm ?

Docker Swarm est une fonctionnalité de clustering et d'orchestration intégrée dans Docker Engine. Elle permet de connecter plusieurs machines hôtes Docker, appelées nœuds, pour travailler ensemble comme un seul et même cluster. Grâce à Docker Swarm, vous pouvez déployer, mettre à l'échelle et gérer des conteneurs à travers plusieurs nœuds Docker de manière transparente.

Qu'est-ce qu'un cluster Docker Swarm ?

Cluster : Un groupe de machines qui exécutent Docker et sont configurées pour joindre ensemble leurs ressources. Ces machines peuvent être des serveurs physiques, des VMs, ou une combinaison des deux.

Nœuds : Chaque machine dans un Swarm est appelée un "nœud", qui peut être un "manager" ou un "worker". Les nœuds "managers" gèrent la coordination du cluster et les tâches administratives, tandis que les nœuds "workers" exécutent les conteneurs et les applications.

Services et Tâches : Dans un Swarm, vous déployez des applications sous forme de "services", qui définissent l'état désiré de l'application. Un service est essentiellement une description de la tâche à exécuter, et le Swarm s'assure que le nombre désigné de répliques de cette tâche (conteneurs) est maintenu dans le cluster.

 

image.png

 

Utilité de Docker Swarm

Haute Disponibilité : Docker Swarm assure la haute disponibilité des applications en répliquant les conteneurs sur plusieurs nœuds du cluster. Si un nœud tombe en panne, Swarm peut automatiquement redémarrer les conteneurs sur d'autres nœuds disponibles, assurant ainsi que le service reste disponible.

Équilibrage de Charge : Swarm offre des fonctionnalités d'équilibrage de charge, permettant de distribuer les requêtes entrantes entre les différentes instances (répliques) d'un service, améliorant la performance et la disponibilité de l'application.

Mise à l'échelle : Avec Docker Swarm, vous pouvez facilement mettre à l'échelle les services en augmentant ou en diminuant le nombre de répliques d'un conteneur, sans interruption de service. Cela permet d'adapter les ressources utilisées en fonction de la demande.

Déploiement et Mise à Jour Sans Interruption : Swarm permet de déployer et de mettre à jour des applications sans temps d'arrêt grâce aux mises à jour progressives (rolling updates). Vous pouvez spécifier comment et quand les conteneurs sont mis à jour, en s'assurant que le service reste disponible pendant la mise à jour.

Découverte de Service et Réseau Overlay : Swarm fournit un réseau overlay qui connecte les conteneurs sur différents nœuds, permettant la communication inter-conteneurs comme s'ils étaient sur la même machine. La découverte de service intégrée permet aux conteneurs de se localiser et de communiquer par leurs noms de service.

Présentation

Exemples

Dans ce scénario, notre client souhaite développer un site internet utilisant WordPress.

Pour stocker les données du site, nous utiliserons un conteneur MySQL. Le client aura la flexibilité de démarrer des conteneurs individuellement ou de créer une stack regroupant plusieurs conteneurs interconnectés, selon ses besoins spécifiques.

Sans-titre-2024-03-11-1845.png

Dans ce deuxième scénario, pour réduire les risques de panne, le client met en place un cluster Docker. Il déploie ensuite un "service", un mécanisme qui facilite la réplication de conteneurs en appliquant diverses contraintes adaptées aux exigences du projet.

L'objectif est de minimiser les risques de défaillance ou d'interruption du service de l'application. Cette configuration offre aussi l'avantage de simplifier les mises à jour de l'application sans nécessiter d'arrêts de production, garantissant ainsi une continuité du service.

Sans-titre-2024-03-11-184445.png

Dans ce troisième scénario, afin d'augmenter la scalabilité et la résilience du service, les données persistantes, telles que les fichiers de configuration de WordPress et sa base de données, ne sont plus hébergées localement sur chaque nœud du cluster.

À la place, elles sont centralisées sur une autre machine virtuelle en utilisant le protocole NFS (Network File System). Cette approche réduit les contraintes associées au redéploiement d'un service et facilite grandement la gestion des sauvegardes, contribuant ainsi à une meilleure efficacité et fiabilité du système.

Sans-titre-2024-03-11-18fgyujhh45.png

 

Dans ce quatrième scénario, le client décide d'ajouter une deuxième machine virtuelle spécifiquement destinée au stockage des données pour renforcer la résilience et la disponibilité du système. 

1. Stockage Dédié : Une deuxième machine virtuelle est introduite pour servir exclusivement de stockage des données. Cette approche sépare le traitement des données de leur stockage, ce qui facilite la gestion et la sécurisation des données.

2. Réplication des Données : Les données présentes sur le premier espace de stockage (data store 1) sont répliquées sur le second espace de stockage (data store 2) en utilisant `RSYNC`, un outil de synchronisation de fichiers. Cette réplication assure que les deux emplacements de stockage contiennent des copies identiques des données, ce qui augmente la sécurité des données en fournissant une redondance en cas de défaillance d'un des systèmes de stockage.

3. Node de Secours : Le troisième nœud du cluster est configuré comme un nœud de secours. Ce nœud peut prendre le relais en cas de défaillance des nœuds principaux, assurant ainsi la continuité du service sans interruption majeure. Ce nœud de secours peut également être intégré dans un Plan de Continuité d'Activité (PCA), garantissant que les services peuvent être rapidement restaurés ou maintenus en cas de sinistre ou de panne critique.

Cette configuration avancée permet non seulement d'assurer la disponibilité et la sécurité des données mais aussi d'améliorer la capacité du système à se rétablir rapidement après un incident.

En séparant les rôles de traitement et de stockage des données et en mettant en place une stratégie de réplication et de secours, le client crée un environnement robuste, capable de supporter des conditions d'utilisation variées et des incidents inattendus sans compromettre l'intégrité des données ou la disponibilité du service.

 

Sans-titre-2024-03-11-1XXX.png


Installation & Configuration

Installation & Configuration

Installation Docker Engine & Docker Compose

Prérequis

Avant de commencer, assurez-vous que votre système répond aux exigences suivantes :

  1. Système d'exploitation: Une VM Debian.
  2. Droits d'administrateur: Vous devez avoir accès à un compte utilisateur avec des droits sudo pour exécuter des commandes d'installation et de configuration.
  3. Connexion Internet: Pour télécharger Docker et ses dépendances.
  4. Espace disque et mémoire: Assurez vous d'avoir suffisamment d'espace disque et de mémoire pour Docker et les conteneurs que vous prévoyez d'exécuter.

Installation de Docker Engine sur Debian

Étape 1: Mise à jour du système

Commencez par mettre à jour votre liste de paquets et mettez à niveau les paquets existants pour vous assurer que votre système est à jour.

sudo apt-get update
sudo apt-get upgrade -y

Étape 2: Installer les paquets nécessaires

Avant d'installer Docker Engine pour la première fois sur une nouvelle machine hôte, vous devez configurer le dépôt apt de Docker. Ensuite, vous pourrez installer et mettre à jour Docker à partir de ce dépôt.


# Add Docker's official GPG key:
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

Étape 3: Installation de docker

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Pour vérifier son fonctionnement :

sudo docker run hello-world

Pour désinstaller docker :

sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

Si l'installation s'est bien déroulée, vous verrez un message indiquant que votre installation de Docker fonctionne correctement.

Post-installation (facultatif mais recommandé)

Configurer Docker pour l'utiliser sans sudo (facultatif)

Par défaut, l'exécution des commandes Docker nécessite des privilèges administratifs (sudo).

Pour éviter d'avoir à taper sudo chaque fois que vous utilisez la commande docker, ajoutez votre utilisateur au groupe Docker.

sudo usermod -aG docker $USER

Après avoir exécuté cette commande, vous devrez vous déconnecter et vous reconnecter pour que les modifications prennent effet.

Démarrer Docker au démarrage

Pour vous assurer que Docker démarre automatiquement à chaque démarrage du système :

sudo systemctl enable docker

Source : Docker Official

Descriptif

Ces commandes, exécutées dans l'ordre, préparent un système Debian pour une installation sécurisée et vérifiée de Docker Engine directement depuis les sources officielles de Docker, assurant ainsi que vous obtenez la version la plus récente et authentique de Docker.

Ajout de la clé GPG officielle de Docker

sudo apt-get update :  Cette commande met à jour l'index des paquets disponibles et leurs versions, mais sans installer ou mettre à jour aucun paquet. Cela assure que vous avez les dernières informations sur les paquets disponibles avant d'installer des dépendances.

sudo apt-get install ca-certificates curl :  Installe ca-certificates et curl sur votre système.

ca-certificates :  Ce paquet est nécessaire pour que votre système puisse vérifier les certificats SSL des sites web (ce qui est crucial pour des téléchargements sécurisés).

curl :  Un outil en ligne de commande utilisé pour transférer des données avec des URL. Ici, il sert à télécharger la clé GPG de Docker depuis Internet.

sudo install -m 0755 -d /etc/apt/keyrings : Crée le répertoire /etc/apt/keyrings s'il n'existe pas déjà, avec des permissions telles que le propriétaire (root) peut lire, écrire et exécuter, tandis que les membres du groupe et les autres utilisateurs peuvent seulement lire et exécuter. Ce répertoire est utilisé pour stocker les clés GPG de confiance pour APT.

sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc : Télécharge la clé GPG officielle de Docker et la sauvegarde dans le fichier /etc/apt/keyrings/docker.asc. L'option -fsSL rend curl silencieux sauf en cas d'erreur, suit les redirections, et permet le protocole SSL.

sudo chmod a+r /etc/apt/keyrings/docker.asc : Modifie les permissions du fichier de clé GPG pour permettre à tous les utilisateurs de le lire. Cela est nécessaire pour que APT puisse vérifier les paquets signés par cette clé.

Ajout du dépôt Docker aux sources APT

La commande echo suivie de sudo tee /etc/apt/sources.list.d/docker.list > /dev/null : Cette commande complexe ajoute la ligne de dépôt officiel de Docker aux sources APT du système.

echo génère la ligne de texte qui définit le dépôt.

Le dépôt est configuré pour utiliser l'architecture système (arch=$(dpkg --print-architecture)), signé par la clé précédemment téléchargée (signed-by=/etc/apt/keyrings/docker.asc), pointe vers le dépôt Docker (https://download.docker.com/linux/debian), et spécifie la version du système d'exploitation ($(. /etc/os-release && echo "$VERSION_CODENAME")) et le canal stable.

sudo tee /etc/apt/sources.list.d/docker.list > /dev/null écrit la sortie de echo dans le fichier /etc/apt/sources.list.d/docker.list (créant ou écrasant le fichier si nécessaire), avec les droits d'administration. L'envoi de la sortie vers /dev/null empêche l'affichage de la ligne dans la console.

sudo apt-get update : Exécute de nouveau apt-get update pour que APT prenne en compte le nouveau dépôt ajouté. Après cette commande, le système est prêt à installer Docker Engine depuis le dépôt officiel ajouté.

Installation de Docker & Docker Compose

docker-ce : "Docker Community Edition" est le logiciel de base de Docker qui permet de créer, déployer et gérer des conteneurs. C'est le cœur de Docker, fournissant l'environnement d'exécution des conteneurs.

docker-ce-cli : "Docker Community Edition Command Line Interface" est l'interface en ligne de commande pour Docker. Elle permet aux utilisateurs d'interagir avec Docker et de gérer les conteneurs Docker à travers une variété de commandes.

containerd.io : Containerd est un environnement d'exécution de conteneurs disponible sous forme de daemon pour Linux et Windows. Il s'agit d'un composant de bas niveau pour la gestion du cycle de vie des conteneurs, responsable de l'exécution des conteneurs, de la gestion de leur stockage d'images, de la mise en réseau, et plus encore. Docker utilise Containerd sous le capot.

docker-buildx-plugin : Docker Buildx est un plugin Docker qui fournit des fonctionnalités de build avec BuildKit, permettant la construction de l'image Docker avec un support amélioré pour la multi-architecture, le caching, et plus encore. Cela permet de créer des images Docker de manière plus efficace et avancée, y compris la possibilité de créer simultanément des images pour différentes architectures à partir d'un seul poste de commande.

docker-compose-plugin : Docker Compose est un outil pour définir et gérer des applications multi-conteneurs avec Docker. Le plugin docker-compose-plugin intègre Docker Compose directement dans l'écosystème Docker, permettant aux utilisateurs de définir et d'exécuter des applications multi-conteneurs à l'aide de fichiers YAML.

Cela simplifie le processus de configuration, d'exécution, et de gestion des applications conteneurisées en utilisant une syntaxe déclarative.

Installation & Configuration

Création d'un Cluster Docker Swarm

Créer un cluster Docker Swarm est un processus direct qui peut être accompli en quelques étapes.

Ce tutoriel vous guidera à travers la création d'un cluster Swarm, depuis les prérequis jusqu'à la promotion de nœuds en tant que managers ou workers, en passant par la configuration initiale.

Prérequis

  1. Machines Virtuelles (VMs) ou Serveurs Physiques : Vous aurez besoin d'au moins une machine pour agir en tant que manager du Swarm et de deux autres machines comme nœuds workers. Trois machines sont un bon point de départ pour un environnement de production minimal pour la tolérance aux pannes. Ces machines doivent être configurées avec Docker.
  2. Docker Installé : Chaque machine doit avoir Docker installé. Vous pouvez trouver les instructions d'installation sur le site officiel de Docker pour diverses distributions Linux, Windows, et macOS.
  3. Réseau : Les machines doivent être capables de communiquer entre elles à travers les ports utilisés par Docker Swarm (TCP port 2377 pour la communication entre les managers, et TCP et UDP ports 7946, UDP port 4789 pour le trafic overlay network).
Étape 1 : Initialisation du Swarm

Choisissez une de vos machines pour être le manager initial du Swarm. Connectez-vous à cette machine, puis exécutez :

docker swarm init --advertise-addr <MANAGER-IP>

Remplacez <MANAGER-IP> par l'adresse IP de la machine que vous souhaitez utiliser comme manager. Cette commande initialise un nouveau Swarm et configure la machine actuelle en tant que manager du Swarm.

Étape 2 : Ajout de Nœuds au Swarm

Après avoir initialisé le Swarm, vous obtiendrez un message contenant un token pour joindre d'autres nœuds au Swarm en tant que workers.

Sur chaque machine destinée à être un worker, exécutez la commande fournie, qui ressemblera à ceci :

docker swarm join --token SWMTKN-1-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx <MANAGER-IP>:2377

Étape 3 : Vérification de l'État du Swarm

Pour vérifier que les nœuds ont bien rejoint le Swarm, exécutez la commande suivante sur le manager :

docker node ls

Cela affichera la liste de tous les nœuds dans le Swarm, y compris leur rôle (manager ou worker).

Exemple

root@EVA-00:~# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
1p14w09a3a1ysibjegktesxwr *   EVA-00     Ready     Active         Reachable        20.10.24+dfsg1
7tnbhyvlbmuv27dnk8d3oqf9b     EVA-01     Ready     Active         Leader           20.10.24+dfsg1
5mxg7b4mnkjd3z8vcwo9ygsdy     EVA-02     Ready     Active                          20.10.24+dfsg1

Étape 4 : Promotion d'un Nœud Worker en Manager

Si vous souhaitez augmenter la tolérance aux pannes de votre cluster Swarm en ajoutant un manager supplémentaire, vous pouvez promouvoir un nœud worker. Sur un nœud manager, exécutez :

docker node promote <WORKER-NODE-ID>

Remplacez <WORKER-NODE-ID> par l'ID du nœud que vous souhaitez promouvoir, que vous pouvez trouver en exécutant docker node ls.

 Source : Docker Swarm Official

Conclusion

Vous avez maintenant un cluster Docker Swarm fonctionnel composé d'un manager et de plusieurs nœuds workers. Vous pouvez déployer des applications sur ce cluster en utilisant des services Docker Swarm, ce qui permet de gérer facilement la disponibilité, le scaling, et les mises à jour de vos applications conteneurisées.

Ce tutoriel couvre les bases, mais Docker Swarm offre de nombreuses autres fonctionnalités et options de configuration pour optimiser et sécuriser votre cluster.

Installation & Configuration

Commandes Docker

Voici une liste des commandes Docker les plus couramment utilisées et leurs fonctions.

Notez que cette liste n'est pas exhaustive, car Docker offre un large éventail de commandes pour diverses opérations, mais cela couvrira les plus fondamentales.

Gestion des Conteneurs

Gestion des Images

Réseau et Stockage

Docker Compose (outil distinct)

Informations et Configuration

Gestion des Stacks

Gestion des Services dans une Stack

 

Ces commandes offrent une interface de haut niveau pour la gestion des applications distribuées sur un cluster Docker Swarm, simplifiant le déploiement et la maintenance d'applications conteneurisées à grande échelle.

Elles sont particulièrement utiles pour les opérations de déploiement continu et pour la gestion de l'infrastructure en tant que code, permettant aux développeurs et aux administrateurs système de décrire l'état souhaité de leur application dans des fichiers de composition et de laisser Docker s'occuper du déploiement et de la gestion.

Inspection et Configuration

 

Gestion d'un cluster Swarm

Les commandes docker swarm sont utilisées pour gérer et orchestrer un cluster Docker Swarm, qui est un groupe de machines Docker (nœuds) fonctionnant ensemble dans un mode de cluster.

Docker Swarm fournit des fonctionnalités d'orchestration de conteneurs natives, permettant de déployer, mettre à l'échelle et gérer des applications conteneurisées sur plusieurs hôtes Docker. 

 

Initialisation et Gestion du Swarm

 

 

 

 

Gestion et Sécurité des Nœuds

 

 

 

 

Gestion des Tokens du Swarm

 

Sécurité et Configuration

 

Promouvoir un Nœud Worker en Manager

Rétrograder un Nœud Manager en Worker

Considérations Importantes

Équilibrage des Rôles : Lors de la promotion ou de la rétrogradation des nœuds, il est crucial de maintenir un équilibre entre le nombre de managers et de workers dans votre Swarm. Un nombre optimal de managers assure une bonne tolérance aux pannes sans introduire de complexité ou de latence de gestion inutiles.

Sécurité et Fiabilité : Les managers maintiennent l'état du cluster et prennent des décisions de gestion importantes. Il est donc essentiel de s'assurer que les nœuds promus en managers sont sécurisés et fiables.