Aller au contenu principal
Xsec

Installer Docker sur Debian

Publié le 10 min de lecture

Mis à jour le

Partie 1 sur 6
Dans cette série41 min de lecture au total
  1. Installer Docker sur Debian
  2. Installer un certificat auto-signé OpenSSL avec nginx
  3. Créer un serveur DNS sur Debian
  4. Installer Nginx + Webdav sur Debian 11
  5. Créer un serveur OpenVPN sur Debian
  6. Connexion SSH avec clé publique

Docker fait tourner une application dans un environnement isolé, avec ses propres bibliothèques et ses propres fichiers, mais sur le noyau de la machine hôte. C’est ce dernier point qui fait toute la différence avec une machine virtuelle : pas de second système d’exploitation à démarrer, donc un conteneur qui se lance en une seconde et pèse quelques dizaines de mégaoctets.

Machine virtuelleConteneur
Noyaule sien, completcelui de l’hôte, partagé
Démarragedizaines de secondesmoins d’une seconde
Poids sur disqueplusieurs gigaoctetsdizaines de mégaoctets
Isolationmatérielle, très fortepar espaces de noms du noyau
RésuméCe que vous saurez faire à la fin
  • Installer Docker depuis le dépôt officiel, avec une signature vérifiée.
  • Utiliser la commande docker sans sudo, en connaissant ce que cela implique.
  • Lancer un conteneur, l’exposer sur un port et lui rattacher un dossier de l’hôte.
  • Lister, inspecter, arrêter et supprimer les conteneurs et leurs images.
Un problème avec sudo ?
DangerN'utilisez pas le compte root

Si vous configurez votre serveur directement en tant que root, n’oubliez pas de retirer sudo de chaque commande. Si vous définissez un mot de passe pour le compte root, la commande sudo ne sera pas acceptée. Connectez-vous directement en tant que root pour exécuter les commandes. Vous pouvez aussi réinstaller votre système en laissant le mot de passe root vide lors de l’installation. sudo s’installera et fonctionnera correctement.

Étape 1 : installer Docker depuis le dépôt officiel

Debian propose bien un paquet docker.io dans ses dépôts, mais il retarde souvent de plusieurs versions et ne fournit pas les greffons modernes. Le dépôt officiel de Docker demande quatre étapes de plus et donne une installation à jour et complète.

  1. Installer les prérequis

    Fenêtre de terminal
    sudo apt update && sudo apt install ca-certificates curl

    ca-certificates fournit les autorités de certification nécessaires pour valider le HTTPS du dépôt, curl sert à télécharger la clé.

  2. Récupérer la clé de signature

    Fenêtre de terminal
    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
    ExplicationÀ quoi sert cette clé

    Chaque paquet du dépôt Docker est signé cryptographiquement. Sans cette clé publique, apt refuse d’installer quoi que ce soit, car il ne peut pas vérifier que le paquet vient bien de Docker et n’a pas été modifié en chemin. C’est ce qui protège contre un dépôt compromis ou une interception réseau.

    Noteapt-key est obsolète

    Les tutoriels antérieurs à Debian 11 utilisent apt-key add, qui installe la clé dans un trousseau global : elle devient alors habilitée à signer n’importe quel paquet du système, y compris ceux des dépôts Debian. La méthode actuelle range la clé dans /etc/apt/keyrings et la lie explicitement à un seul dépôt avec l’option signed-by, ce qui limite sa portée.

  3. Déclarer le dépôt

    Fenêtre de terminal
    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

    Les deux substitutions rendent la ligne portable : dpkg --print-architecture renvoie l’architecture de la machine (amd64, arm64), et VERSION_CODENAME le nom de la version de Debian (bookworm, trixie). Vous pouvez copier ce bloc tel quel sur n’importe quelle machine.

  4. Installer les paquets

    Fenêtre de terminal
    sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    PaquetRôle
    docker-cele démon, qui fait tourner les conteneurs
    docker-ce-clila commande docker que vous tapez
    containerd.iole moteur d’exécution bas niveau, utilisé par le démon
    docker-buildx-pluginconstruction d’images, y compris multi-architectures
    docker-compose-pluginla commande docker compose, pour décrire plusieurs conteneurs dans un fichier
    AstuceClient et démon sont deux choses distinctes

    La commande docker ne fait rien elle-même : elle transmet vos ordres au démon, qui tourne en arrière-plan en tant que root. Cette séparation explique pourquoi sudo est nécessaire par défaut, et c’est l’objet de l’étape suivante.

  5. Vérifier que le service tourne

    Fenêtre de terminal
    sudo systemctl enable --now docker
    sudo systemctl status docker

    enable --now démarre le service et le programme au démarrage de la machine, ce qui évite de découvrir après un redémarrage que les conteneurs ne sont pas revenus.

  6. Valider l'installation

    Fenêtre de terminal
    sudo docker run hello-world
    sudo docker run hello-world
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
    3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
    4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
    To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash
    Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/
    For more examples and ideas, visit:
    https://docs.docker.com/get-started/

    Ce message n’est pas un simple « ça marche » : il décrit exactement la chaîne que Docker vient de parcourir, du client au démon, du démon au registre, puis du registre au conteneur. Si vous le voyez, les quatre composants installés communiquent correctement.

Taper sudo devant chaque commande devient vite pénible. C’est réglable, à condition d’en mesurer la portée.

Étape 2 : utiliser Docker sans sudo

Fenêtre de terminal
sudo usermod -aG docker $USER
newgrp docker

