Installation Docker

docker 5 déc. 2023

Depuis quelques années, la plupart des outils disponibles pour les serveurs proposent une installation via Docker.

Nous allons donc voir dans cet article ce qu'est Docker, le principe de fonctionnement, comment l'installer et l'utiliser.

Je partirai, comme pour les articles précédents, sur une installation Alma Linux 9.

Tout d'abord, Docker c'est quoi ?

Il s'agit d'un gestionnaire de conteneurs, à savoir des machines virtuelles contenant un système Linux préinstallé et préconfiguré, contenant tout ce qu'il faut pour faire fonctionner telle application ou outil.

L'intérêt est de faciliter les mises à jour de l'application, de ne pas interférer avec les paquets installés sur le serveur ou sa configuration, de ne pas avoir à se soucier des dépendances et de faciliter les sauvegardes.

Le principe de base est de télécharger une image depuis un dépôt (officiel ou non), la machine virtuelle préconfigurée, et de créer un conteneur avec des paramètres personnalisés.

Il s'agira donc du conteneur qui fonctionnera, et non l'image qui reste intouchée, les données de l'application étant stockées dans des volumes.

Commençons par installer Docker :

dnf -y install yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Faisons également en sorte qu'il s'exécute au démarrage du serveur :

systemctl enable docker && systemctl start docker

Installons également docker-compose afin de faciliter la manipulation des images et conteneurs, et rendons-le exécutable :

curl -L "https://github.com/docker/compose/releases/download/v2.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose

Maintenant que les bases sont prêtes, voyons quelques commandes utiles :

# Afficher les informations de l'installation Docker
docker info

# Vérifier les conteneurs en cours d'exécution
docker ps

# Vérifier les images téléchargées
docker images

# Afficher les paramètres de lancement d'un conteneur
docker container inspect nom_conteneur

# Afficher en temps réel les ressources utilisées par un conteneur
docker container stats nom_conteneur

# Afficher l'aide de Docker avec les différentes commandes disponibles
docker --help

# Afficher l'aide pour une sous-rubrique, par exemple pour la gestion des conteneurs
docker container --help

# Récupérer la dernière version d'une image
docker-compose pull

# Arrêter ou démarrer un conteneur en tâche de fond, en se basant sur les paramètres d'un fichier docker-compose.yml (nous verrons les détails plus bas)
docker-compose down
docker-compose up -d

Installons maintenant notre premier conteneur.

J'ai choisi pour cela Portainer, une interface web pour la gestion de Docker, des images, des conteneurs, etc..., et j'installerai la version Community Edition :

# Créer le volume servant à stocker les données et la configuration de Portainer, ce volume étant dans le dossier /var/lib/docker/volumes/
docker volume create portainer_data

# Télécharger l'image de Portainer CE et créer le conteneur avec quelques paramètres personnalisés
docker run -d --restart=always --name=portainer -p 8000:8000 -p 9443:9443 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

Voyons le détail des paramètres de la deuxième commande :
docker run : pour créer le conteneur à partir d'une image, si cette dernière n'est pas déjà sur le serveur elle sera télécharger à partir du dépôt
-d : permet de lancer le conteneur en mode daemon, donc en arrière-plan, pour que la ligne de commande ne soit pas bloquée
--restart=always : si le conteneur s'arrête pour une raison ou une autre, par exemple lors d'un reboot du serveur, il sera automatiquement redémarré (plus de détails dans le paragraphe suivant)
--name=portainer : le nom que le conteneur aura dans la dernière colonne lors de l'utilisation de la commande docker ps
-p 8000:8000 -p 9443:9443
: le ou les ports qui seront utilisés côté hôte (sur le serveur) et qui seront reliés aux ports internes du conteneur (port_hôte:port_conteneur)
-v portainer_data:/data : un dossier sur le serveur qui sera relié à un dossier du conteneur

La dernière partie de la commande va être l'image que vous voulez télécharger, à partir de laquelle sera créé le conteneur, ici portainer/portainer-ce.

