Docker/Gestion des conteneurs
Registres
modifierLes images des conteneurs peuvent être stockées dans un registre, privé ou public comme https://hub.docker.com/.
Pour en récupérer une :
docker login
docker image pull $IMAGE_NAME || echo " >> missing image"
Exemple :
docker image pull maarch/maarchrm:latest
Les images téléchargées sont stockées :
- Sur Linux, dans /var/lib/docker/.
- Sur MacOS, dans /Users/nom_utilisateur/Library/Containers/com.docker.docker/.
- Sur Windows, dans C:\ProgramData\docker\ ou C:\ProgramData\DockerDesktop\.
Pour mettre à jour une image sur un registre à partir d'un Dockerfile :
docker image build
docker image push $IMAGE_NAME
run
modifier"run" s'utiliser pour lancer un conteneur à partir de son image (automatiquement téléchargée si absente en local). Une fois la commande exécutée, le conteneur s'arrête. Exemple qui liste le dossier courant :
docker run maven:latest ls
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
Pour rester connecté dedans, on utilise le mode interactif (-it) :
docker run -it redis
redis-cli
Pour partager un dossier avec la machine hôte, on peut utiliser "-v" pour "volume", ou "--mount" si le conteneur a des services[1]. Exemple qui liste le dossier de la machine hôte partagé avec le conteneur :
docker run -it -v "/$(pwd)/":/usr/src/mymaven maven ls usr/src/mymaven
exec
modifierPour exécuter une commande dans un conteneur. Ex :
docker exec redis sh -c 'pwd'
Autre exemple :
docker exec php8.0-fpm sh -c 'cd /var/www/mon_app; composer install'
Fonctionne aussi avec un fichier :
docker exec redis script.sh
Dans tous les conteneurs
modifierPour lancer une commande dans tous les conteneurs, il faut créer le fichier suivant[2] :
for container in `docker ps -q`; do
docker inspect --format='{{.Name}}' $container;
docker exec -it $container $1;
done
Ensuite le lancer avec la commande en paramètre :
./dockers.sh date
/php7.3-fpm
Thu Mar 19 11:15:34 Europs 2020
/php7.4-fpm
Thu Mar 19 12:15:34 Europs 2020
Rentrer dans un conteneur
modifierPour utiliser le conteneur, on peut rentrer dedans en utilisant le mode interactif :
docker exec -it redis bash
Cela permet d'enchainer les commandes (comme si on était sur un serveur hôte en SSH).
build
modifierPour lancer un conteneur à construire, il faut le faire depuis le dossier de son Dockerfile[3] :
docker build .
ps et rm
modifierPour obtenir la liste des conteneurs lancés :
docker ps
Idem mais avec seulement trois colonnes, triées par nom (colonne n°2) :
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" | (read -r; printf "%s\n" "$REPLY"; sort -k 2 )
Pour tous les conteneurs (lancés ou pas) :
docker ps -a
Pour en supprimer un :
docker rm nom_du_coteneur
image et rmi
modifierPour toutes les images :
docker image ls
Pour en supprimer une :
docker rmi nom_image
save et load
modifierPermet de sauvegarde une image. Pour toutes les sauvegarder :
docker save $(docker images -q) -o images_docker.tar
On peut ensuite les recharger (par exemple sur une autre machine) avec :
docker load --input images_docker.tar
Un save sur Docker Desktop Windows 2.3 ne permettra pas un load sur la 2.2.
stats
modifierPour connaitre la consommation en ressources de chaque conteneur :
docker stats --no-stream
Ex :
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS f10f50a685a6 app_1 0.00% 77.97MiB / 15.38GiB 0.50% 322kB / 1.19MB 11.1MB / 9.2MB 6 6ef747c18fe3 app_2 1.00% 48.89MiB / 15.38GiB 0.31% 6.67kB / 0B 92.7MB / 5.91MB 6
prune
modifierPour supprimer les conteneurs arrêtés[4] :
docker container prune
Les images :
docker image prune
Les réseaux :
docker network prune
Les conteneurs, images et réseaux inutilisés :
docker system prune
Enfin pour les volumes (généralement volumineux) :
docker volume prune
Il existe des filtres[5] :
- -a all : supprime tout.
- -f force.
- --filter : filtre par clé valeur. Si la clé est "until", alors il filtre par date (ex : until=720h).
- --volumes : supprime les volumes des objets en paramètre.
Par exemple pour purger les images et leurs volumes toutes les nuits à 3 h, on peut créer cette tâche planifiée :
0 3 * * * docker system prune --all --volumes -f
tag
modifierRenommer une image.
Références
modifier- ↑ https://docs.docker.com/storage/volumes/
- ↑ https://gist.github.com/timhodson/ea11c76424e5b3f36c017d9d0ca7ad10
- ↑ https://docs.docker.com/engine/reference/builder/
- ↑ https://docs.docker.com/engine/reference/commandline/container_prune/
- ↑ https://docs.docker.com/engine/reference/commandline/system_prune/