Voir aussi https://www.alsacreations.com/tuto/lire/1836-Docker--decouverte-et-environnement-LAMP-pour-WordPress.html et https://www.alsacreations.com/tuto/lire/1838-Docker-compose.html
- Compiler un Dockerfile dans le dossier courant pour créer une image :
docker build -t <image:tag> . - Compiler une image en conteneur et l'exécuter :
docker run --name <nomducontainer> <image:tag>(+ voir autres options) - Démarrer ou arrêter un conteneur s'il est déjà existant :
docker start <nomducontainer>(oustop) - Arrêter tous les conteneurs actifs :
docker stop $(docker ps -aq) - Exécuter une commande dans le conteneur :
docker container exec -it <nomducontainer> <lacommande>(par exemplebashpour ouvrir un shell) - Lister tous les conteneurs :
docker container lsoudocker ps -a - Lister toutes les images :
docker image ls - Supprimer un conteneur :
docker container rm <nomducontainer>(-fforce) - Supprimer une image :
docker image rm <image> - Utiliser le chemin courant dans une commande docker :
$PWD - Créer un network :
docker network create my-custom-netet l'utiliser au run :--network=my-custom-net - Copier un fichier dans un conteneur actif :
docker cp .\fichier.sql.gz 133713371337:/rootoù 133713371337 est l'ID du conteneur obtenu pardocker container listet/rootle chemin de destination. - Redémarrer tous les conteneurs arrêtés :
docker restart $(docker ps -a -q) - Renommer une image :
docker tag <old> <new> - Mettre à jour une politique de redémarrage :
docker update --restart=unless-stopped <nomducontainer> - Annuler le redémarrage auto sur tous les coneneurs :
docker update --restart=no $(docker ps -a -q)
- Compiler et démarrer tous les conteneurs
docker compose -p <projet> up -d(-d: "détache" en background pour rendre la main,-p: nom du projet sinon il utilise le nom du dossier courant)- 🏗️ Ajouter
--buildpour forcer la recompilation de l'image d'après le fichier Dockerfile
- 🏗️ Ajouter
- Compiler sans démarrer les conteneurs
docker compose build(en option ajouter le nom du service concerné,--no-cachepour éviter le cache) - Tout arrêter, supprimer les conteneurs, volumes et réseaux
docker compose -p <projet> down - Stopper un service, le supprimer ainsi que ses volumes anonymes
docker compose rm -s -v <nom_du_service> - Journaux
docker compose logs - Statut des conteneurs
docker compose -p <projet> ps - Liste des images utilisées
docker compose images - Exécute une commande dans un conteneur
docker compose exec <service> <command> - Arrêter et supprimer
docker compose rm --stop - Arrêter
docker compose stop <service> - Démarrer
docker compose start <service> - Mettre en pause
docker compose pause <service> - Reprendre
docker compose unpause <service> - Visualiser la conf intégrant les variables d'env
docker compose convert - Lister tous les projets démarrés à partir de compose
docker compose ls
- Statistiques cpu/ram temps réel
docker stats - Visualiser l'espace occupé
docker system df - Ressources pour les processus/conteneurs
docker ps --size - Nettoyer les images/volumes inutilisés
docker image prune/docker volume prune - Nettoyer le build cache
docker builder prune/docker buildx prune - Nettoyer toutes les ressources système inutilisées
docker system prune
Télécharge et exécute immédiatement un shell dans un container "alpine" super-léger : docker run -it alpine /bin/sh
- Informations système :
docker info - Savoir quel dossier a initialisé un container :
docker inspect <nomducontainer> | grep "com.docker.compose.project.working_dir" - Logs :
docker logs <nomducontainer>(ajouter-fpour suivre en continu) - Ports ouverts :
docker port <nomducontainer> - Processus :
docker top <nomducontainer> - Informations techniques :
docker inspect <nomducontainer> - Différences appliquées :
docker diff <nomducontainer>
Utiliser un fichier .dockerignore pour exclure fichiers et dossiers lors d'une étape de build (notamment commandes ADD, COPY).
docker volume ls -f 'dangling=true' pour lister les volumes détachés et leur hash, docker volume inspect <volume_hash> pour localiser l'emplacement sur le disque (par exemple /var/lib/docker/volumes/...), examiner pour chacun le dossier /_data
-d: permet de détacher l'exécution du conteneur du terminal courant-p: permet de lier un port (local:container-p 8080:80)-u: permet de spécifier l'utilisateur+groupe d'exécution-v: permet de déclarer un volume (local:container-v /var/path/to/mydata/mysql:/var/lib/mysql)-e: permet de passer/spécifier une variable d'environnement-i: permet d'avoir un terminal interactif (stdin), par exemple pour entrer un mot de passe au prompt (souvent combiné avect)-t: alloue un pseudo-tty--link: permet de "lier" un hostname d'un conteneur à un autre (par exemple un serveur mysql dans un 1er conteneurmysqlserverdevient--link mysqlserver:dbdans le 2e, on utilise alorsdb)--restart always: indique au service Docker de redémarrer le conteneur au boot et de le maintenir actif si Docker est lui-même relancé
Astuces :
- ajouter
-v /etc/localtime:/etc/localtime:ropour faire correspondre avec le fuseau horaire hôte - ajouter
-m 256mpour limiter la mémoire à 256 Mo - ajouter
--read-onlypour que le filesystem soit en lecture seule - suffixer un volume par
:ropour qu'il soit en lecture seule - afficher les restart policies de tous les conteneurs existants
docker inspect --format "{{.HostConfig.RestartPolicy.Name}}, {{.Name}}, {{.Id}}" $(docker ps -qf status=running) | sort -t, -k1 |column -s, -t - après compilation de l'image,si le conteneur ne se lance pas, on peut tout de même l'utiliser/analyser avec
docker run -it <nomdelimage> <commande>par exempledocker run -it alpine lsoudocker run -it alpine /bin/bash -c "echo $HOME"
Le fichier Dockerfile est compilé en image à l'aide de docker build -t test/myapp .
https://hadolint.github.io/hadolint/ est un Dockerfile Linter.
FROMDéfinit l'image source (FROM php:8.1-cli-alpine).ENVDéfinit une variable d'environnement à la compilation et à l'exécution (ENV MY_VAR=kiwi).LABELAjoute une métadonnée à l'image.WORKDIRDéfinit le dossier de travail pour les commandes suivantes (WORKDIR /var/www/html).RUNExécute une commande à la compilation (RUN echo Hello).CMDExécute une commande au démarrage du conteneur (CMD [ "php", "./your-script.php" ]ouCMD [ "node", "server.js" ]).EXPOSEInforme Docker que le conteneur écoute sur un port (EXPOSE 80ouEXPOSE 80/tcp).COPYCopie des fichiers/répertoires depuis une source hôte vers le filesystem de l'image.--chownmodifie les droits à la volée.ADDAjoute des fichiers/répertoires (y compris depuis une URL ou une extraction tar) dans le filesystem de l'image (ADD test.txt dir/).--chownmodifie les droits à la volée.VOLUMECrée un point de montage (VOLUME /myvol).ENTRYPOINTConfigure un conteneur comme un exécutable.USERDéfinit l'id utilisateur (UID) et groupe (GID) à utiliser lorsque l'image s'exécute et pour toute instruction suivante (RUN, CMD, ENTRYPOINT).ARGDéfinit une variable que l'on peut passer au moment de la compilation avec--build-arg <varname>=<value>.
Liste non exhaustive, voir https://docs.docker.com/engine/reference/builder/.
- Recommandations de sécurité relatives au déploiement de conteneurs Docker | Agence nationale de la sécurité des systèmes d'information
- Assurer des temps d'arrêt minimes avec Docker Compose (courte vidéo YouTube)
- Awesome Self-Host Docker : liste de projets à déployer soi-même avec docker-compose.
- OWASP cheatsheet https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html
- Cheatsheet Quickref https://quickref.me/docker
- From 1.2GB to 54MB: My Docker Image Went on a Diet https://dev.to/hasan_ashab/from-12gb-to-54mb-my-docker-image-went-on-a-diet-apj
- https://blog.gitguardian.com/how-to-improve-your-docker-containers-security-cheat-sheet/
- https://www.viget.com/articles/local-docker-best-practices/
- https://medium.com/better-programming/docker-best-practices-and-anti-patterns-e7cbccba4f19
- https://github.com/FuriKuri/docker-best-practices
- https://snyk.io/fr/blog/10-docker-image-security-best-practices/
- https://www.panoptica.app/research/7-ways-to-escape-a-container
- https://enix.io/fr/blog/cherie-j-ai-retreci-docker-part1/
- https://medium.com/@remyc/comprendre-docker-dockerfile-et-docker-compose-f21fe4ba22cb
- https://code.visualstudio.com/remote/advancedcontainers/develop-remote-host#_connect-using-docker-contexts Développer en remote avec vscode dans un container (
⚠️ vérifier que cela ne persiste pas pour les autres projets car sinon cela pourrait écraser des conteneurs sur le serveur)
Interface graphique : https://iongion.github.io/podman-desktop-companion/
La grande majorité des commandes Docker ont un équivalent Podman (start, stop, logs, port...).
- Tous les conteneurs
podman ps -a - Processus actifs dans un conteneur
podman top <container> - Poids des fichiers
podman ps --size --sort size - Exécuter une commande, par ex un backup MySQL vers l'hôte :
podman exec <container-mysql> mysqldump -uroot -p<password> <nom_base> >dump.sql
- Démarrer à partir d'un fichier docker-compose.yml local
podman-compose up -d - Démarrer à partir d'un fichier compose spécifique
podman-compose -f path/to/compose.yml up -d - Démarrer UN conteneur/service en particulier à partir d'un fichier compose
podman-compose up -d <service> - Retirer un service
podman-compose down <service>(tel que nommé dans le fichier yml, par exempledb) - Si les ports ne sont pas ouverts pour le service
podman-compose run --service-ports <service>
Les volumes limitent les performances, notamment lors de développements WordPress/PHP. Technique :
- Installer WSL2
- Installer Ubuntu ou autre distribution via le Microsoft Store intégré
- Activer l'option dans Docker Use the WSL 2 based engine
- Désormais
git cloneles projets "dans" la vm WSL et y accéder avec Visual Studio Code pour développer
wsl --install
wsl --list --onlineto see all available distroswsl -l -vto see all your currently installed distros
Installer une distribution telle qu'Ubuntu via le Store
Activer l'intégration WSL dans Docker.

