Introduction Ă  Docker

Tutoriel Docker

Tutorial Thumbnail

Le principe des conteneurs a instauré une réelle évolution dans le transport de marchandises dans les années 1950, permettant de rationaliser les zones de chargement et de déchargement, résolvant ainsi les problÚmes de congestion liés à l'avÚnement de la mondialisation.


C'est en voyant l'impact des conteneurs dans l'espace maritime que Solomon Hex, l'un des créateurs de Docker, a eu l'idée de standardiser en 2010 le concept qui a émergé dans le monde de l'informatique. En conservant le principe de la boßte isolée mais simple d'utilisation, les contenants tels que nous les connaissons aujourd'hui voient le jour.


Dans ce tutoriel, nous allons d'abord introduire Docker dans son installation dans un premier temps, puis la configuration de celui-ci en abordant les commandes globales de Docker, la gestion des containers et des images, et ainsi que l'exportation d'une image.


Qu'est ce que Docker ?

Docker est une application qui simplifie le processus de gestion des processus d’application dans les conteneurs. Les conteneurs vous permettent d’exĂ©cuter vos applications dans des processus isolĂ©s des ressources. Ils sont similaires aux machines virtuelles tels que Oracle VM VirtualBox ou VMware par exemple. Les avantages des conteneurs est qu'ils sont plus faciles Ă  dĂ©placer ou gĂ©rable, plus respectueux des ressources et plus dĂ©pendants du systĂšme d’exploitation hĂŽte.





Installation de Docker

Comme la plupart des administrateurs, il peut ĂȘtre tentant d'effectuer un apt-get install docker afin d'installer ce dernier. Or, il s'avĂšre que le repository de Debian ne propose pas toujours la derniĂšre version proposĂ© par l'Ă©diteur, come pour certains programmes tels que PHPMyAdmin par exemple. Il est prĂ©fĂ©rable dans ce cas de figure de contacter directement les repositories de Docker.


Dans un premier temps, on se charge d'installer les outils nécessaires afin de permettre l'utilisation d'un repository en HTTPS :

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release


On ajoute ensuite la clé PGP officielle de Docker, qui sera copiée dans le répertoire /usr/share/keyring :

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg


On va créer ensuite un fichier de listing des dépendances de Docker dans /etc/ap/source.list.d/. Ce fichier portera le nom de docker.list et va héberger les adresses URL pointant vers les repositories de Docker en version stable :

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


On est paré à l'installation de Docker ! On mets à jour dans un premier temps la liste des dépendances afin de prendre en compte nos ajouts. Puis, on effectue l'installation de Docker sur le systÚme :

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io


Installation de Docker avec les sources du site officiel de Docker, ajoutées précédemment


Il est tout Ă  fait possible d'installer une version particuliĂšre en recherchant la chaine de caractĂšre associĂ©e Ă  la version souhaitĂ©e, puis de spĂ©cifier cette mĂȘme valeur dans l'installation.

On récupÚre les versions disponibles dans le référenciel :

sudo apt-cache madison docker-ce


Listing des versions disponibles au téléchargement depuis le site officiel de Docker


On procÚde à l'installation spécifique souhaitée (par exemple, la version 5:20.10.14~3-0~debian-bullseye, il suffit de remplacer VERSION_STRING par le numéro de version souhaité) :

sudo apt install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io


On vérifie ensuite l'installation de Docker sur le Debian 11 :

sudo apt-cache policy docker-ce
sudo docker -v


La version 5:20.10.14 pour Debian 11 (BullsEye) est installé sur la machine


Et vérifier également que le service est lancé :

sudo systemctl status docker


Service Docker actif sur le Debian


Utilisation de Docker

Si vous le souhaitez, vous pouvez lancer le container de démonstration proposé par Docker afin de vérifier le bon fonctionnement du systÚme :



Lancement du container de test


Rechercher une image

Pour commencer à créer notre premier conteneur, nous devons d'abord trouver une image qui servira de base à la construction du conteneur. Pour ce faire, vous pouvez visiter le Docker Hub afin de trouver une image publiée. Ce dernier vous offre la possibilité de rechercher de nombreuses images publiées tels que Debian, Apache2 ou Wordpress par exemple.



Docker Hub



Vous pouvez également rechercher des images publiées directement avec la commande Search :

sudo docker search [name]


Si par exemple vous souhaitez effectuer une recherche de l'image de Nginx, vous pouvez effectuer une recherche par le critĂšre "nginx".


Un exemple de recherche de l'image de Nginx



