Docker – Les commandes utiles

Informations

Ce mémo évolue au fil de mes besoins.
Les ressources sont multiples. Notamment en provenance de la documentation officielle sur https://docs.docker.com/.
Les autres ressources seront affichées au fur et à mesure.

Concept

L’instance d’une image est un container.

Une image est créée avec la commande build et les instructions présentes dans le fichier « Dockerfile »
Elle produit un container lorsqu’elle est exécutée.

Docker information

Connaitre votre configuration Docker :

Utiliser les tags spécifiés sur la page https://hub.docker.com/_/debian/  pour télécharger d’autres images.
Ex avec la version sid :

[pastacode lang= »markup » manual= »docker%20pull%20debian%3Asid » message= » » highlight= » » provider= »manual »/]

Exécuter une image pour vérifier qu’elle fonctionne et rentrer dans le dockerfiles:

[pastacode lang= »markup » manual= »docker%20run%20-ti%20debian%3Alatest%20bash%0A%0AOU%0A%0Adocker%20run%20-ti%20debian%3Asid%20bash » message= » » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20run%20-ti%20debian%3Alatest%20bash%0A%20%0Aroot%405ad9be283549%3A%2F%23%20cat%20%2Fetc%2Fdebian_version%20%0A8.7%0Aroot%405ad9be283549%3A%2F%23%20exit%0A%0AOU%0A%0Adocker%20run%20-ti%20debian%3Asid%20bash%0A%20%0Aroot%401b8e7eea016f%3A%2F%23%20cat%20%2Fetc%2Fdebian_version%20%0A9.0%0Aroot%401b8e7eea016f%3A%2F%23%20exit » message= »Résultat : » highlight= » » provider= »manual »/]

Étapes simples pour utiliser un container

  1. Créer le fichier « Dockerfile » avec les spécifications de l’image
  2. Créer une image  : build
  3. Démarrer un container (instance de l’image) : run
  4. Modifier le container
  5. Enregistrer les modifications du container dans une nouvelle image : commit

Dockerfile

Dans un répertoire donné, créer un fichier « Dockerfile ».

Exemple de contenu le plus simple :

[pastacode lang= »markup » manual= »FROM%20debian%3Ajessie » message= » » highlight= » » provider= »manual »/]

Build

Pour créer une machine basée sur Debian dans un répertoire ./jbnet-test :

[pastacode lang= »markup » manual= »mkdir%20jbnet-test%0Acd%20jbnet-test%0Aecho%20%22FROM%20debian%3Ajessie%22%20%3E%20Dockerfile%0Adocker%20build%20-t%20jbnet-test%20. » message= » » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »Sending%20build%20context%20to%20Docker%20daemon%202.048%20kB%0AStep%201%2F1%20%3A%20FROM%20debian%3Ajessie%0Ajessie%3A%20Pulling%20from%20library%2Fdebian%0Acd0a524342ef%3A%20Pull%20complete%20%0ADigest%3A%20sha256%3Ac3f000ba6bbe71906ca249be92bd04dc3f514d2dd905e0c5f226e8035ee55031%0AStatus%3A%20Downloaded%20newer%20image%20for%20debian%3Ajessie%0A%20—%3E%20054abe38b1e6%0ASuccessfully%20built%20054abe38b1e6″ message= »Résultat : » highlight= » » provider= »manual »/]

Vérifier que les images jbnet-test et debian (sur laquelle jbnet-test est basée) sont disponibles :

[pastacode lang= »markup » manual= »docker%20images%20-a » message= » » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »%0A2%0A3%0AREPOSITORY%20%20TAG%20%20%20%20%20IMAGE%20ID%20%20%20%20%20%20CREATED%20%20%20%20%20%20SIZE%0Adebian%20%20%20%20%20%20jessie%20%20054abe38b1e6%20%2013%20days%20ago%20%20123%20MB%0Ajbnet-test%20%20latest%20%20054abe38b1e6%20%2013%20days%20ago%20%20123%20MB » message= »Résultat » highlight= » » provider= »manual »/]

