Mes premières commandes¶
Mon premier conteneur¶
Exécutez un conteneur hello-world de base avec :
puis lancez les commandes suivantes pour voir ce qui s'est passé :
Docker arrête automatiquement le conteneur une fois que le processus exécuté à l'intérieur de celui-ci est stoppé. Dans cet exemple, le processus en question était un simpleecho
.
Remarque
La première commande (docker pull hello-world
) n'était pas nécessaire ; veuillez réessayer maintenant avec:
Commandes utiles¶
Gérer le système, nettoyer les conteneurs et les images¶
Quelques commandes utiles :
-
pour monitorer docker :
-
pour lister et supprimer des conteneurs :
docker container ls # Liste les conteneurs actifs docker container ls -a # Liste tous les conteneurs docker container rm <nom du conteneur> # Supprime un conteneur docker rm $(docker ps -a -q) # Supprime tous les conteneurs inutilisés
Remarque 1
L'
id
du conteneur peut être utilisé à la place de<nom du conteneur>
pour supprimer le conteneur.Remarque 2
Utilisez l'option
--force
ou-f
pour forcer la suppression d'un conteneur en cours d'exécution.Par exemple, la commande suivante supprimera TOUS les conteneurs :
docker rm -f $(docker ps -a -q)
-
pour lister et supprimer les images :
Plus généralement, pour obtenir la liste des commandes docker, tapez :
ou pour obtenir des informations sur l'exécution d'une commande :
Vous pouvez également vous référer au site officiel de docker (https://docs.docker.com/engine/reference/commandline/docker/) pour plus de détails.
Quelques alias¶
Il existe des alias dans docker. Les commandes suivantes sont équivalentes :
Mon second conteneur¶
Précédemment, nous avons lancé un simple conteneur hello-world à l'aide de docker run
. De façon général, la syntaxe générale pour lancer un conteneur est:
Note
docker run
crée et démarre un conteneur. Elle combine les deux commandes suivantes:
Cette commande supporte un certain nombre d´options qui peuvent être listées à l'aide de:
Voici quelques options de base à connaître pour la commande docker run
:
-d
(--detach
) lance un conteneur en tâche de fond;
-it
permet d'avoir une session interactive : -i
(--interactive
) garde STDIN ouvert et -t
(--tty
) alloue un terminal pseudo-TTY;
--name NOM
donne un nom au conteneur au lieu d'un nom aléatoire;
--rm
supprimer le conteneur après utilisation.
Exercice
Dans deux fenêtres de terminal différentes exécutez:
- un conteneur avec l'interpréteur de commandes Python pré-installé. Pour cela on utilisera l'image docker
python
. Ce conteneur aura pour nommycontainer
et sera supprimé automatiquement après son utilisation. (Terminal #1
) - une commande qui permet de lister tous les conteneurs. (
Terminal #2
)
Ensuite, quittez le shell python et ré-exécutez la commande du Terminal #2
.
Solution
Si l'image docker le permet (cf. la partie construction d'une image), il est possible de lancer le conteneur de façon à ce qu'il exécute une autre commande que celle par défaut et pour laquelle il a été créé. Il suffit de la préciser, tel que:
Exercice
Réexécuter le même conteneur en ouvrant l'interpréteur de commandes bash
.
Solution
Bien choisir son image¶
Dans la section précédente, nous avons lancé un conteneur basé sur une image python
sans imposer sa version. Mais il peut être utile de la spécifier en précisant le tag de l'image: <image>:<tag>
.
Par défaut, lorsque le tag
n'est pas précisé, docker
recherche une image avec le tag latest
(qui n'existe pas nécessairement). Par exemple les deux commandes suivantes sont équivalentes:
Warning
Pour des conteneurs en production, il est plus que recommandé de fixer la version de l'image et de ne pas utiliser de tag latest
. Cela permet d'éviter toute confusion et de revenir facilement à une version fonctionnelle en cas de problème lors d'un changement de version.
Exercice
De la même manière que précédemment, exécuter un conteneur python version 3.10
.
Partage de fichiers¶
Lorsque le conteneur est détruit, tous les fichiers qui ont été ajoutés après sa création le sont avec lui. Or, par exemple, on pourrait vouloir exécuter un programme avec une version spécifique de python. Dans ce cas-ci, on aimerait que les fichiers python soient stockés sur la machine hôte et que le conteneur ne serve qu'à les éxecuter. Il est, alors, utile de pouvoir partager un répertoire entre la machine hôte et le conteneur. Cela évite d'avoir à transférer les fichiers dans le conteneur à chaque nouveau lancement et permet de garder d'eventuels fichiers de sortie générés lors de l'éxécution du/des codes python.
Ce mécanisme de partage, appelé binding en anglais, s'utilise avec l'option:
-v
(--volume
) qui prend en argument 3 champs séparés par des:
, tel que :-v <field1>:<field2>:<field3>
<field1>
: chemin du fichier ou dossier sur la machine hôte;<field2>
: chemin du fichier ou dossier dans le conteneur;<field3>
: champ optionnel, qui prend en argument une option parmi une liste, tel quero
qui permet un montage en lecture seule (read only).
Ainsi, la syntaxe complète pour lancer un conteneur en bindant un fichier/répertoire entre un la machine hôte et le conteneur est:
Exercice
Essayer d'exécuter les codes python contenus dans files/python_codes
en le liant à /var/code
à l'intérieur du conteneur.
Le répertoire files/python_codes
se trouve dans le repository que vous aurez préalablement cloné.
Solution
user@host $ cd /path/to/files/python_codes
user@host $ docker run -it --name mycontainer --rm -v $PWD:/var/code python:3.10 bash
root@98f84f1f6cc1:/# cd /var/code # cd dans le conteneur
root@7fb7d20ea16d:/var/code# ls -l
root@7fb7d20ea16d:/var/code# pip install matplotlib numpy
root@7fb7d20ea16d:/var/code# python pi.py
root@7fb7d20ea16d:/var/code# ls -l
Remarque
A travers cet exemple, nous pouvons voir l'intérêt de personnaliser notre propre image Docker.