La première ligne ajoute votre compte au groupe docker, la seconde applique le changement à la session en cours sans avoir à se déconnecter.

DangerLe groupe docker équivaut au compte root

Un membre du groupe docker peut lancer un conteneur qui monte la racine de l’hôte en écriture, par exemple docker run -v /:/hote -it debian chroot /hote. Il obtient alors un accès complet au système, sans mot de passe et sans passer par sudo, donc sans trace dans les journaux de sudo.

Ajouter un utilisateur à ce groupe revient donc exactement à lui donner root. Sur un poste personnel c’est un compromis raisonnable. Sur un serveur partagé, gardez sudo docker, ou étudiez le mode rootless de Docker qui fait tourner le démon sous votre propre compte.

Une fois le groupe en place, la commande fonctionne directement :

Fenêtre de terminal
docker run hello-world

Passons à un conteneur qui rend un service réel.

Étape 3 : lancer un conteneur utile

À titre d’exemple, nous allons faire tourner un serveur web Apache.

Fenêtre de terminal
docker run -d --name docker-apache -v /var/www/:/usr/local/apache2/htdocs/ -p 3000:80 httpd

Décomposons chaque partie :

OptionRôle
docker runcrée et démarre un conteneur, en téléchargeant l’image si elle est absente
-dmode détaché, le conteneur tourne en arrière-plan et rend la main
--name docker-apachenomme le conteneur, sinon Docker génère un nom aléatoire
-v /var/www/:/usr/local/apache2/htdocs/monte un dossier de l’hôte dans le conteneur, chemin_hôte:chemin_conteneur
-p 3000:80publie un port, port_hôte:port_conteneur
httpdle nom de l’image, ici Apache, remplaçable par nginx

Le site est alors joignable sur http://IP_MACHINE:3000, et son contenu se modifie simplement en éditant /var/www sur l’hôte.

ExplicationPourquoi le volume change tout

Sans -v, tout ce que le conteneur écrit disparaît avec lui : un conteneur est jetable par conception. Le volume rattache un dossier de l’hôte à un chemin du conteneur, ce qui fait vivre les données en dehors du cycle de vie du conteneur. On peut alors détruire et recréer le conteneur, ou passer à une version plus récente de l’image, sans perdre le contenu.

AvertissementLe port de gauche est celui de l'hôte

-p 3000:80 signifie « le port 3000 de la machine mène au port 80 du conteneur ». Inverser les deux est l’erreur la plus courante, et elle produit un service qui semble démarré mais reste injoignable. Le port de droite est imposé par l’image, celui de gauche est votre choix.

AstuceLes droits sur le volume ne sont pas traduits

Le conteneur voit les fichiers avec leurs identifiants numériques d’utilisateur et de groupe, pas avec leurs noms. Un fichier appartenant à l’UID 1000 sur l’hôte apparaîtra comme appartenant à l’UID 1000 dans le conteneur, quel que soit le nom d’utilisateur qui porte cet identifiant de chaque côté. C’est la source classique des « permission denied » sur un volume.

Piloter les conteneurs au quotidien

Une poignée de commandes couvre l’essentiel de l’exploitation.

CommandeCe qu’elle fait
docker psliste les conteneurs en cours d’exécution
docker ps -aliste tous les conteneurs, y compris arrêtés
docker logs -f docker-apacheaffiche et suit la sortie du conteneur
docker exec -it docker-apache bashouvre un shell dans le conteneur
docker stop docker-apachearrête le conteneur proprement
docker start docker-apachele redémarre avec la même configuration
docker rm docker-apachele supprime, il doit être arrêté au préalable
docker imagesliste les images téléchargées
docker system dfmontre l’espace disque occupé par Docker
ImportantUn conteneur arrêté n'est pas supprimé

docker stop fige le conteneur mais le conserve, avec son système de fichiers. C’est pratique pour le redémarrer, et c’est aussi pourquoi docker ps semble parfois mentir : il ne montre que les conteneurs actifs. Utilisez docker ps -a pour voir ce qui traîne réellement, et docker system prune pour faire le ménage une fois que vous savez ce que vous supprimez.

AstuceLes options se figent à la création

-p, -v et --name sont interprétées par docker run au moment de la création. Elles ne peuvent pas être modifiées ensuite sur un conteneur existant : changer un port publié impose de supprimer le conteneur et de le recréer. C’est sans conséquence, à condition que les données vivent dans un volume, comme vu plus haut.

Le Docker Hub

Le Docker Hub est le registre public d’images, l’équivalent d’un magasin d’applications. On y trouve les images officielles, celles publiées par la communauté, et surtout la documentation de chacune.

Page d'accueil

Chaque image expose ses versions sous forme d’étiquettes, ainsi que les variantes de base disponibles.

Image nginx

La documentation d’une image indique les chemins à monter en volume, les ports exposés et les variables d’environnement attendues. C’est la première chose à lire avant de composer une commande docker run.

Documentation

AvertissementToutes les images ne se valent pas

Une image publiée par la communauté peut contenir n’importe quoi et n’être mise à jour par personne. Préférez les images officielles, repérables à leur badge, vérifiez la date de la dernière publication, et fixez une version explicite dans vos commandes : httpd:2.4 plutôt que httpd, qui pointe sur latest et peut changer de version majeure sans prévenir.

L’installation est fonctionnelle et vous savez piloter un conteneur. Les articles suivants de la série s’appuient sur cette base pour héberger des services réels.

Utiliser avec une IA

Actions