Vous pouvez remarquer qu'une description apporte plus de prĂ©cision sur l'utilitĂ© de l'image, gĂ©nĂ©ralement les images officielles sont placĂ©es en haut de la liste et une mention "Official" est prĂ©sente dans le tableau des diffĂ©rentes images. MĂȘme principe pour une image d'Apache Guacamole, il suffira de saisir le critĂšre "guacamole" ou encore "apache" afin de rĂ©cupĂ©rer le container associĂ©.



Un autre exemple de recherche de l'image d'Apache Guacamole


Télécharger une image

Pour télécharger une image particuliÚre, nous utiliserons la commande Pull suivi du nom de l'image officiel :

sudo docker pull [name_of_container]


Par exemple, en prenant la premiĂšre image du serveur Web Nginx :

sudo docker pull nginx


Téléchargement de l'image officielle de Nginx


L'installation est bien effectuée une fois que vous obtenez "Pull complete" à chaque étape de téléchargement et par l'obtention du Hash de l'image et que le statut soit égal à : "Downloaded newer image for <image_name>:latest". L'utilitaire se charge de télécharger les dépendances, de les extraire puis de les Pull.



L'image de Nginx a été téléchargé, décompressé puis Pull


Afficher les images téléchargées

Une commande vous permets de lister l'ensemble des images téléchargées. Nous affichons ainsi notre image "guacamole" et ainsi que nos autres images téléchargées au préalable :

sudo docker images

Récupération des images téléchargées dont celle de Nginx


Lancer une image particuliĂšre

AprÚs avoir téléchargé notre image particuliÚre, il est nécessaire d'exécuter l'image en question. Pour cela, nous utiliserons la commande Run suivi de l'ID de l'image récupéré par la commande Images :

sudo docker run -i -t [image]


Il existe des options qui Ă©tendent la fonctionnalitĂ© de la commande elle-mĂȘme. Plusieurs options sont disponibles :

  • L’option -i rend l’exĂ©cution de l’image interactive.
  • L'option -p est nĂ©cessaire de spĂ©cifier un port d'Ă©coute TCP pour l'image (exemple avec Nginx, serveur Web, doit Ă©couter sur le port 80). Cette option doit prendre en compte le port initial et le port de redirection final (exemple : je souhaite rediriger le port d'Ă©coute par dĂ©faut de Nginx 80 sur le port 8080, alors on prĂ©cisera l'option : -p 80:8080).
  • L'option -d permets de lancer le processus dans dĂ©pendre de la console de lancement.
  • L'option -t permets de spĂ©cifier l'ID de l'image rĂ©cupĂ©rĂ© avec la commande Images. Cette commande est optionnel, vous pouvez trĂšs bien spĂ©cifier le nom de l'image.


Sans l'option -d :


Le processus est toujours dĂ©pendant du terminal. Si la console est fermĂ©e, alors le processus associĂ© est arrĂȘtĂ© Ă©galement.


Avec l'option -d :


Afin d'accéder au serveur Web et ainsi que de lancer le processus en arriÚre plan et séparé de la console. Dans le cas de Nginx, il est nécessaire de spécifier un port d'écoute TCP pour Nginx avec l'option -p sur le port HTTP standard (port TCP 80). Cette méthode est donc à privilégier en fonction de l'image Docker.

sudo docker run -d -p 80:80 -t [image_ID]



Nous lançons le container installé en spécifiant l'ID de l'image en question. On précise également les ports de redirection du service



Nous remarquons qu'en tentant de joindre l'adresse URL sur le serveur Linux en local, nous obtenons le code HTML de la page par défaut de Nginx :



Code HTTP de Nginx avec Curl du container lancé



MĂȘme principe en tapant directement sur l'adresse IP du Debian 11 avec le container Docker lancĂ© sur une machine diffĂ©rente :



Page Nginx par défaut accédé depuis un navigateur externe


Lister des éléments Docker en cours d'exécution


Lister les images en cours d'exécution

Vous pouvez également lister les images en cours d'exécution avec la commande Ps :

sudo docker images ps


Listing des containers en cours d'exécution


Lister les containers en cours d'exécution

Vous pouvez également lister les containers en cours d'exécution :

sudo docker container ls


De plus, vous pouvez également lister les containers qui ont été lancés sur le serveur avec l'option -a :

sudo docker ps -a


Listing des containers lancés sur le serveur


Interagir avec un container

Plusieurs fonctionnalités sont présentées par Docker afin de gérer le container comme l'interaction avec le Shell ou encore la suppression d'un container particulier.


Exécuter une commande dans un container sur la machine hÎte

