Aller au contenu

Paramètres des cookies

Choisissez, par catégorie, les cookies que vous autorisez. Vous pouvez modifier votre choix à tout moment via Paramètres des cookies, en bas de chaque page. Politique de confidentialité

Nécessaires

Toujours activés

Indispensables pour vous connecter, conserver votre panier et mémoriser vos choix. Ils sont toujours activés.

Quels cookies ?
  • weboke_sessie, weboke_klant, weboke_remember: votre session et le maintien de la connexion
  • weboke_basket: votre panier
  • wkBtwIncl: l'affichage des prix TTC ou HT
  • wok_cookies: votre choix concernant les cookies, 12 mois

Mesure quelle publicité mène à une visite ou à une commande, pour que nous ne payions pas des publicités inefficaces.

Quels cookies ?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), jusqu'à 90 jours
  • OpenAI Ads, publicités dans ChatGPT
  • wok_aff: le partenaire qui vous a orienté vers nous (programme d'affiliation), 60 jours

4,6

Pays et langue

Chaque pays a son propre site, avec les prix et la TVA de ce pays.

Afficher

Module 9 · 9.2

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 :

  1. Le dépôt de Docker lui-même (download.docker.com). Toujours la version la plus récente, y compris le plug-in docker compose que vous utiliserez dans la leçon 9.3. C'est ce que décrit la documentation Docker et ce qu'utilise cette formation.
  2. Le paquet docker.io de 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 que docker 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.asc

Ensuite 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 anna

Ne 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 /host

et 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émentSignification
-dTourner en arrière-plan (detached)
--name proefUn nom, pour ne pas devoir manipuler de longs ID
-p 127.0.0.1:8080:80Le port 80 du conteneur devient le port 8080 de l'hôte, uniquement sur loopback
nginx:stableL'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 supprimer

docker 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 prune

docker 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) ou docker.io depuis la distribution, pas les deux.
  • Le groupe docker équivaut à root ; sudo docker laisse 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:tag lance un conteneur accessible uniquement en local ; vérifiez avec ss.
  • docker ps, logs, exec, stop, rm sont vos outils au quotidien.
  • Nettoyez les images avec docker image prune, limitez les journaux des conteneurs (illimités par défaut) et utilisez --volumes avec parcimonie.

Quiz

1. Pourquoi l'appartenance au groupe docker donne-t-elle en pratique les droits root ?



2. Après docker run -d -p 8080:80 nginx, ss -tlnp affiche la ligne 0.0.0.0:8080. Qu'auriez-vous dû taper pour publier le port uniquement en local ?



3. Un conteneur démarre, mais le site web qu'il contient ne fonctionne pas. Que consultez-vous en premier ?



4. Pourquoi choisir une seule source pour Docker plutôt que de mélanger docker.io et docker-ce ?



5. Que fait docker system prune --volumes qu'il faut bien savoir ?



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é.




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

Un instant…

Configurez vos domaines

Pour chaque domaine, réglez les serveurs de noms, l'association à votre hébergement et le futur titulaire.

Chargement de vos domaines…