Liste du ou des container créés :

[pastacode lang= »markup » manual= »docker%20container%20ls%20-a » message= » » highlight= » » provider= »manual »/]

Version dépréciée :

[pastacode lang= »markup » manual= »docker%20ps%20-a » message= » » highlight= » » provider= »manual »/]

Résultat : aucun container puis-qu’aucune exécution n’a été encore lancée.

Run

Lancer en mode interactif un container nommé jbnet-container basé sur l’image jbnet-test et exécuter le bash :

[pastacode lang= »markup » manual= »docker%20run%20-ti%20–name%20jbnet-container%20jbnet-test%20bash » message= » » highlight= » » provider= »manual »/]

Utiliser Ctrl+d pour se déconnecter

[pastacode lang= »markup » manual= »docker%20container%20ls%20-a » message= » » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »%09%0ACONTAINER%20ID%20%20IMAGE%20%20%20%20%20%20%20COMMAND%20%20CREATED%20%20%20%20%20%20%20%20STATUS%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20PORTS%20%20NAMES%0A010947f73b0b%20%20jbnet-test%20%20%22bash%22%20%20%205%20minutes%20ago%20%20Exited%20(0)%205%20minutes%20ago%20%20%20%20%20%20%20%20%20jbnet-container » message= »Résultat : » highlight= » » provider= »manual »/]

Si une nouvelle commande de lancement est exécutée, il y aura 2 container dans la liste.
D’où la nécessité de faire du ménage régulièrement avec les commandes dans le paragraphe « Gérer le container et les images ».
Sinon, le disque risque d’être plein rapidement.

Modifier le contenu du conteneur

Ce sont toutes les commandes que je vais exécuter à l’intérieur, comme un « apt update && apt upgrade ».

Commit

Attention, toutes modifications appliquées dans ces container seront supprimées.
Comme pour git, il faut faire un commit pour appliquer les modifications d’un container à une image.

[pastacode lang= »markup » manual= »docker%20commit%2083988038ac5b%20jbnet-test%3Av1″ message= » » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20images%20-a%0A%20%0AREPOSITORY%20%20TAG%20%20%20%20%20IMAGE%20ID%20%20%20%20%20%20CREATED%20%20%20%20%20%20%20%20SIZE%0Ajbnet-test%20%20v1%20%20%20%20%20%20ee4010a4d74a%20%207%20seconds%20ago%20%20184%20MB%0Ajbnet-test%20%20latest%20%20040fa6b1044b%20%205%20minutes%20ago%20%20174%20MB%0Adebian%20%20%20%20%20%20jessie%20%20054abe38b1e6%20%2013%20days%20ago%20%20%20%20123%20MB » message= » » highlight= » » provider= »manual »/]

Même exemple en créant une nouvelle image jbnet-test2 :

[pastacode lang= »markup » manual= »docker%20commit%20e5cbcba3dde6%20jbnet-test2%3Av1″ message= » » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20images%20-a%0A%20%0AREPOSITORY%20%20%20TAG%20%20%20%20%20IMAGE%20ID%20%20%20%20%20%20CREATED%20%20%20%20%20%20%20%20SIZE%0Ajbnet-test2%20%20v1%20%20%20%20%20%2054ea5a353fc3%20%203%20seconds%20ago%20%20184%20MB%0Ajbnet-test%20%20%20v1%20%20%20%20%20%20ee4010a4d74a%20%202%20minutes%20ago%20%20184%20MB%0Ajbnet-test%20%20%20latest%20%20040fa6b1044b%20%208%20minutes%20ago%20%20174%20MB%0Adebian%20%20%20%20%20%20%20jessie%20%20054abe38b1e6%20%2013%20days%20ago%20%20%20%20123%20MB » message= » » highlight= » » provider= »manual »/]