Les différentes possibilités pour les stratégies de redémarrage d'un conteneur, donc le paramètre --restart= :
- no : ne jamais redémarrer le conteneur
- on-failure : redémarrer le conteneur uniquement s'il y a eu un dysfonctionnement, donc s'il n'a pas été arrêté manuellement; vous pouvez préciser le nombre de tentatives avec, par exemple, on-failure:3
- always : toujours redémarrer le conteneur, peu importe le cas
- unless-stopped : redémarrer le conteneur dans tous les cas sauf s'il a été arrêté manuellement

Nous allons maintenant aborder la notion de volumes, très importante pour garder les données et la configuration d'une application, les conteneurs étant par définition éphémères.

Pour l'exemple de Portainer, nous avons créé le conteneur avec le paramètre -v portainer_data:/data.

Cela indique qu'un dossier (un volume) nommé portainer_data sera créé dans le dossier /var/lib/docker/volumes/ .

Vous pouvez également indiquer un chemin absolu pour organiser les données de vos conteneurs, par exemple -v /root/docker/portainer:/data .

Le conteneur étant créé et démarré, vous pouvez accéder à l'application en vous rendant sur l'adresse IP de votre serveur, en https, et en précisant le port, ici 9443.

Nous avons vu comment créer des conteneurs, mais il y a une méthode plus pratique de les gérer, arrêter, mettre à jour, etc..., en utilisant des fichiers docker-compose.yml qui contiendront toute la configuration nécessaire et donc viendront remplacer l'utilisation de la commande docker run .

Toujours en restant sur Portainer, voici un exemple de fichier docker-compose.yml :

version: '3.3'
services:
    portainer-ce:
        restart: always
        container_name: portainer
        ports:
            - '8000:8000'
            - '9443:9443'
        volumes:
            - '/var/run/docker.sock:/var/run/docker.sock'
            - './data:/data'
        image: portainer/portainer-ce

L'arborescence des différentes lignes étant très importante, par exemple les lignes indiquant les ports étant décalées par rapport à "ports".

Enregistrez ce fichier dans un dossier, par exemple /root/docker/portainer/, et rendez-vous dans ce dossier.

Comme la ligne indiquant le volume "data" de Portainer est un chemin relatif, un dossier "data" sera créé dans /root/docker/portainer/ .

Une fois dans le bon dossier, lancez la commande suivante pour créer le conteneur en mode daemon :

docker-compose up -d

Pour les mises à jour, il suffira, toujours depuis le bon dossier, d'arrêter le conteneur, récupérer la dernière version de l'image et de recréer un nouveau conteneur d'après les mêmes paramètres du fichier docker-compose.yml :

docker-compose down && docker-compose pull && docker-compose up -d

La sauvegarde des données sera également plus simple, car il vous suffira de faire une copie ou une archive du dossier /root/docker/portainer/ .

Vous trouverez souvent, pour les applications disposant d'une installation via Docker, un fichier docker-compose.yml avec tout la configuration de base.

Dans les cas où seule la commande docker run serait indiquée, vous pouvez utiliser le site Composerize qui vous permet, à partir d'une commande docker run, de générer le contenu du fichier docker-compose.yml .

Il faut également savoir qu'à force de mettre à jour une image (afin de recréer un conteneur), la version précédente de l'image n'est pas supprimée ainsi que des volumes temporaires créés pour les besoins du conteneur, ce qui peut vite s'accumuler et peser plusieurs Go.

Vous pouvez utiliser la commande suivante pour tout nettoyer, à savoir les images/conteneurs/volumes qui ne sont pas en cours d'utilisation, en faisant très attention à ne pas supprimer des données importantes par erreur :

docker system prune -af --volumes && docker volume rm $(docker volume ls -qf dangling=true)

Nous avons fait le tour du fonctionnement global de Docker et nous verrons dans un prochain article comment rendre une application accessible depuis le web en utilisant un reverse proxy qui fera le lien entre l'IP:port du conteneur et une URL.

Si besoin, vous pourrez trouver sur mon wiki plusieurs configurations docker-compose.yml pour des conteneurs populaires en cliquant ici.

Mots clés

Samuel

Passionné par le web et les serveurs, je vous fais découvrir toutes sortes de news, de tutos, de scripts et autres points relatifs à cet univers sans limite !