Parfois dans certains cas, il peut ĂȘtre nĂ©cessaire de rentrer directement dans le conteneur Docker afin d'effectuer quelques actions particuliĂšres. Au lieu de rentrer et d'effectuer des modifications directement dans le container, vous avez la possibilitĂ© d'exĂ©cuter une commande distante sur le container avec Exec :

sudo docker exec -it [CONTAINER_ID] [COMMAND]


L'instruction "Exec" avec l'option -ti présente une interaction entre le container et la machine hÎte accessible pour l'utilisateur et permettant ainsi une interaction directe avec le container en question. Il sera suivi de l'ID du container en cours d'exécution (ID que vous pouvez retrouver avec la commande Ps), suivi de l'instruction souhaitée :


Par exemple, vous pouvez ouvrir un Shell distant en utilisant Bash :

sudo docker exec -ti [CONTAINER_ID] bash


Si l'instruction Bash Ă  la fin de la commande n'est pas reconnu, remplacez cette valeur par le chemin absolu de Bash : /bin/bash.


Un autre exemple de commande Shell afin de récupérer le nom de la machine dans le Container :

sudo docker exec -it ca3a434bad30 cat /etc/hostname


Exécution d'une commande dans un container particulier (récupération du nom de la machine)



Maintenant, si nous souhaitons modifier le fichier HTML du serveur Nginx, rendez-vous dans le répertoire /usr/share/nginx/html . Effectuez les modifications souhaitées (dans notre cas, on va se contenter uniquement de modifier le texte de la page HTML) :

cd /usr/share/nginx/html


Listing du répertoire www-data de Nginx




Modification de la page HTML par défaut de Nginx



Et voilà le résultat !



Modification de la page HTML par défaut de Nginx


ArrĂȘter un container

Comme indiquĂ© prĂ©cĂ©demment, il est trĂšs intĂ©ressant de lancer le container Docker dĂ©tachĂ© de la console de lancement. Cependant, il peut ĂȘtre utile d'arrĂȘter de container en cours d'exĂ©cution sur la machine avec la commande Stop :

sudo docker stop [CONTAINER_ID]



ArrĂȘt d'un container spĂ©cifique


Le container est maintenant arrĂȘtĂ©.


Pour rappel, l'ID du container s'obtient avec la commande sudo docker ps.


Sauvegarder les modifications effectuées dans le container

En arrĂȘtant de container que vous venez de lancer puis en essayant de le lancer Ă  nouveau, vous pouvez constater que les donnĂ©es n'ont pas Ă©tĂ© sauvegardĂ©es. Dans notre exemple avec notre image Nginx, notre page personnalisĂ©e a Ă©tĂ© remplacĂ©e par la page de Nginx prĂ©sentĂ©e par dĂ©faut... EmbĂȘtant non ?


Fort heureusement, il existe une solution qui vous permets de sauvegarder les modifications effectuées. La premiÚre solution consiste à sauvegarder un dossier à l'intérieur d'un container en le reliant à un dossier créé sur la machine hÎte. Cette procédure s'applique à un dossier à l'intérieur du conteneur avec l'option -v.



Stockage de la page HTML dans un répertoire local sur la machine hÎte


Dans un premier temps, on crĂ©Ă© sur la machine hĂŽte un dossier qui regroupera les fichiers Ă  sauvegarder en permanence mĂȘme aprĂšs le redĂ©marrage de l'image (dans notre cas, on choisi de conserver notre fameuse page HTML !). Ensuite, en allant dans le dossier crĂ©Ă©, on vient Ă©crire notre future page HTML avec un echo "Voici ma superbe page sauvegardĂ©e !!" > index.html. Enfin, nous lançons notre image en spĂ©cifiant, en violet notre dossier local sur la machine hĂŽte et en vert le dossier devant ĂȘtre sauvegardĂ© (notre dossier /usr/share/nginx/html, c'est-Ă -dire notre dossier contenant la page de Nginx par dĂ©faut).


Une fois lancé, nous pouvons constater que notre Nginx contient notre page HTML !


MĂȘme en relançant la construction de l'image, la page HTML reste intacte :


Modifications sauvegardée dans le répertoire local


Construire son image Docker avec "commit"

Quand vous avez Ă  faire pas mal d'installations et de modifications de l'image, il peut ĂȘtre intĂ©ressant de construire sa propre image avec les modifications appliquĂ©es. Cette mĂ©thode vous permettra donc de crĂ©er votre propre image Docker avec vos propres modifications. La mĂ©thode la plus rĂ©pandue est la mĂ©thode du commit.


Visualiser les changements effectués