Gérer les container et images

 

[pastacode lang= »markup » manual= »docker%20images%20-a » message= »Liste des images : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20rmi%20%3Cimage_id%3E » message= »Supprimer une image : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20rmi%20%24(docker%20images%20-q) » message= »Supprimer toutes les images : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20images%20-q » message= »Liste les id des images : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »Liste%20des%20container%20actifs%20%3A » message= »docker container ls » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20ps%20-a » message= »Liste de tous les container : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20rm%20%3Ccontainer_id%3E » message= »Supprimer un container : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20rm%20%24(docker%20ps%20-a%20-q) » message= »Supprimer tous les container : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20commit%20container_id%20image_name » message= »Appliquer les changements d’un container à une image : » highlight= » » provider= »manual »/]

 

Réseau

[pastacode lang= »markup » manual= »docker%20network%20ls » message= »Afficher les réseaux par défaut : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20network%20inspect%20bridge » message= »Afficher les paramètres du réseau bridge : » highlight= » » provider= »manual »/]

Par défaut, les container sont sur le même réseau.

[pastacode lang= »markup » manual= »docker%20run%20-itd%20–name%3Dnetworktest%20debian%0Adocker%20run%20-itd%20–name%3Dnetworktest2%20debian » message= »Tester l’accès réseau bridge sur un container en exécutant 2 container (debian dans l’exemple) : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20network%20inspect%20bridge » message= »Puis regarder la section « Containers » dans le résultat : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%22Name%22%3A%20%22bridge%22%2C%0A%20%20%20%20%20%20%20%20%22Id%22%3A%20%2224198ec9e317da0bb806d6e9426a36137b45d706842dc739265691fd2a38eacd%22%2C%0A%20%20%20%20%20%20%20%20%22Created%22%3A%20%222017-05-08T09%3A07%3A03.192377178%2B02%3A00%22%2C%0A%20%20%20%20%20%20%20%20%22Scope%22%3A%20%22local%22%2C%0A%20%20%20%20%20%20%20%20%22Driver%22%3A%20%22bridge%22%2C%0A%20%20%20%20%20%20%20%20%22EnableIPv6%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%22IPAM%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Driver%22%3A%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Options%22%3A%20null%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Config%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Subnet%22%3A%20%22172.17.0.0%2F16%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Gateway%22%3A%20%22172.17.0.1%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Internal%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%22Attachable%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%22Containers%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2233146aa71ea54d10d789130a015f552ad81a768851104b6f411d031719463845%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Name%22%3A%20%22networktest2%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22EndpointID%22%3A%20%22c44d5ba85e6df3dcb62fc6fcb75efc9fd714ab1d01175273f5cb7618dffba94d%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22MacAddress%22%3A%20%2202%3A42%3Aac%3A11%3A00%3A03%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22IPv4Address%22%3A%20%22172.17.0.3%2F16%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22IPv6Address%22%3A%20%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22b34b0f3896ba650739922f2d270016600611d57fb3ff99292ca21140ca4f9103%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Name%22%3A%20%22networktest%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22EndpointID%22%3A%20%222ce2243097aa0e8a41e12a71705462821b5699c8426ec702c60c3311c3baeecb%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22MacAddress%22%3A%20%2202%3A42%3Aac%3A11%3A00%3A02%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22IPv4Address%22%3A%20%22172.17.0.2%2F16%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22IPv6Address%22%3A%20%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Options%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22com.docker.network.bridge.default_bridge%22%3A%20%22true%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22com.docker.network.bridge.enable_icc%22%3A%20%22true%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22com.docker.network.bridge.enable_ip_masquerade%22%3A%20%22true%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22com.docker.network.bridge.host_binding_ipv4%22%3A%20%220.0.0.0%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22com.docker.network.bridge.name%22%3A%20%22docker0%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22com.docker.network.driver.mtu%22%3A%20%221500%22%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Labels%22%3A%20%7B%7D%0A%20%20%20%20%7D%0A%5D » message= »Résultat : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20network%20disconnect%20bridge%20networktest » message= »Déconnecter le container networktest du réseau bridge : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20network%20create%20-d%20bridge%20mon_reseau%0Adocker%20network%20ls%0Adocker%20network%20inspect%20mon_reseau » message= »Créer son propre réseau bridge et vérifier sa configuration : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »docker%20run%20–network%3Dmon_reseau%20-itd%20–name%3Dnetworktest3%20debian » message= »Exécuter un container en utilisant ce réseau : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »%5B%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%22Name%22%3A%20%22mon_reseau%22%2C%0A%20%20%20%20%20%20%20%20%22Id%22%3A%20%2273702e00f0a7464cd18e470b32309c3b61538f1fc1bc5590b13df6a201631aba%22%2C%0A%20%20%20%20%20%20%20%20%22Created%22%3A%20%222017-05-08T15%3A37%3A00.162729809%2B02%3A00%22%2C%0A%20%20%20%20%20%20%20%20%22Scope%22%3A%20%22local%22%2C%0A%20%20%20%20%20%20%20%20%22Driver%22%3A%20%22bridge%22%2C%0A%20%20%20%20%20%20%20%20%22EnableIPv6%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%22IPAM%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Driver%22%3A%20%22default%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Options%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Config%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Subnet%22%3A%20%22172.18.0.0%2F16%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Gateway%22%3A%20%22172.18.0.1%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Internal%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%22Attachable%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%22Containers%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22eb4c4bd328bfaf7d21474e2fdbda667fa6d305651a7380243a11a1f4f593d037%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Name%22%3A%20%22networktest3%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22EndpointID%22%3A%20%22e70574fed4a8a8bc02e505052b9746278091cd7d43f75619699b5e6b114781a5%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22MacAddress%22%3A%20%2202%3A42%3Aac%3A12%3A00%3A02%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22IPv4Address%22%3A%20%22172.18.0.2%2F16%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22IPv6Address%22%3A%20%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Options%22%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%22Labels%22%3A%20%7B%7D%0A%20%20%20%20%7D%0A%5D » message= »docker network inspect mon_reseau » highlight= » » provider= »manual »/]

