Module 9 · 9.2
Français
Installer Docker et votre premier conteneur
Module 9: Docker et docker compose · Temps de lecture : 11 minutes
Objectif pédagogique : À l'issue de cette leçon, vous savez installer Docker Engine depuis le dépôt officiel, lancer, consulter, inspecter et nettoyer des conteneurs, et vous savez pourquoi le groupe docker équivaut à root.
Notions clés : Docker Engine, Docker Desktop, dépôt apt officiel, docker.io de Debian, groupe docker, rootless mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df
Quel Docker ?
Sur un serveur, vous installez Docker Engine : le service d'arrière-plan (dockerd) et la commande docker. Docker Desktop est autre chose : un programme avec fenêtres pour Windows, macOS et les postes de travail Linux. Il n'a pas sa place sur un serveur.
Il existe deux sources propres pour Docker Engine :
- Le dépôt de Docker lui-même (
download.docker.com). Toujours la version la plus récente, y compris le plug-indocker composeque vous utiliserez dans la leçon 9.3. C'est ce que décrit la documentation Docker et ce qu'utilise cette formation. - Le paquet
docker.iode Debian ou d'Ubuntu. Plus ancien, mais maintenu par la distribution via vos mises à jour de sécurité habituelles (leçon 4.2). Très bien si vous préférez ne rien installer en dehors de la distribution ; vérifiez alors quedocker compose(avec une espace) est disponible.
Choisissez-en une seule. Mélanger les deux provoque des conflits ; la documentation Docker demande donc de supprimer d'abord les paquets non officiels comme docker.io, docker-compose et podman-docker.
Installer depuis le dépôt de Docker
Voici les étapes de la documentation Docker pour Debian, avec la clé à part et un Signed-By dédié (leçon 4.1). Faites d'abord un snapshot si vous le souhaitez.
anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install ca-certificates curl
anna@web1:~$ sudo install -m 0755 -d /etc/apt/keyrings
anna@web1:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
anna@web1:~$ sudo chmod a+r /etc/apt/keyrings/docker.ascEnsuite le fichier de source /etc/apt/sources.list.d/docker.sources (format deb822) :
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascÀ Suites correspond le nom de code de votre version (cat /etc/os-release, leçon 4.3) et à Architectures la sortie de dpkg --print-architecture. Sur Ubuntu, l'URL est https://download.docker.com/linux/ubuntu et la suite par exemple noble.
Puis l'installation :
anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
anna@web1:~$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.Sur Debian et Ubuntu, Docker démarre automatiquement après l'installation, ainsi qu'à chaque redémarrage (systemctl status docker, leçon 6.1).
Attention : par défaut, unattended-upgrades (leçon 4.2) ne met pas automatiquement à jour les paquets de ce dépôt. Intégrez sudo apt update && sudo apt upgrade pour Docker à votre rythme de maintenance (leçon 10.4), ou ajoutez sciemment ce dépôt à vos mises à jour automatiques.
Le groupe docker, c'est root
Partout sur Internet, on vous conseille de vous ajouter au groupe docker pour ne plus avoir à taper sudo :
anna@web1:~$ sudo usermod -aG docker annaNe le faites que si vous comprenez ce que cela implique. La documentation Docker est claire : le groupe docker donne des droits équivalents à ceux de root. Quiconque peut piloter le service Docker peut lancer un conteneur dans lequel tout le disque de l'hôte est monté :
docker run -it -v /:/host debian chroot /hostet devient ainsi root sur votre serveur, sans mot de passe et sans trace dans le journal sudo. La documentation Docker le formule ainsi : seuls des utilisateurs de confiance doivent être autorisés à contrôler le service Docker.
Pour un serveur que vous êtes seul à administrer, c'est un choix : le confort contre une voie supplémentaire vers root. Le plus sûr est de continuer à taper sudo docker ... ; chaque commande figure alors dans le journal sudo (leçon 3.2). En tout cas, n'ajoutez jamais au groupe un utilisateur qui ne doit pas être root, comme un utilisateur de service pour un site web.
Rootless mode
Docker peut aussi fonctionner sans root : le service et les conteneurs tournent alors sous un utilisateur ordinaire, avec son propre user namespace. Vous l'installez en tant que cet utilisateur avec dockerd-rootless-setuptool.sh install (issu du paquet docker-ce-rootless-extras ; le paquet uidmap est nécessaire au préalable). Une faille dans un conteneur ne donne alors pas root sur l'hôte. Il y a des limitations et la mise en place est plus délicate ; dans cette formation, nous utilisons l'installation classique et restons en sécurité grâce aux règles de ce module.
Un premier vrai conteneur
Nous lançons un serveur web nginx dans un conteneur, accessible uniquement depuis le serveur lui-même :
anna@web1:~$ sudo docker run -d --name proef -p 127.0.0.1:8080:80 nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
...
3f1c9e0d7a2b...Les éléments :
| Élément | Signification |
|---|---|
-d | Tourner en arrière-plan (detached) |
--name proef | Un nom, pour ne pas devoir manipuler de longs ID |
-p 127.0.0.1:8080:80 | Le port 80 du conteneur devient le port 8080 de l'hôte, uniquement sur loopback |
nginx:stable | L'image nginx officielle, tag stable |
Vérification :
anna@web1:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
3f1c9e0d7a2b nginx:stable "/docker-entrypoint.…" Up 5 seconds 127.0.0.1:8080->80/tcp proef
anna@web1:~$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.28.0
anna@web1:~$ sudo ss -tlnp | grep 8080
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=2211,fd=7))ss (leçon 5.1) le confirme : uniquement sur 127.0.0.1. Si vous aviez tapé -p 8080:80, vous auriez vu 0.0.0.0:8080 et [::]:8080, et votre conteneur serait accessible depuis Internet, même si ufw n'autorise pas le port 8080 (leçon 9.3). La version dans l'en-tête Server peut être différente chez vous.
Observer et intervenir
anna@web1:~$ sudo docker logs proef # ce que le programme a écrit (stdout et stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # les 20 dernières lignes, puis suivre en continu
anna@web1:~$ sudo docker exec -it proef sh # un shell dans le conteneur en cours d'exécution
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # arrêter et supprimerdocker logs est le premier endroit où regarder quand un conteneur ne se comporte pas comme prévu, tout comme journalctl pour les services ordinaires (leçon 6.2). Avec docker exec, vous regardez à l'intérieur, mais évitez d'y modifier quoi que ce soit : les modifications dans le conteneur disparaissent à la prochaine mise à jour (leçon 9.1).
Faire le ménage
Les images et les conteneurs arrêtés restent présents jusqu'à ce que vous les supprimiez. Sur un VPS avec un petit disque, cela s'accumule sans qu'on s'en aperçoive.
anna@web1:~$ sudo docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 7 3 1.9GB 1.2GB (63%)
Containers 3 3 12MB 0B (0%)
Local Volumes 2 2 180MB 0B (0%)
Build Cache 0 0 0B 0B
anna@web1:~$ sudo docker image prunedocker image prune supprime les images sans nom qui ne sont plus liées à rien ; avec -a, il supprime aussi toutes les images qu'aucun conteneur n'utilise. Soyez prudent avec docker system prune --volumes : cette commande supprime aussi les volumes anonymes (sans nom) qui ne sont à ce moment-là liés à aucun conteneur, et docker volume prune -a supprime même les volumes nommés. Vos données peuvent s'y trouver. Donnez donc toujours un nom à vos volumes ou utilisez un bind mount (leçon 9.1), et vérifiez d'abord avec docker volume ls.
Les journaux des conteneurs peuvent eux aussi grossir. Par défaut, Docker les conserve dans des fichiers JSON sans limite de taille. Vous fixez une limite dans /etc/docker/daemon.json :
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Ensuite sudo systemctl restart docker ; le réglage ne s'applique qu'aux conteneurs nouvellement créés, les conteneurs existants doivent être recréés.
En pratique
Docker fonctionne sur un VPS chez WebOké exactement comme chez n'importe quel autre fournisseur : c'est un logiciel au sein de votre propre serveur, que vous installez et mettez à jour vous-même. Sur un petit VPS, surveillez régulièrement l'espace disque avec docker system df et df -h (leçon 1.4).
Résumé
- Installez Docker Engine depuis le dépôt de Docker (avec sa propre clé et un
Signed-By) oudocker.iodepuis la distribution, pas les deux. - Le groupe docker équivaut à root ;
sudo dockerlaisse une trace dans le journal sudo. Le rootless mode est une alternative plus sûre mais plus limitée. docker run -d --name ... -p 127.0.0.1:host:container image:taglance un conteneur accessible uniquement en local ; vérifiez avecss.docker ps,logs,exec,stop,rmsont vos outils au quotidien.- Nettoyez les images avec
docker image prune, limitez les journaux des conteneurs (illimités par défaut) et utilisez--volumesavec parcimonie.
Quiz
Exercice
Exercice O9.2 : Votre premier conteneur. Installez Docker Engine sur votre serveur en suivant la leçon (ou sur une machine de test). Lancez un conteneur nginx qui écoute uniquement sur 127.0.0.1:8080, vérifiez avec docker ps, curl -I et ss -tlnp, consultez les journaux, puis supprimez-le. Répondez aux questions : depuis quelle source avez-vous installé Docker, qu'a affiché ss pour le port 8080, et vous êtes-vous ajouté au groupe docker (pourquoi, ou pourquoi pas) ?
Exercice O9.2: Votre premier conteneur
Cet exercice, vous le faites vous-même ; personne ne le vérifie. Cochez ce que vous avez fait et marquez l'exercice comme terminé.
Installé depuis le dépôt de Docker, il n'est pas mis à jour par défaut par unattended-upgrades ; docker.io de la distribution, si. ss doit afficher 127.0.0.1:8080, pas 0.0.0.0:8080. Le groupe docker donne les droits root ; avec sudo docker, chaque commande reste dans le journal sudo.
Vos cases cochées et vos notes restent uniquement dans ce navigateur ; nous ne les envoyons nulle part. Si vous êtes connecté, nous enregistrons dans Mes formations uniquement le fait que vous avez terminé l'exercice.
Pour aller plus loin
- Documentation Docker, Install Docker Engine on Debian : https://docs.docker.com/engine/install/debian/
- Documentation Docker, Install Docker Engine on Ubuntu : https://docs.docker.com/engine/install/ubuntu/
- Documentation Docker, Linux post-installation steps : https://docs.docker.com/engine/install/linux-postinstall/
- Documentation Docker, Docker security (Docker daemon attack surface) : https://docs.docker.com/engine/security/
- Documentation Docker, Rootless mode : https://docs.docker.com/engine/security/rootless/
- Documentation Docker, JSON File logging driver : https://docs.docker.com/engine/logging/drivers/json-file/
