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 :
Exécuter une image pour vérifier qu’elle fonctionne et rentrer dans le dockerfiles:
Étapes simples pour utiliser un container
- Créer le fichier « Dockerfile » avec les spécifications de l’image
- Créer une image : build
- Démarrer un container (instance de l’image) : run
- Modifier le container
- 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 :
Build
Pour créer une machine basée sur Debian dans un répertoire ./jbnet-test :
Vérifier que les images jbnet-test et debian (sur laquelle jbnet-test est basée) sont disponibles :
Liste du ou des container créés :
Version dépréciée :
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 :
Utiliser Ctrl+d pour se déconnecter
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.
Même exemple en créant une nouvelle image jbnet-test2 :
Gérer les container et images
Réseau
Par défaut, les container sont sur le même réseau.
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 :
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 :
Que ce passe-t-il quand la création d’une Image Docker échoue ?
- 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
- 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) !
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” :
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 :
Pour un container en particulier en Mo avec l’utilisation de jq (voir plus bas):
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.
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 :
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