Plus d’info : https://docs.docker.com/engine/userguide/networking/#user-defined-networks

 

Migration de dockerfile entre 2 instances dockers :

 

 

 

Lignes de commande et Snippets :

Utiliser Docker c’est maitriser l’ensemble des commandes, pour manipuler les containers Docker. Je vais passer en revue les commandes que propose Docker et les améliorer en créeant un ensemble de Docker snippets, pour simplifier l’exploitation quotidienne de Docker.

Lors du précédent tutorial Débuter avec Docker, j’ai présenter quelques commandes de base, mais nous allons poursuivre cette découverte des commandes CLI de Docker, pour exploiter et maitriser Docker.

Liste des commandes de Docker CLI

Je vais rapidement lister les commandes Docker disponibles, en expliquant leurs rôles (informations issues des manpages Docker)

  • docker attach : Joindre à un conteneur en cours d’exécution
  • docker build : Construire une nouvelle image à partir du code source dans le PATH
  • docker commit : Créer une nouvelle image à partir des changements d’un conteneur
  • docker cp : Copier des fichiers ou des dossiers depuis le PATH d’un conteneur vers le HOSTDIR ou vers STDOUT
  • docker create : Créer un nouveau conteneur
  • docker diff : Inspectez changements sur le système de fichiers d’un conteneur
  • docker events : Obtenir des événements en temps réel depuis le serveur
  • docker exec : Exécuter une commande dans le conteneur en cours d’exécution
  • docker exec -it [container-id] bash : Entrer dans le terminal du CT
  • docker export : Exporter le contenu d’un système de fichiers d’une archive tar vers STDOUT
  • docker history : Afficher l’historique d’une image Docker
  • docker images : Lister des images
  • docker import : Créer une image de système de fichiers vide et y importer le contenu d’une l’archive (.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz), puis éventuellement y ajouter une étiquette (tag)
  • docker info : Afficher l’ensemble des informations système
  • docker inspect : Afficher les informations de bas niveau sur un conteneur ou une image Docker
  • docker kill : Tuer un conteneur en cours d’exécution en utilisant SIGKILL ou un signal spécifié
  • docker load : Chargez une image à partir d’une archive tar sur STDIN
  • docker login : Inscrivez-vous ou connectez-vous à le Docker Register (HUB)
  • docker logout : Déconnexion du Docker Register (HUB)
  • docker logs : Fetch des journaux d’un conteneur
  • docker pause : Mettre en pause tous les processus dans un conteneur
  • docker port : Liste les ports d’un conteneur, ou rechercher les ports “public” NATé vers un PRIVATE_PORT
  • docker ps : Liste de conteneurs
  • docker pull : Récupérer une image ou un repository à partir du Docker HUB
  • docker push : Publier une image ou un repository vers le Docker HUB
  • docker rename : Renommer un conteneur Docker
  • docker restart : Redémarrez un conteneur en cours d’exécution
  • docker rm : Supprimer une ou plusieurs conteneurs
  • docker rmi : Supprimer une ou plusieurs images
  • docker run : Exécuter une commande dans un nouveau conteneur
  • docker save : Enregistrer une image dans une archive tar (streaming vers STDOUT par défaut)
  • docker search : Rechercher des images sur le Docker Hub
  • docker start : Lancer un ou plusieurs conteneurs arrêtés
  • docker stats : Afficher l’utilisation des ressources d’un ou plusieurs conteneurs sous la forme d’un flux
  • docker stop : Arrêtez un conteneur en cours d’exécution en envoyant SIGTERM et SIGKILL après une période de grâce
  • docker tag : Étiqueter une image dans un repository
  • docker top : Afficher les processus en cours d’exécution d’un conteneur
  • docker unpause : Réactiver tous les processus dans un conteneur
  • docker version : Afficher les informations de version Docker
  • docker wait : Bloquer jusqu’à l’arrêt du conteneur, puis imprime son code de sortie

