Docker/Gestion des conteneurs

Registres modifier

Les 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 modifier

Pour 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 modifier

Pour 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 modifier

Pour 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 modifier

Pour lancer un conteneur à construire, il faut le faire depuis le dossier de son Dockerfile[3] :

docker build .

ps et rm modifier

Pour 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 modifier

Pour toutes les images :

docker image ls

Pour en supprimer une :

docker rmi nom_image

save et load modifier

Permet 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 modifier

Pour 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 modifier

Pour 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
 Mieux faut traiter les conteneurs avant les volumes car prune ne supprime pas les volumes utilisés par des conteneurs.

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 modifier

Renommer une image.

Références modifier