docker ps chasse fixe, gras : à taper tel quelconteneur italique : valeur à remplacerLa VM simule une machine entière ; le conteneur isole des processus qui partagent le noyau de l’hôte.
| VM | Conteneur | |
|---|---|---|
| Isole | une machine complète | des processus |
| Noyau | le sien | celui de l’hôte |
| Systèmes | tout système (Windows, Linux, BSD…) | même famille : conteneur Linux ⇒ noyau Linux |
| Démarrage | dizaines de secondes | de l’ordre de la seconde |
| Taille | plusieurs Go | de quelques Mo à quelques centaines |
| Isolement | fort | plus faible (noyau commun) |
| Pour | tester un système, laboratoire, code douteux | livrer une application et ses dépendances |
docker pull n’exécute rien ; docker run, si.Hôte | machine physique et son système, qui accueille |
Invité | système qui tourne dans la VM |
Hyperviseur | logiciel qui partage le matériel entre VM |
Image ISO | disque d’installation d’un système |
Disque virtuel | fichier vu par l’invité comme un disque |
Instantané | état figé d’une VM, pour y revenir (snapshot) |
Additions invité | pilotes d’intégration hôte ↔ invité |
Image | modèle en lecture seule, en couches, d’où naissent les conteneurs |
Conteneur | instance d’une image en cours d’exécution ; jetable |
Couche | strate de fichiers d’une image, partagée entre images |
Registre | serveur d’images (Docker Hub, GitHub…) |
Volume | stockage qui survit au conteneur |
Dockerfile | recette de construction d’une image |
Compose | description de plusieurs conteneurs en YAML |
VT-x / AMD-V | virtualisation matérielle du processeur (Intel / AMD) |
Émulation | imiter un autre processeur (lent) ; la virtualisation exécute directement |
| Type 1 | sur le matériel, sans système hôte | Hyper-V, VMware ESXi, Xen, Proxmox VE (KVM) |
| Type 2 | application d’un système hôte | VirtualBox, VMware Workstation, Parallels |
| KVM | module du noyau Linux, piloté par QEMU | souvent classé type 1 |
Moteurs de conteneurs : Docker, Podman (sans démon), containerd ; orchestration à grande échelle : Kubernetes.
postgres:17, pas postgres:latest.| Windows | Gestionnaire des tâches → Performances → Processeur → « Virtualisation : Activé » |
| Linux | grep -Ec '(vmx|svm)' /proc/cpuinfo : résultat > 0 = processeur compatible |
lsmod | grep kvm : module KVM chargé ? | |
| Ubuntu | kvm-ok : diagnostic complet (paquet cpu-checker) |
Désactivée ? Réglages UEFI (BIOS) au démarrage : Intel VT-x (« Virtualization Technology ») ou AMD-V (« SVM Mode »).
| Docker Engine | 29.8.1 (15 septembre 2026) · libre (Apache 2.0) |
| Docker Desktop | gratuit, sauf dans une entreprise de plus de 250 salariés ou de plus de 10 M$ de chiffre d’affaires : abonnement |
| VirtualBox | 7.2.20 · GPL v3 ; Extension Pack : licence PUEL, usage personnel et éducatif |
| WSL | 2.1.5 ou plus récent exigé par Docker Desktop |
Versions vérifiées sur les sites officiels le 29 septembre 2026 : elles évoluent vite.
amd64 (x86-64, PC courants) ou arm64 (Mac à puce Apple, Raspberry Pi, certains portables).uname -m (Linux) · $env:PROCESSOR_ARCHITECTURE (PowerShell).| Mode | Internet | Hôte → VM | VM ↔ VM | Réseau → VM | Usage type |
|---|---|---|---|---|---|
| NAT (défaut) | oui | redirection de ports | non | non | naviguer, installer ; l’invité est 10.0.2.15, l’hôte 10.0.2.2 |
| Réseau NAT | oui | redirection de ports | oui | non | plusieurs VM qui se voient et sortent sur Internet |
| Accès par pont | oui | oui | oui | oui | VM = une machine de plus sur le réseau local (adresse de la box) |
| Réseau privé hôte | non | oui | oui | non | serveur de test joignable depuis l’hôte seul (souvent 192.168.56.x) |
| Réseau interne | non | non | oui | non | laboratoire de sécurité : VM isolées entre elles |
| Non connecté | non | non | non | non | analyse d’un fichier suspect, hors ligne |
Redirection NAT : port hôte 2222 → port invité 22, puis ssh -p 2222 utilisateur@127.0.0.1. ! En mode pont, la VM est exposée au réseau local comme un vrai poste : la mettre à jour.
Get-FileHash f.iso (PowerShell) ou sha256sum f.iso, à comparer à celle publiée.| Mémoire | Linux sans bureau : 1 à 2 Go · avec bureau : 4 Go · Windows 11 : 4 Go minimum ; laisser au moins la moitié à l’hôte |
| Processeurs | 2 suffisent souvent ; ne jamais dépasser le nombre de cœurs physiques |
| Disque | allocation dynamique ; 25 Go pour un Linux de bureau, 64 Go minimum pour Windows 11 |
| Windows 11 | exige aussi TPM 2.0 et démarrage sécurisé (virtuels depuis VirtualBox 7) |
| Affichage | mémoire vidéo au maximum si l’interface graphique rame |
| Arrêt ACPI | demande polie : l’invité s’éteint proprement |
| Extinction forcée | = débrancher la prise : risque de corruption |
| Enregistrer l’état | met la VM en sommeil sur disque ; reprise à l’identique |
| Pause | gèle la VM en mémoire |
/media/sf_nom, accessible au groupe vboxsf : sudo usermod -aG vboxsf $USER, puis rouvrir la session.open-vm-tools (VMware), qemu-guest-agent et spice-vdagent (KVM).scp -P 2222 f utilisateur@127.0.0.1: (serveur SSH à installer dans l’invité : sudo apt install openssh-server).| VDI | format natif de VirtualBox |
| VMDK | VMware ; lu aussi par VirtualBox et QEMU |
| VHD · VHDX | Hyper-V ; VHDX aussi pour le disque de WSL 2 |
| qcow2 | QEMU / KVM : dynamique, instantanés internes |
| raw · img | image brute, octet par octet |
| OVA · OVF | machine entière exportée (disques + réglages) : format d’échange entre hyperviseurs |
| Dynamique | grossit à l’usage, ne rétrécit pas seul ; économe |
| Fixe | taille réservée d’emblée ; un peu plus rapide |
Convertir : qemu-img convert -f vmdk -O qcow2 a.vmdk b.qcow2. Agrandir le disque ne suffit pas : étendre ensuite la partition dans l’invité.
| Instantané | fige disque (et mémoire si la VM tourne) ; retour en quelques secondes ; dépend du disque d’origine |
| Clone complet | copie indépendante de la VM |
| Clone lié | partage le disque du parent : léger, mais inutilisable sans lui |
| Export OVA | un seul fichier pour déplacer la VM vers un autre poste ou hyperviseur |
| Sauvegarde | copie du dossier de la VM éteinte sur un autre support |
! Un instantané n’est pas une sauvegarde : si le disque d’origine est perdu, l’instantané l’est aussi. Supprimer un instantané fusionne les différences sans toucher à l’état actuel. Éviter les longues chaînes.
labo) : elles se voient, et rien d’autre.10.10.10.1, 10.10.10.2).| VirtualBox VMs/ | dans le dossier personnel ; un sous-dossier par VM |
| vm.vbox · vm.vdi | réglages (XML) · disque virtuel |
| Snapshots/ | disques différentiels, états mémoire |
| Logs/VBox.log | à lire quand la VM refuse de démarrer |
! Déplacer, renommer : par VirtualBox, jamais à la main.
virtio-net).Chaque commande ci-dessous commence par VBoxManage : VBoxManage list vms.
| list vms | VM enregistrées (list runningvms : en marche) | |||||||
| list ostypes | identifiants de systèmes pour --ostype | |||||||
| showvminfo vm | configuration complète | |||||||
| startvm vm --type headless | démarrer sans fenêtre (serveur) | |||||||
| controlvm vm acpipowerbutton | arrêt propre | |||||||
| controlvm vm savestate | enregistrer l’état et arrêter | |||||||
| controlvm vm poweroff | ! extinction forcée | |||||||
| controlvm vm pause · resume | geler · reprendre | |||||||
| Instantanés | ||||||||
| snapshot vm take nom | prendre (--description possible) | |||||||
| snapshot vm list | lister | |||||||
| snapshot vm restore nom | revenir (VM éteinte) | |||||||
| snapshot vm delete nom | supprimer (fusion) | |||||||
| Cloner, déplacer, supprimer | ||||||||
| clonevm vm --name copie --register | clone complet, enregistré | |||||||
| export vm -o vm.ova | exporter en OVA | |||||||
| import fichier.ova | importer | |||||||
| unregistervm vm --delete | ! supprime la VM et ses disques | |||||||
| Réglages (VM éteinte) | ||||||||
| modifyvm vm --memory 4096 --cpus 2 | mémoire en Mo, processeurs | |||||||
| modifyvm vm --nic1 nat | carte 1 : nat, bridged, intnet, hostonly, natnetwork, none | |||||||
| modifyvm vm --nic1 intnet --intnet1 labo | réseau interne nommé « labo » | |||||||
modifyvm vm --natpf1 "ssh,tcp,,2222,,22" redirection NAT : port 2222 de l’hôte → port 22 de l’invité | ||||||||
sharedfolder add vm --name nom --hostpath chemin --automount dossier partagé, monté automatiquement | ||||||||
modifymedium disk f.vdi --compact compacter un disque dynamique (après remise à zéro de l’espace libre dans l’invité) | ||||||||
Sous Windows, VBoxManage.exe se trouve dans C:\Program Files\Oracle\VirtualBox (souvent absent du PATH).
# chaque ligne commence par VBoxManage createvm --name labo --ostype Ubuntu_64 --register modifyvm labo --memory 4096 --cpus 2 --nic1 nat createmedium disk --filename labo.vdi --size 25600 storagectl labo --name SATA --add sata storageattach labo --storagectl SATA --port 0 --device 0 --type hdd --medium labo.vdi # suite de la ligne storageattach labo --storagectl SATA --port 1 --device 0 --type dvddrive --medium systeme.iso # suite startvm labo
--size en Mo : 25600 = 25 Go. Identifiant exact du système : list ostypes.
| Ctrl droit | touche hôte : libère souris et clavier |
| Hôte+F | plein écran · Hôte+C mode redimensionné |
| Hôte+Suppr | envoie Ctrl+Alt+Suppr à l’invité |
| Hôte+T | prendre un instantané |
| Hôte+H | arrêt ACPI |
| virsh list --all | toutes les VM, allumées ou non |
| virsh start vm | démarrer |
| virsh shutdown vm | arrêt propre (ACPI) |
| virsh destroy vm | ! extinction forcée — ne supprime rien, malgré le nom |
| virsh undefine vm | retirer la VM ; disques conservés sauf --remove-all-storage |
| virsh autostart vm | démarrer avec l’hôte |
| virsh console vm | console série ; sortir : Ctrl+] |
| virsh dominfo vm | état, mémoire, processeurs |
| virsh snapshot-create-as vm nom | instantané |
| virsh snapshot-list vm | lister |
| virsh snapshot-revert vm nom | revenir |
| virsh net-list --all | réseaux virtuels |
| qemu-img create -f qcow2 d.qcow2 20G | créer un disque de 20 Go |
| qemu-img info d.qcow2 | format, taille réelle et virtuelle |
| qemu-img resize d.qcow2 +10G | agrandir de 10 Go |
Interface graphique : virt-manager. Gérer sans sudo : sudo usermod -aG libvirt $USER. Noms des paquets (QEMU, libvirt) : selon la distribution.
| wsl --install | installer WSL et Ubuntu (administrateur, redémarrage) |
| wsl -l -o | distributions disponibles (--list --online) |
| wsl --install distribution | en installer une autre |
| wsl -l -v | installées, état, version 1 ou 2 |
| wsl -d distribution | ouvrir une distribution précise |
| wsl --shutdown | arrêter toutes les distributions et la VM |
| wsl -t distribution | arrêter une distribution (--terminate) |
| wsl --export d f.tar | sauvegarder une distribution |
| wsl --import nom dossier f.tar | la restaurer ailleurs |
| wsl --unregister d | ! supprime la distribution et toutes ses données, sans retour |
| wsl --update · --version · --status | mettre à jour · versions · configuration |
# %UserProfile%\.wslconfig — limiter la VM de WSL 2
[wsl2]
memory=4GB
processors=2Appliquer : wsl --shutdown. Fichiers Windows vus de Linux : /mnt/c ; fichiers Linux vus de Windows : \\wsl.localhost\distribution. Travailler dans le système de fichiers Linux : bien plus rapide.
| Get-VM | lister les VM |
| Start-VM -Name vm | démarrer |
| Stop-VM -Name vm | arrêt propre (-TurnOff : forcé) |
| Checkpoint-VM -Name vm -SnapshotName nom | point de contrôle (= instantané) |
| Restore-VMSnapshot -VMName vm -Name nom | revenir |
Activation : Fonctionnalités de Windows → Hyper-V. Commandes PowerShell en administrateur.
docker …votre terminaldockerdconstruit, lance, surveilleimages · conteneurs · volumes · réseauxdocker build : Dockerfile → image · docker pull : registre → image locale · docker run : image → conteneur.containerd gère les conteneurs, runc les crée à l’aide du noyau (espaces de noms, cgroups).| Espaces de noms | ce que le processus voit : ses processus, son réseau, ses montages, son nom d’hôte |
| Groupes de contrôle | ce qu’il peut consommer : mémoire, processeur, disque, nombre de processus (cgroups) |
| Capacités | les pouvoirs de root découpés ; Docker n’en laisse qu’une partie |
| seccomp, AppArmor, SELinux | filtrent les appels système et les accès |
| Couches (OverlayFS) | image en lecture seule, partagée + couche inscriptible propre au conteneur |
Aucune « machine » : un conteneur est un processus ordinaire de l’hôte, simplement cloisonné.
docker runcommande-den arrière-plan--name webnom-p 8080:80port hôte:conteneurnginx:alpineimage:étiquettePuis ouvrir http://localhost:8080. Tout ce qui suit l’image remplace sa commande par défaut : docker run --rm alpine ls /etc.
| -d | détaché (arrière-plan) ; affiche l’identifiant |
| -it | interactif avec terminal : docker run -it alpine sh |
| --rm | supprimer le conteneur à l’arrêt |
| --name nom | nom lisible (sinon nom aléatoire) |
| -p 8080:80 | publier : port 8080 de l’hôte → 80 du conteneur |
| -p 127.0.0.1:8080:80 | publier pour l’hôte seulement |
| -e VAR=valeur | variable d’environnement (--env-file f) |
| -v volume:/chemin | monter un volume nommé |
| -v "$(pwd)":/app | monter le dossier courant (Bash) |
| -w /app | dossier de travail |
| --restart unless-stopped | relancer après panne ou redémarrage |
| --memory 512m --cpus 1.5 | limiter mémoire et processeur |
| --user 1000:1000 | s’exécuter sans être root |
| --network réseau | rejoindre un réseau |
| --entrypoint sh | remplacer le point d’entrée |
Formes longues équivalentes : docker container run = docker run, docker container ls = docker ps, docker image ls = docker images.
create→crééstart→en marchestop→arrêtérm→supprimé| docker run | = create + start |
| docker stop c | signal SIGTERM, puis SIGKILL après 10 s |
| docker kill c | arrêt immédiat (SIGKILL) |
| docker start · restart c | relancer un conteneur arrêté |
| docker pause · unpause c | geler · reprendre |
| docker rm c | supprimer un conteneur arrêté (-f : même en marche) |
Un conteneur vit tant que son processus principal vit : si ce processus se termine, le conteneur s’arrête.
| docker ps | conteneurs en marche (-a : tous) |
| docker logs -f --tail 100 c | suivre le journal (--since 10m) |
| docker exec -it c sh | ouvrir un shell dans un conteneur en marche (bash s’il existe) |
| docker stats | processeur, mémoire, réseau en direct |
| docker top c | processus du conteneur |
| docker inspect c | tout le détail en JSON |
| docker inspect -f '{{.State.Status}}' c | extraire un champ |
| docker port c | ports publiés |
| docker cp c:/chemin ./ | copier depuis (ou vers) un conteneur |
| docker diff c | fichiers modifiés depuis l’image |
| docker events | événements du démon en direct |
docker run hello-world docker run -it --rm alpine sh # shell jetable docker run -d --name web -p 8080:80 nginx:alpine docker ps # web est « Up » docker logs web # journal d’accès docker stop web && docker rm web # ménage
Linux | dépôt officiel de Docker, puis paquets docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin, docker-compose-plugin |
| sudo docker run hello-world | test : télécharge et lance une image d’essai |
| docker version · info | versions du client et du démon · configuration |
| sudo systemctl enable --now docker | démarrer le démon, et à chaque démarrage |
! Désinstaller d’abord les paquets non officiels (docker.io, podman-docker…). Le script get.docker.com : réservé aux essais, pas à la production.
| docker ps -q | identifiants seuls | |||||||
| docker ps -a -f status=exited | filtrer : conteneurs arrêtés | |||||||
| docker ps -f name=web | filtrer par nom | |||||||
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" colonnes choisies | ||||||||
| docker stop $(docker ps -q) | arrêter tout ce qui tourne (Bash) | |||||||
Un préfixe unique de l’identifiant suffit : docker stop 3f2a.
docker.io/registrelibrary/espace de nomspostgresdépôt:17étiquette@sha256:…empreintelibrary = images officielles.latest — ce n’est pas forcément la plus récente, juste l’étiquette par défaut.@sha256: désigne un contenu immuable ; une étiquette peut être déplacée.| docker pull image:tag | télécharger |
| docker images | images locales (docker image ls) |
| docker images -f dangling=true | images « pendantes », sans nom |
| docker rmi image | supprimer (si aucun conteneur ne l’utilise) |
| docker tag src registre/nom:tag | donner un autre nom |
| docker login registre | s’authentifier (Docker Hub par défaut) |
| docker push registre/nom:tag | publier |
| docker history image | couches et instructions qui les ont créées |
| docker save -o f.tar image | exporter une image dans un fichier… |
| docker load -i f.tar | … et la charger sur une autre machine |
| docker search mot | chercher sur Docker Hub |
! docker export / import travaillent sur un conteneur : système de fichiers aplati, sans couches ni réglages. docker commit fige un conteneur bricolé à la main : préférer un Dockerfile, reproductible.
# syntax=docker/dockerfile:1 FROM python:3.14-slim # base officielle, version fixée WORKDIR /app # dossier de travail COPY requirements.txt . # 1. les dépendances… RUN pip install --no-cache-dir -r requirements.txt COPY . . # 2. …puis le code RUN useradd --create-home appli USER appli # ne pas rester root ENV PORT=8000 EXPOSE 8000 # documente le port CMD ["python", "app.py"] # commande par défaut
| docker build -t appli:1.0 . | construire ; le . final = contexte envoyé au démon |
| -f autre.Dockerfile | autre fichier que Dockerfile |
| --no-cache | tout reconstruire |
| --build-arg VAR=val | valeur d’un ARG |
| --target étape | s’arrêter à une étape nommée |
| --platform linux/amd64 | architecture visée (PC ou ARM) |
docker login # Docker Hub
docker tag appli:1.0 compte/appli:1.0
docker push compte/appli:1.0Autre registre : préfixer par son adresse, registre/appli:1.0. ! Un dépôt public est visible de tous.
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD curl -fs http://localhost:8000/ || exit 1
docker ps affiche alors (healthy), (unhealthy) ou (health: starting). ! L’outil appelé (curl) doit exister dans l’image.
| FROM | image de départ ; FROM … AS nom nomme une étape |
| RUN | exécute une commande à la construction ; crée une couche |
| COPY | copie depuis le contexte (--chown=u:g) |
| ADD | comme COPY + archives et URL : préférer COPY |
| WORKDIR | dossier courant des instructions suivantes |
| ENV | variable conservée dans l’image |
| ARG | variable de construction seulement |
| EXPOSE | documente un port ; ne publie rien |
| USER | utilisateur des instructions suivantes et du conteneur |
| VOLUME | point de montage prévu pour des données |
| ENTRYPOINT | programme toujours lancé |
| CMD | commande ou arguments par défaut |
| HEALTHCHECK | test de bonne santé périodique |
| LABEL | métadonnées : auteur, version, licence |
CMD ["app", "-v"] | forme exec (JSON) : le programme est le processus 1 et reçoit les signaux → à préférer |
CMD app -v | forme shell : lancé par /bin/sh -c ; ! docker stop attend souvent les 10 s |
ENTRYPOINT + CMD | ENTRYPOINT ["ping"] + CMD ["localhost"] ; docker run img exemple.org remplace seulement CMD |
RUN apt-get update \ && apt-get install -y --no-install-recommends curl \ && rm -rf /var/lib/apt/lists/*
FROM node:22 AS build # 1. outils complets WORKDIR /src COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # produit /src/dist FROM nginx:alpine # 2. image finale légère COPY --from=build /src/dist /usr/share/nginx/html
L’image finale ne contient que le résultat : ni compilateur, ni sources, ni dépendances de développement.
.git
node_modules
*.log
.env # secrets : jamais dans le contexte-slim, alpine, distroless), version fixée.ENV, ARG et fichiers copiés restent lisibles (docker history, couches).HEALTHCHECK pour les services.| Type | Principe | Pour |
|---|---|---|
| Volume nommé | géré par Docker, hors du conteneur ; survit à docker rm | données d’une base, fichiers d’une application |
| Montage lié (bind) | un dossier de l’hôte vu dans le conteneur | développement : code source édité sur l’hôte |
| tmpfs | en mémoire vive, effacé à l’arrêt (Linux) | fichiers temporaires, sensibles |
| Couche du conteneur | écrite dans le conteneur lui-même | ! perdue avec docker rm |
| -v donnees:/var/lib/data | volume nommé (créé s’il n’existe pas) | |||||||
| -v /srv/site:/site:ro | montage lié, en lecture seule | |||||||
| -v "$(pwd)":/app | dossier courant · PowerShell : "${PWD}:/app" | |||||||
--mount type=volume,src=donnees,dst=/data forme longue, explicite | ||||||||
--mount type=bind,src=/srv/site,dst=/site montage lié ; refuse un chemin d’hôte absent | ||||||||
| --tmpfs /tmp | dossier temporaire en mémoire | |||||||
-v crée silencieusement un dossier d’hôte absent (appartenant à root) ; --mount signale l’erreur.--user.| docker volume create v | créer |
| docker volume ls | lister |
| docker volume inspect v | emplacement réel (Mountpoint) |
| docker volume rm v | ! supprimer, avec les données |
| docker volume prune | volumes anonymes inutilisés |
| docker volume prune -a | ! tous les volumes inutilisés |
# sauvegarde : archive dans le dossier courant docker run --rm -v donnees:/source:ro \ -v "$(pwd)":/sauv alpine \ tar czf /sauv/donnees.tar.gz -C /source . # restauration dans un volume (vide) docker run --rm -v donnees:/cible \ -v "$(pwd)":/sauv alpine \ tar xzf /sauv/donnees.tar.gz -C /cible
Arrêter d’abord le conteneur qui écrit dans le volume. Pour une base de données, préférer son outil d’export (pg_dump, mysqldump).
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" },
"data-root": "/srv/docker",
"default-address-pools": [
{ "base": "10.200.0.0/16", "size": 24 } ]
}json-file sans rotation par défaut : un conteneur bavard remplit le disque. Les options valent pour les conteneurs créés ensuite.data-root : déplacer le stockage de Docker ; default-address-pools : si 172.17.x.x entre en conflit avec le réseau local.sudo systemctl restart docker · Docker Desktop : Settings → Docker Engine.| bridge (défaut) | réseau privé sur l’hôte ; ports publiés avec -p |
| bridge défini par l’utilisateur | idem + résolution par nom : db, cache… → à utiliser |
| host | partage la pile réseau de l’hôte, sans isolement (Linux) |
| none | aucun réseau |
| overlay | réseau commun à plusieurs hôtes (Swarm) |
| macvlan | adresse propre sur le réseau local, comme une machine physique |
| docker network ls | lister |
| docker network create r | créer un réseau bridge |
| docker run --network r … | lancer dans ce réseau |
| docker network connect r c | brancher un conteneur existant |
| docker network inspect r | conteneurs et adresses |
| docker network rm · prune | supprimer un réseau · les inutilisés |
docker network create appnet
docker run -d --name cache --network appnet redis:alpine
docker run -it --rm --network appnet redis:alpine \
redis-cli -h cache ping # → PONGLe nom du conteneur (cache) sert de nom d’hôte. Sur le réseau bridge par défaut, cette résolution ne fonctionne pas.
localhost:8080→hôte-p 8080:80→conteneur :80| -p 8080:80 | toutes les interfaces de l’hôte (0.0.0.0 et [::]) : visible du réseau |
| -p 127.0.0.1:8080:80 | depuis l’hôte seulement |
| -p 5353:53/udp | port UDP |
| -P | tous les ports EXPOSE vers des ports hôte au hasard |
ufw ; publier sur 127.0.0.1 ce qui ne doit pas sortir.localhost = le conteneur lui-même, pas l’hôte.host.docker.internal (Docker Desktop ; sous Linux : --add-host=host.docker.internal:host-gateway).db:5432), sans publication.| docker port c | publications effectives | |||||||
| docker network inspect r | qui est branché, avec quelle adresse | |||||||
| docker exec c getent hosts db | le nom db se résout-il ? (ou nslookup db, selon l’image) | |||||||
| docker exec c wget -qO- http://web:8000 | le service répond-il ? (curl s’il existe) | |||||||
| sudo ss -tlnp | hôte Linux : quel programme écoute sur quel port ? | |||||||
docker run --rm -it --network container:c alpine sh shell de dépannage dans la pile réseau du conteneur, quand son image n’a aucun outil | ||||||||
/var/lib/docker — images, conteneurs, volumes. ! N’y rien modifier à la main.docker system df -v : détail par image, conteneur, volume.~/.docker/config.json : réglages du client ; ! docker login y range les identifiants simplement encodés, sans chiffrement, faute d’assistant d’identifiants (credential helper).services: web: # nom du service = nom d’hôte build: . # image construite ici ports: - "127.0.0.1:8000:8000" environment: DB_HOST: db # le service « db » env_file: .env # variables injectées depends_on: db: condition: service_healthy restart: unless-stopped db: image: postgres:17 # version fixée environment: POSTGRES_USER: appli POSTGRES_DB: appli POSTGRES_PASSWORD_FILE: /run/secrets/db_mdp secrets: [db_mdp] volumes: - donnees:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U appli"] interval: 5s retries: 5 volumes: donnees: # volume nommé secrets: db_mdp: file: ./db_mdp.txt # hors dépôt Git !
Le mot de passe est lu dans un fichier monté en /run/secrets/, pas écrit en clair dans le YAML. ! YAML : indentation par espaces (jamais de tabulation) ; mettre les ports entre guillemets.
depends_on seul garantit l’ordre de lancement, pas que le service soit prêt.condition: service_healthy, Compose attend que le healthcheck du service réussisse.| docker run | compose.yaml |
|---|---|
-p 8080:80 | ports: ["8080:80"] |
-v donnees:/data | volumes: ["donnees:/data"] + section volumes: |
-e VAR=val | environment: puis VAR: val |
--env-file .env | env_file: .env |
--restart unless-stopped | restart: unless-stopped |
--network appnet | networks: [appnet] |
--memory 512m | mem_limit: 512m |
--name web | container_name: web (rarement utile) |
image cmd | command: cmd |
docker compose pull # nouvelles images docker compose up -d # recrée ce qui a changé docker image prune # anciennes images
docker compose up -d --build.compose.yaml (préféré) ; docker-compose.yml reste lu.docker compose (avec une espace) ; l’ancien docker-compose (tiret) est obsolète.version: en tête de fichier est obsolète : Compose l’ignore et avertit.projet_default relie les services : chacun joint les autres par son nom.-p nom pour le changer).Chaque commande commence par docker compose : docker compose up -d.
| up -d | créer et démarrer en arrière-plan |
| up -d --build | reconstruire les images d’abord |
| ps | état des services |
| logs -f service | suivre les journaux |
| exec service sh | shell dans un service en marche |
| run --rm service cmd | tâche ponctuelle dans un conteneur neuf |
| restart service | redémarrer |
| stop · start | arrêter · relancer sans supprimer |
| pull | mettre à jour les images |
| config | fichier final, variables résolues : valider |
| down | supprimer conteneurs et réseau ; volumes gardés |
| down -v | ! supprime aussi les volumes : données perdues |
| -f f.yaml … | utiliser un autre fichier |
| image · build | image existante · à construire (build: ./dossier) |
| ports | publication "hôte:conteneur" |
| volumes | volume nommé ou montage lié ./src:/app |
| environment · env_file | variables · fichier de variables |
| depends_on | ordre de démarrage (+ condition) |
| healthcheck | test de santé |
| restart | no, always, on-failure, unless-stopped |
| command · entrypoint | remplacer CMD · ENTRYPOINT |
| networks | réseaux rejoints |
| profiles | service facultatif : docker compose --profile p up |
| deploy.resources | limites de mémoire et de processeur |
.env du dossier du projet : lu automatiquement pour remplacer ${VAR} dans le YAML.${VAR:-défaut} valeur par défaut · ${VAR:?message} erreur si absente.env_file: injecte des variables dans le conteneur : ce n’est pas le même mécanisme.compose.override.yaml, s’il existe, est fusionné automatiquement : réglages de développement..env et fichiers de secrets : dans .gitignore et .dockerignore.| --user 1000:1000 | ne pas tourner en root |
| --read-only --tmpfs /tmp | système de fichiers en lecture seule |
| --cap-drop ALL | retirer les privilèges du noyau (--cap-add au cas par cas) |
| --security-opt no-new-privileges | interdire l’élévation (setuid) |
| --memory · --cpus · --pids-limit | borner les ressources |
| -p 127.0.0.1:… | ne rien exposer sans raison |
| --network none | couper le réseau |
--privileged ni -v /var/run/docker.sock:… sans comprendre : c’est donner l’hôte.docker donne des droits équivalents à root sur l’hôte (documentation officielle). Alternatives : mode rootless, Podman.docker scout cves image, Trivy, Grype).secrets:), jamais dans l’image ni dans le dépôt./mnt/c).--cap-drop).healthcheck et restart: unless-stopped.max-size).127.0.0.1, derrière un proxy inverse en HTTPS.podman run, podman ps, podman build… (alias docker=podman).docker.io/library/nginx:alpine.VBoxManage.| docker system df | espace occupé : images, conteneurs, volumes, cache |
| docker container prune | conteneurs arrêtés |
| docker image prune | images pendantes (-a : toutes les inutilisées) |
| docker builder prune | cache de construction |
| docker volume prune | volumes anonymes (-a : tous les inutilisés) |
| docker system prune | conteneurs arrêtés, réseaux inutilisés, images pendantes, cache |
| docker system prune -a --volumes | ! grand ménage ; volumes nommés épargnés |
Tout prune demande confirmation ; -f la saute. Lire la liste avant de valider.
permission denied while trying to connect to the Docker daemon socket | utilisateur hors du groupe docker : sudo, ou ajout au groupe puis nouvelle session |
Cannot connect to the Docker daemon … Is the docker daemon running? | démon arrêté : sudo systemctl start docker, ou lancer Docker Desktop |
port is already allocated | port de l’hôte déjà pris : en choisir un autre |
Conflict. The container name "/web" is already in use | docker rm web ou autre --name |
pull access denied … repository does not exist | nom mal orthographié ou image privée (docker login) |
no space left on device | docker system df, puis ménage |
exec format error | image d’une autre architecture (ARM ↔ PC) : --platform |
VT-x is disabled in the BIOS · 0x80370102 (WSL) | virtualisation matérielle désactivée : l’activer dans l’UEFI |
0 | fin normale |
1 | erreur de l’application : lire docker logs |
125 | docker run lui-même a échoué (option, image) |
126 · 127 | commande non exécutable · introuvable |
137 | tué par SIGKILL (128 + 9) : souvent mémoire dépassée → docker inspect -f '{{.State.OOMKilled}}' c |
143 | arrêté par SIGTERM (128 + 15), par exemple docker stop |
Démarche : docker ps -a → docker logs → docker inspect → docker exec -it c sh ; conteneur qui s’arrête aussitôt : docker run -it --rm --entrypoint sh image pour regarder dedans.
| bind mount | montage lié | layer | couche |
| bridged | accès par pont | linked clone | clone lié |
| build context | contexte | namespace | espace de noms |
| checkpoint | point de contrôle | prune | purger |
| dangling image | image pendante | registry | registre |
| digest | empreinte | restart policy | politique de redémarrage |
| guest additions | additions invité | rootless | sans root |
| headless | sans fenêtre | snapshot | instantané |
| health check | test de santé | tag | étiquette |
| host-only | réseau privé hôte | volume | volume |