Comment interagir avec les conteneurs Docker
Cet article prolonge l’article Docker précédent et montre comment interagir avec les conteneurs Docker en exécutant des commandes à l’intérieur des conteneurs, en installant des logiciels à l’intérieur des conteneurs, en inspectant l’état des conteneurs, en accédant aux conteneurs à l’aide de Bash, en conservant les modifications dans les images et en supprimant les conteneurs et les images inutilisés.
Dans ce tutoriel, vous allez apprendre :
- Comment exécuter des commandes à l’intérieur de conteneurs
- Comment installer un logiciel à l’intérieur d’un conteneur
- Comment inspecter l’état du conteneur
- Comment accéder aux conteneurs à l’aide de Bash
- Comment conserver les modifications dans les images
- Comment supprimer les conteneurs et les images inutilisés
PHP installé.
Configuration logicielle requise et conventions utilisées
Comment interagir avec les conteneurs Docker
Dans le premier article de cette série, vous avez appris les concepts de Docker et quelques commandes de base et vu comment vous pouvez facilement exécuter des logiciels de manière compartimentée, sans toucher à la configuration de votre système d’exploitation hôte. Allons maintenant plus loin, en entrant dans un conteneur en cours d’exécution et en exécutant quelques commandes.
Exécution de commandes à l’intérieur d’un conteneur en cours d’exécution
Dans l’article précédent, vous avez démarré un conteneur Apache. PHP n’était pas installé sur l’image sous-jacente, elle n’était donc capable de servir que des pages HTML statiques. Prenons un conteneur sur lequel Apache et PHP sont installés. Au cas où vous vous poseriez la question, il existe des images prêtes à être utilisées avec Apache et PHP installés, et elles peuvent être trouvées sur Docker Hub. Nous faisons cela simplement pour montrer comment une image peut être personnalisée selon vos besoins.
Commençons donc une instance Debian en utilisant une ligne de commande similaire à celle de l’article précédent, mais avec deux différences : donnons-lui un nom (--name debian_container), afin de pouvoir s’y référer plus tard, et allouons un terminal pour qu’elle puisse s’exécuter (-it).
docker run -it --name debian_container -d -p 8000:80 -v "$PWD":/var/www/html debian
Nous pouvons interagir avec un conteneur Docker en cours d’exécution. On vous a déjà dit que les conteneurs partagent le même noyau que le système d’exploitation hôte. Vérifions.
docker exec debian_container uname -a
La commande docker exec ci-dessus exécute la commande donnée à l’intérieur du conteneur et affiche sa sortie.
Toutes les commandes docker ont une aide associée, nous pouvons donc voir les options que docker exec accepte :
docker exec --help
Maintenant, vous pouvez jouer avec d’autres commandes :
docker exec debian_container ls -l
docker exec debian_container pwd
docker exec debian_container whoami
docker exec debian_container cat /etc/issue
Dans cette dernière commande, nous avons appris que le conteneur tourne sous Debian 9, malgré le système d’exploitation de votre machine. Comme mentionné précédemment, le système d’exploitation hôte et le conteneur ne partagent que le noyau.
Si vous avez essayé mais n’avez pas pu exécuter une commande à l’intérieur du conteneur, il est probable qu’elle ne s’y trouve pas. L’image (comme toutes les autres images) est construite à partir d’une configuration minimale de Debian, donc tout outil supplémentaire doit être installé. Il atteint deux objectifs : une taille de disque plus petite et une sécurité améliorée, car moins de logiciels signifie moins de bogues à exploiter.
Maintenant, entrons à l’intérieur du conteneur.
docker exec -it debian bash
root@b5c694a02248:/usr/local/apache2#
Notez que l’invite a changé et que vous êtes maintenant l’utilisateur root à l’intérieur du conteneur (b5c694a02248 est le nom d’hôte à l’intérieur du conteneur) à l’intérieur d’un shell bash.
Installation d’un logiciel dans un conteneur
Nous avons maintenant un shell à l’intérieur du conteneur avec user root. Comme il s’agit d’une version allégée de Debian, il n’y a même pas les commandes top et ps. Installons-les.
apt update
apt install procps
Vous pouvez voir ce qui fonctionne avec top et ps -ef.
root@f5b423465e03:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 19:46 pts/0 00:00:00 bash
root 42 0 0 19:49 pts/1 00:00:00 bash
root 310 42 0 19:53 pts/1 00:00:00 ps -ef
root@f5b423465e03:/#
Oui, c’est frugal. Les conteneurs Docker ont généralement le nombre minimum absolu de processus exécutés. Pour quitter le shell et revenir à votre système d’exploitation hôte, il suffit de quitter bash (tapez exit ou ctrl+d).
Notez que de nombreux fichiers ont été téléchargés par apt update et apt install. Ils existent tous sur le disque du conteneur en cours d’exécution. Ils existent toujours si le conteneur est arrêté et redémarré (docker stop debian_container ; docker start debian_container). Mais ils n’existent pas dans l’image. Cela signifie que, si vous supprimez ce conteneur (docker rm debian_container) et démarrez un nouveau conteneur, vous devrez réinstaller le package procps. De plus, si vous démarrez l’image Debian sur un autre hôte, vous devrez également installer à nouveau procps. Nous verrons plus tard comment conserver l’image avec des modifications de disque, de sorte que la prochaine fois que vous démarrerez un conteneur, tous les logiciels seront installés.
Maintenant, installons Apache et PHP. La commande ci-dessous prendra beaucoup de temps à terminer et téléchargera et installera tous les packages de dépendances, y compris Apache et PHP - cela prendra quelques minutes. À la fin, démarrez Apache et accédez à localhost sur le port 8000 sur votre navigateur web (http://localhost:8000). Vous verrez la page Debian par défaut pour Apache.
apt install libapache2-mod-php
service apache2 start
Page par défaut d’Apache Debian.
Confirmons maintenant que PHP est là. Vous pouvez soit aller dans /var/ww/html à l’intérieur du conteneur, soit quitter le shell du conteneur et taper à partir du répertoire actuel dans votre système d’exploitation hôte (vous vous souvenez que nous avons mappé le répertoire actuel dans /var/www/html à l’intérieur du conteneur ?)
echo '' >phpinfo.php
Et voilà (http://localhost:8000/phpinfo.php).
Informations PHP.
S’engager envers une image
Comme nous l’avons mentionné précédemment, les modifications apportées au conteneur persistent tant que le conteneur persiste, et on s’attend à ce que les conteneurs soient éphémères — ils sont faits pour être détruits. Les modifications durables doivent être transformées en images.
Le prochain article montrera comment créer une image personnalisée de manière élégante (et fortement recommandée), à l’aide d’un Dockerfile. Pour l’instant, vous allez apprendre une astuce qui peut être utile dans des situations spécifiques où il n’est pas possible ou souhaitable d’écrire un Dockerfile. L’extension des images avec un fichier Docker si vous le souhaitez, car il peut être facilement modifié tout en validant l’état du conteneur dans une nouvelle image, ne laisse aucune trace des modifications apportées, à moins qu’une analyse laborieuse de la couche du système de fichiers ne soit effectuée.
La commande docker commit a deux paramètres : le nom du conteneur et le nom de la nouvelle image et elle créera une nouvelle image sur le cache d’images local en fonction du conteneur. Dans la commande ci-dessous, debian_container est le nom du conteneur et debian-apache-php est le nouveau nom de l’image.
docker commit debian_container debian-apache-php
sha256:3f01c0c71539c4dc6dfd7483ff68c41143b7e9aeb52de4a9892c8cc136eda236
Liste des images dans le cache de l’hôte.
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian-apache-php latest 3f01c0c71539 10 minutes ago 235MB
debian latest be2868bebaba 11 days ago 101MB
Notez qu’il y a une nouvelle image dans votre hôte. Une caractéristique intéressante de la gestion des images et des conteneurs est que Docker ne stocke que la différence d’état du disque entre l’image actuelle et l’image sur laquelle elle est basée, de sorte qu’aucun espace disque redondant n’est gaspillé. Pour cela, Docker utilise un système de fichiers en couches qui utilise l’approche de la copie sur écriture : lorsqu’un nouveau conteneur est créé, il hérite du même disque que l’image et, au fur et à mesure que des modifications sont apportées aux fichiers, ils sont écrits dans une nouvelle couche.
Inspection des conteneurs
Docker gère de nombreuses informations sur les objets Docker. La commande docker inspect est utilisée pour les afficher.
docker inspect debian_container
La commande récupérera un objet JSON avec des dizaines de lignes détaillant l’état du conteneur : identifiant du conteneur, date de création, état, image, chemin d’accès au journal, ports, volumes, réseaux, etc.
Contenants d’élagage et images
Après avoir joué avec des conteneurs et des images, le disque de l’hôte finira par se remplir d’entités abandonnées qui doivent être effacées afin que vous puissiez récupérer de l’espace disque.
La commande docker container prune supprimera tous les conteneurs arrêtés. Attention : une fois le conteneur retiré, tout état associé est perdu. Effectuez une sauvegarde ou validez les modifications apportées à une image au préalable.
La commande docker image prune supprimera toutes les images inutilisées. Nous n’avons pas encore construit d’images, mais cette commande nous sera utile dans le prochain article.
Conclusion
Dans cet article, vous avez appris à interagir avec les conteneurs et à valider les modifications apportées aux images, bien que cette approche ne soit pas recommandée.
Dans le prochain article, vous allez créer vos propres images avec Dockerfile, la méthode recommandée pour personnaliser les images Docker.
Plus d’informations dans cette série d’articles Docker
- Une introduction pratique aux conteneurs Docker
- Comment personnaliser les images Docker avec Dockerfiles