Construction d’une image Docker :

[pastacode lang= »markup » manual= »docker%20build%20-t%20itwars%2Ftest1%20. » message= »Construir une image Docker  » highlight= » » provider= »manual »/]

En phase de développement d’une image, il arrive très souvent que sa création échoue (erreurs dans le Dockerfile) et on voit aparaitre à l’écran des choses curieuses quand nous lançons les commandes Docker suivantes :

[pastacode lang= »markup » manual= »docker%20images%0Adocker%20ps%20-a » message= » » highlight= » » provider= »manual »/]

Que ce passe-t-il quand la création d’une Image Docker échoue ?

  1. Docker crée des containers à la volée pour créer des images. Si la création se passe bien, à la fin du processus, Docker “nettoie” ses containers de build
  2. Docker crée également des images intermédiaires, pour créer une image finale, quand la création va à son terme, Docker, là encore “nettoie” ses images build

Donc c’est à nous de faire le ménage pour Docker (personnellement, j’ai créé un alias dans mon .bashrc) !

[pastacode lang= »markup » manual= »docker%20rm%20%20%24(docker%20ps%20-a%20%20-q%20–filter%20%22status%3Dexited%22)%20%26%26%0Adocker%20rmi%20%24(docker%20images%20-q%20–filter%20%22dangling%3Dtrue%22) » message= » » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »175887c21be4%0Acf1f1c3aa329%0Ac0a941a8ddc3%0ADeleted%3Adbf3ced60ed89a1b7bacb0eb639bbbeb925253288f732a937bf61a8fb2fa3ced%0ADeleted%3A4101ab020eae1c6141f775cb1392f1e12fcd39520d7f637b69e2d766aaf0d2c6″ message= »Docker nous indique la liste des containers supprimés, puis la liste des images supprimées : » highlight= » » provider= »manual »/]

