Docker : pense-bête
Vocabulaire
| Terme | C'est quoi |
|---|---|
| Image | Un modèle en lecture seule (ex. debian:13). Ne change jamais. |
| Conteneur | Une instance en cours d'exécution d'une image, avec une petite couche inscriptible par-dessus. |
| Volume | Un dossier de la machine monté dans le conteneur, pour partager ou conserver des fichiers. |
| Port publié | Un pont entre un port de la machine et un port à l'intérieur du conteneur. |
| Dockerfile | Une recette texte pour fabriquer sa propre image. |
| compose.yaml | Un fichier qui décrit un ou plusieurs conteneurs, à la place d'une longue commande. |
Un conteneur n'a pas de noyau à lui : il utilise celui de la machine hôte, quelle que soit la distribution testée à l'intérieur. On ne teste donc pas une distribution complète (pas de GRUB, pas d'installateur, pas de systemd actif), mais son espace utilisateur (paquets, commandes, configuration).
Les six commandes de base
docker run -it --rm IMAGE # lancer un conteneur jetable, avec un shell interactif
docker ps -a # voir les conteneurs (même arrêtés)
docker images # voir les images stockées sur la machine
docker build -t NOM . # fabriquer une image depuis un Dockerfile
docker rmi NOM # supprimer une image
docker rm NOM # supprimer un conteneur
-it
-i(interactive) : garde le clavier ouvert vers le conteneur.-t(tty) : donne un vrai terminal (prompt, couleurs, historique).- Utile pour un shell interactif. Inutile pour une commande qui affiche un résultat et s'arrête (
docker run --rm debian:13 cat /etc/os-release).
Garder un conteneur (sans --rm)
docker run -it --name mondebian debian:13 # apt install ..., puis exit
docker start -ai mondebian # le retrouver, avec ce qui a été installé
-p : publier un port
127.0.0.1:8080:8080: accès limité à la machine locale, port 8080 → port 8080 du conteneur.- Sans
127.0.0.1, le service est ouvert à tout le réseau local.
-v : monter un volume
:ro(read-only) : le conteneur peut lire, pas écrire.- Les fichiers vivent sur la machine ; le conteneur ne fait que les servir ou les lire.
Exemple : serveur web
docker run -d --rm --name web \
-p 127.0.0.1:8080:8080 \
-v ~/site-web:/usr/share/nginx/html:ro \
nginxinc/nginx-unprivileged
-d (detach) : tourne en arrière-plan. --rm : supprimé à l'arrêt. docker stop web pour l'arrêter.
Dockerfile minimal
docker build -t mon-image .
docker run --rm mon-image
docker run --rm mon-image figlet "Autre texte" # remplace le CMD
Faire le ménage
docker system df # place occupée, tous types confondus
docker image prune # supprime les images orphelines (sans nom)
docker system prune -a # supprime TOUTES les images inutilisées (se retéléchargent au besoin)
compose.yaml
services:
web:
image: nginxinc/nginx-unprivileged
container_name: web
ports:
- "127.0.0.1:8080:8080"
volumes:
- ~/site-web:/usr/share/nginx/html:ro
restart: unless-stopped
docker compose up -d # démarrer
docker compose down # arrêter et supprimer
docker compose ps # état des services
docker compose logs # journaux
- YAML : espaces uniquement (jamais de tabulation), indentation cohérente.
restart: unless-stoppedremplace--rmpour un service qu'on garde actif.working_dir:,command:,profiles:: utiles pour un service qui exécute une tâche ponctuelle (ex.zensical build) plutôt que de rester actif — voir le récapitulatif détaillé pour l'exemple à deux services.
Sécurité (rootless)
sudo gpasswd -d $USER docker # sortir du groupe docker
sudo systemctl mask docker.service docker.socket # verrouiller le Docker root
docker info --format '{{.SecurityOptions}}' # doit contenir name=rootless
- Toujours
127.0.0.1:devant un port en test, jamais--privilegedsans raison précise. - Images officielles, version épinglée plutôt que
latest.