Dans un premier temps, effectuez les modifications au préalable dans l'image (dans mon cas, je vais me contenter d'installer Nano et éditer le fichier index.html de Nginx). Une fois les modifications effectuées, une commande permets de visualiser les fichiers qui ont été modifiés qui est la commande diff :

sudo docker diff [CONTAINER_ID]


Affichage des différences dans le container modifié (Ajout, édition & suppression de fichiers)


La commande Docker Diff rĂ©pertorie les fichiers et les rĂ©pertoires modifiĂ©s dans le systĂšme de fichiers d’un conteneur depuis la crĂ©ation du conteneur. Trois types de changements diffĂ©rents sont suivis caractĂ©risĂ©s par des lettres :

  • A : Un fichier ou un rĂ©pertoire a Ă©tĂ© ajoutĂ©.
  • D : Un fichier ou un rĂ©pertoire a Ă©tĂ© supprimĂ©.
  • C : Un fichier ou un rĂ©pertoire a Ă©tĂ© modifiĂ©.


Créer son propre container avec une image existante

Une fois que vous ĂȘtes prĂȘt, il ne reste plus qu'Ă  lancer le commit de notre container en spĂ©cifiant l'ID du container (en jaune) ; du nom de notre image personnalisĂ©e (en vert), sĂ©parĂ© du numĂ©ro de version de l'image que vous souhaitez publier :

sudo docker commit [CONTAINER_ID] [NAME_OF_YOUR_CONTAINER]:[VERSION] --author [AUTHOR]
sudo docker images


Création de notre propre image Docker + l'image est présente dans les containers de Docker



De ce fait, il vous suffira dans un premier temps d'arrĂȘter l'image en cours d'exĂ©cution puis de lancer votre propre image Docker !



Exécution de notre propre image "nginx-custom-vemotech" créée


Rendu dans le navigateur avec Nginx :



Mettre Ă  jour son image

Si dans le cas oĂč vous souhaitez mettre Ă  jour votre instance Docker, il vous suffit de commit Ă  nouveau le container en modifiant le numĂ©ro de version, pour une version majeure par exemple :



Création de l'image V2



La commande Commit va copier le container actuel grùce à son ID (à récupérer dans docker container ls) et va copier dans le container créé (ici : nginx-custom-vemotech).


Le fait de spĂ©cifier un numĂ©ro de version en tant que tag est fortement conseillĂ© dans le cadre oĂč vous dĂ©ployez une version majeure et non des corrections mineures. Sinon, Docker va crĂ©er plusieurs images en fonction du numĂ©ro de version. Pour des correctifs mineurs, repassez la ligne prĂ©cĂ©dentes aprĂšs modifications du container :



Commit d'une version mineure


De ce fait, les version précédentes sont affecté à <none> car elles sont plus utilisées. Cependant, elle ne sont pas supprimées. C'est pour cela que ci-dessous, nous allons effectuer la suppression des résiduels de ce genre.


Et voilà le résultat :



Contenu du container "nginx-custom-vemotech"



Exporter une image

Vous pouvez avoir besoin d'exporter une image particuliÚre afin de l'utilisateur sur une autre machine hÎte. Avec la commande Docker Save, il suffit de spécifier le nom de l'image + dossier de destination et du nom de l'archive Tar de votre choix :

sudo docker images
sudo docker save nginx-custom-vemotech > /path/to/public/Ex_DockImg_NginxCustomVemoTech.tar


Exportation image Docker "nginx-custom-vemotech" Version 2 dans le dossier /var/lab/docker_export


Vous retrouvez ainsi votre image compressée dans une archive Tar dans le dossier choisi.


Actions de suppressions

Docker dispose d'un systĂšme de gestion de suppression qui peut ĂȘtre appliquĂ© Ă  une ou un ensemble de containers prĂ©sents sur le serveur Docker.


Supprimer tous les containers non utilisés ou en pause

Docker fournit une commande pour nettoyer toutes les ressources associĂ©es aux containers en pause qui ne sont pas associĂ©s entre eux (images, conteneurs, volumes et rĂ©seaux) :

sudo docker system prune


Également, vous pouvez supprimer en plus, tous les conteneurs arrĂȘtĂ©s et toutes les images non utilisĂ©es (pas seulement les images en pause donc tous les containers sur la machine hĂŽte), ajoutez l’indicateur -a Ă  la commande :

sudo docker system prune -a



Commande permettant de nettoyer les fichiers, containers et réseaux non utilisés


Supprimer des containers ou images

Une image Docker se compose de plusieurs couches. En effet, certains fichiers rĂ©siduels ne servent plus et consomment de l'espace disque pour rien. Ils peuvent ĂȘtre localisĂ©s en ajoutant les options -f et dangling=true afin de filtrer les fichiers restants.


