DOCKER - 13 Avoir un Shell dans un Conteneur

Pour déboguer ou inspecter ce qui se passe à l'intérieur d'un conteneur, vous devez accéder à un shell interactif. Il existe deux approches principales : docker run -it pour lancer un nouveau conteneur avec un shell, ou docker exec -it pour entrer dans un conteneur déjà en cours d'exécution.

La première commande combine deux options critiques : -i (interactive) maintient stdin ouvert, et -t alloue un pseudo-terminal. Ensemble, -it vous offre une interface shell complète :

docker run -it ubuntu /bin/bash

Une fois à l'intérieur, vous pouvez explorer le système de fichiers avec ls -la, vérifier les variables d'environnement avec env, ou installer des paquets avec le gestionnaire disponible (ex. apt-get sur Ubuntu). Quand vous tapez exit, le conteneur s'arrête puisque le shell était le processus principal.

Pour accéder à un conteneur déjà actif (par exemple exécutant une application), utilisez docker exec. Contrairement à run, cela lance un processus secondaire sans affecter le processus principal :

docker exec -it myapp /bin/bash

Les distributions Linux dans les conteneurs diffèrent des installations traditionnelles. Alpine par exemple est extrêmement léger (~5 MB) et n'inclut pas bash : utilisez /bin/sh à la place. Ubuntu offre un environnement plus complet avec apt-get pour installer des outils. Nginx expose un shell minimal. Comprenez votre image pour choisir le bon shell et les bons outils diagnostiques.

En résumé

Ce cours explique comment accéder à un shell à l'intérieur d'un conteneur Docker. Deux approches principales sont présentées : lancer un nouveau conteneur avec `docker container run -it bash` pour entrer immédiatement dans un shell, ou utiliser `docker container exec -it <name> bash` pour accéder à un conteneur déjà en exécution. Le cours illustre ces concepts avec des exemples concrets utilisant les images nginx et Ubuntu, en montrant comment les distributions Linux se comportent différemment dans un conteneur comparé à une machine virtuelle ou physique.

Points clés

  • Utiliser docker container run -it bash permet de démarrer un nouveau conteneur et d'accéder immédiatement à un shell interactif
  • La commande docker container exec -it <name> bash permet d'exécuter un processus supplémentaire (ici bash) dans un conteneur déjà en cours d'exécution, sans arrêter le conteneur
  • Un conteneur s'arrête automatiquement quand son processus principal se termine (par exemple, quand vous quittez bash avec exit), sauf si c'est via docker container exec
  • Les distributions Linux dans les conteneurs sont généralement plus épurées qu'une installation standard, mais permettent d'installer des paquets avec apt-get ou d'autres gestionnaires
  • Les modifications apportées à un conteneur (comme les paquets installés) sont conservées dans ce conteneur spécifique et restent disponibles si vous le relancez avec docker container start
  • docker container start permet de relancer un conteneur arrêté en conservant ses modifications, contrairement à créer un nouveau conteneur à partir de la même image

Questions fréquentes

Quelle est la différence entre docker container run et docker container exec ?

docker container run crée et démarre un nouveau conteneur à partir d'une image, tandis que docker container exec exécute une commande supplémentaire dans un conteneur déjà en cours d'exécution. Avec run, le conteneur s'arrête quand le processus principal se termine (ex: exit d'un shell). Avec exec, le conteneur continue de fonctionner après la fin de la commande.

Pourquoi mon conteneur s'arrête-t-il quand je quitte le shell bash avec exit ?

Parce que le shell bash était le processus principal lancé lors du démarrage du conteneur avec docker container run. Quand ce processus principal se termine, le conteneur s'arrête. C'est un comportement normal de Docker : un conteneur ne fonctionne que tant que son processus principal s'exécute.

Si j'installe un paquet dans un conteneur avec apt-get, sera-t-il disponible la prochaine fois que je lance ce conteneur ?

Oui, si vous relancez le même conteneur avec docker container start. Non, si vous créez un nouveau conteneur à partir de la même image : seul ce conteneur spécifique conserve les modifications. Pour rendre les paquets permanents dans tous les conteneurs, il faut modifier l'image elle-même avec un Dockerfile.