Quelques snippets Docker radicales

  • Stopper tous les containers Docker : docker stop $(docker ps -a -q)
  • Supprimer toutes les Docker images : docker rmi $(docker images -a -q)
  • Stopper et supprimer tous les containers Docker : docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
  • Stopper et supprimer tous containers Docker + Supprimer toutes les docker images : docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q) && docker rmi $(docker images -a -q)

Monitoring basic des containers Docker

En ce connectant à la machine hôte qui fait fonctionner le daemon Docker, vous disposez de plusieurs solutions, pour monitorer simplement vos containers Docker :

Utilisation de docker stats

On peut afficher les statisques des containers actifs, un peu comme avec la commande “top” :

[pastacode lang= »markup » manual= »docker%20stats%20%24(docker%20ps%20-q) » message= » » highlight= » » provider= »manual »/]

Utilisation des cgroup

Pour tout ce qui touche à la gestion, restriction, informations sur les ressources, Dockers’appuie sur les cgroup du kernel Linux. Dans le script qui suit, j’affiche la mémoire utilisée par chaque containers actifs :

[pastacode lang= »markup » manual= »for%20line%20in%20%60docker%20ps%20%7C%20awk%20’%7Bprint%20%241%7D’%20%7C%20grep%20-v%20CONTAINER%60%3B%20do%20docker%20ps%20%7C%20grep%20%24line%20%7C%20awk%20’%7Bprintf%20%24NF%22%20%22%7D’%20%26%26%20echo%20%24((%20%60cat%20%2Fsys%2Ffs%2Fcgroup%2Fmemory%2Fdocker%2F%24line*%2Fmemory.usage_in_bytes%60%20%2F%201024%20%2F%201024%20))MB%20%3B%20done » message= » » highlight= » » provider= »manual »/]

Pour un container en particulier en Mo avec l’utilisation de jq (voir plus bas):

[pastacode lang= »markup » manual= »echo%20%24(%20cat%20%2Fsys%2Ffs%2Fcgroup%2Fmemory%2Fdocker%2F%24(docker%20ps%20-q%20–no-trunc%3Dtrue%20–filter%20%22name%3Dbind%22)%2Fmemory.usage_in_bytes%20)%20%7C%20jq%20%22.%2F1024%2F1024%22%20%7C%20jq%20%22floor%22″ message= » » highlight= » » provider= »manual »/]

Utilisation de l’API Docker

Docker quand il démarre, ouvre un socket Unix qui se trouve dans /var/run/docker.sock, on peut lui envoyer des commandes http, pour réaliser une multitude d’actions. Je vous conseille de lire la documentation Docker API.