Lorsque vous souhaitez supprimer un container avec son nom, vous pouvez utiliser la commande :

sudo docker container ls
sudo docker rm -f [CONTAINER_NAME]


Suppression d'un container en fonction de son nom


Vous pouvez également supprimer une image téléchargée en local :

sudo docker images -f dangling=true
sudo docker image rmi [CONTAINER_NAME] -f



L'option -f est nécessaire afin de forcer le processus de suppression de l'image. De plus, il est possible de spécifier plusieurs noms d'images afin d'effectuer une suppression groupée.


Si vous souhaitez supprimer complĂštement l'image, utilisez l'option purge :

sudo docker images purge [CONTAINER_NAME]


Actions globales

Parmi cela, Docker offre la possibilitĂ© d'effectuer des commandes sous certaines conditions comme effectuer une suppresion de toutes les images, mais encore arrĂȘter tous les containers :


Stopper tous les containers en cours d'exécution

sudo docker stop $(docker ps -a -q)


Supprimer tous les containers arrĂȘtĂ©s

sudo docker rm $(docker ps -a -q)


Supprimer tous les containers de Docker

sudo docker rmi $(docker images -a -q)


Vous pouvez arrĂȘter et supprimer plusieurs conteneurs en passant la commande une liste de conteneurs Ă  supprimer. La syntaxe Shell renvoie le rĂ©sultat de tout ce qui est exĂ©cutĂ© entre parenthĂšses. Vous pouvez donc y crĂ©er une liste de conteneurs Ă  transmettre aux commandes $(stop) et $(rm).


En effectuant la récupération des containers lancés sur le systÚme, vous pouvez utiliser la commande Docker "PS" avec les options -a et -q :

sudo docker ps -a -q


  • L’option -a permets de de lister tous les conteneurs, mĂȘme ceux qui ont Ă©tĂ© arrĂȘtĂ©s. Sans cela, il ne rĂ©pertorie par dĂ©faut que les conteneurs en cours d’exĂ©cution.
  • L’option -q permets de fournir uniquement des ID numĂ©riques des conteneurs en suspens, plutĂŽt qu’une table entiĂšre d’informations sur les conteneurs.

Utiliser l'environnement Docker avec un autre utilisateur

Si vous n'utilisez pas le compte root par défaut de Linux, vous pouvez gérer Docker en ajoutant l'utilisateur en question dans le groupe Docker :

sudo usermod -aG docker $(whoami)


Conclusion

Docker présente pas mal d'avantages à son utilisation, parmi :

  • Sa flexibilitĂ© : Tous les applications peuvent ĂȘtre transformĂ©es en des conteneurs
  • Sa lĂ©gĂšretĂ© : Contrairement Ă  la virtualisation classique, Docker exploite et partage le kernel du systĂšme d’exploitation de l’hĂŽte, ce qui le rend trĂšs efficace en terme d’utilisation des ressources du systĂšme
  • Sa portabilitĂ© : Il est possible de crĂ©er, dĂ©ployer et dĂ©marrer des conteneurs sur son ordinateur, celui de ses clients ou un serveur distant
  • Son adaptation : L’installation et la dĂ©sinstallation de conteneurs ne dĂ©pend pas des autres conteneurs installĂ©s. Ce qui permet de mettre Ă  jour ou remplacer un conteneur sans modifier les autres
  • Sa scalabilitĂ© : Dupliquer un container est extrĂȘmement simple, ce qui permet de rĂ©aliser de la scalabilitĂ© horizontale aisĂ©ment
  • Sa sĂ©curitĂ© : Par dĂ©faut, Docker crĂ©e des conteneurs en appliquant des rĂšgles de sĂ©curitĂ© strictes et isole les processus.

Et voilĂ , maintenant vous connaissez pas mal de choses sur Docker (du moins je l'espĂšre ! 😊). Docker est une technologie trĂšs efficace pour gĂ©rer des conteneurs individuels. Cependant, Ă  mesure que le nombre de conteneurs et d'applications conteneurisĂ©es augmente, la gestion et l'orchestration deviennent plus complexes.


En fin de compte, vous devez prendre du recul et regrouper plusieurs conteneurs pour vous assurer que les services sont servis Ă  tous.

Pour toute suggestion / amĂ©lioration du tutoriel, n'hĂ©sitez-pas Ă  Proposer une modification ! ✌

Niveau DĂ©butant

Technologie utilisée :

Proposer une modification
Antoine
Par Antoine
Rédigé le Dimanche 02 Octobre 2022