Tutoriel Docker
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.
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.
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
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
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
Et vérifier également que le service est lancé :
sudo systemctl status 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 :
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.
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".
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Ă©.
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
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.
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
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 :
Sans l'option -d :
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 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 :
MĂȘme principe en tapant directement sur l'adresse IP du Debian 11 avec le container Docker lancĂ© sur une machine diffĂ©rente :
Vous pouvez également lister les images en cours d'exécution avec la commande Ps :
sudo docker images ps
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
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.
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
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
Et voilà le résultat !
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]
Le container est maintenant arrĂȘtĂ©.
Pour rappel, l'ID du container s'obtient avec la commande sudo docker ps
.
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
.
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 :
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.
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]
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 :
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
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 !
Rendu dans le navigateur avec Nginx :
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 :
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 :
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 :
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
Vous retrouvez ainsi votre image compressée dans une archive Tar dans le dossier choisi.
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.
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
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]
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]
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 :
sudo docker stop $(docker ps -a -q)
sudo docker rm $(docker ps -a -q)
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
-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.-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.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)
Docker présente pas mal d'avantages à son utilisation, parmi :
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 !