[pastacode lang= »markup » manual= »echo%20-e%20%22GET%20%2Fimages%2Fjson%20HTTP%2F1.0%5Cr%5Cn%22%20%7C%20nc%20-U%20%2Fvar%2Frun%2Fdocker.sock%20%7C%20%20tail%20-n%20%2B5%20%20%7C%20python%20-m%20json.tool%20%7C%20less » message= »Ici je récupère l’ensemble des informations concernant les images gérés par ce daemon Docker  » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »echo%20-e%20%22GET%20%2Fcontainers%2F3e33d469abac%2Fstats%20HTTP%2F1.0%5Cr%5Cn%22%20%7C%20nc%20-U%20%2Fvar%2Frun%2Fdocker.sock » message= »Dans l’exemple ci-dessous, je demande le flux des statistiques du container ayant pour ID: 3e33d469abac » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »echo%20-e%20%22GET%20%2Fcontainers%2F%22%24(docker%20ps%20-q%20–filter%20%22name%3Dbind%22)%22%2Fstats%20HTTP%2F1.0%5Cr%5Cn%22%20%7C%20nc%20-U%20%2Fvar%2Frun%2Fdocker.sock » message= »On peut le rendre plus facile à utiliser pour les humains en faisant la même requête à partir du nom du container : » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »echo%20-e%20%22GET%20%2Fcontainers%2F%22%24(docker%20ps%20-q%20–filter%20%22name%3Dbind%22)%22%2Fstats%20HTTP%2F1.0%5Cr%5Cn%22%20%7C%20nc%20-U%20%2Fvar%2Frun%2Fdocker.sock%20%7C%20tail%20-n%20%2B5%20%7C%20jq%20-r%20′.memory_stats.usage' » message= »En utilisant jq, on peut filter le stream JSON pour avoir un champ particulier, ici par exemple la mémoire utilisée : » highlight= » » provider= »manual »/]

Facilité la création de Dockerfile avec Vim

Comme je suis un inconditionnel de Vim (en fait NeoVim), je me suis créé un petit template pour ne rien oublier dans mes Dockerfiles. Dans mon fichier de configuration .vimrc, j’ai ajouté la commande suivante, qui insère automatiquement le template lorsque j’édite un fichier Dockerfile vide :

[pastacode lang= »markup » manual= »au%20BufNewFile%20Dockerfile%20r%20~%2Fmysetup%2Ftemplates%2FDockerfile.txt » message= » » highlight= » » provider= »manual »/]

[pastacode lang= »markup » manual= »%23%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%90%0A%23%E2%94%82%20Pull%20base%20image%20%20%20%E2%94%82%0A%23%E2%94%94%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%98%0AFROM%20resin%2Frpi-raspbian%3Awheezy%0AMAINTAINER%20Vincent%20RABAH%20%3Cvincent.rabah%40gmail.com%3E%0A%0A%23%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%90%0A%23%E2%94%82%20%20%20Install%20%2B%20CLeanup%20%E2%94%82%0A%23%E2%94%94%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%98%0ARUN%20%5C%0A%20%20%20apt-get%20update%20%26%26%20%5C%0A%20%20%20apt-get%20-y%20dist-upgrade%20%26%26%20%5C%0A%20%20%20%0A%20%20%20apt-get%20install%20-y%20XXX%20%20%26%26%20%5C%0A%20%20%20%0A%20%20%20apt-get%20clean%20-y%20%26%26%20%5C%0A%20%20%20apt-get%20autoclean%20-y%20%26%26%20%5C%0A%20%20%20apt-get%20autoremove%20-y%20%26%26%20%5C%0A%20%20%20rm%20-rf%20%2Ftmp%2F*%0A%20%20%20rm%20-rf%20%2Fvar%2Flib%2F%7Bapt%2Cdpkg%2Ccache%2Clog%2Ctmp%7D%2F*%0A%0A%23%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%90%0A%23%E2%94%82%20%20%20Define%20working%20directory%20%E2%94%82%0A%23%E2%94%94%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%98%0AWORKDIR%20%2Fdata%0A%0A%23%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%90%0A%23%E2%94%82%20%20%20Expose%20some%20tcp%2Fudp%20ports%20%E2%94%82%0A%23%E2%94%94%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%98%0AEXPOSE%2053%0AEXPOSE%2053%2Fudp%0A%0A%0A%23%E2%94%8C%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%90%0A%23%E2%94%82%20%20%20Define%20default%20command%20%E2%94%82%0A%23%E2%94%94%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%80%E2%94%98%0ACMD%20%5B%22bash%22%5D » message= »Mon fichier de template est le suivant : » highlight= » » provider= »manual »/]

 

Conclusion sur les commandes Docker

Voilà, pour ce nouveau tutorial Docker sur l’utilisation et la simplification de l’exploitation au quotidien de Docker.

N’hésitez pas à laisser des commentaires pour partager ! Merci.

 

 

 

Source

Source