Aller au contenu

Mes premières commandes

Mon premier conteneur

Exécutez un conteneur hello-world de base avec :

docker pull hello-world &&\
docker run hello-world

puis lancez les commandes suivantes pour voir ce qui s'est passé :

docker image ls &&\
docker container ls &&\
docker container ls -a
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 simple echo.

Remarque

La première commande (docker pull hello-world) n'était pas nécessaire ; veuillez réessayer maintenant avec:

docker container rm <nom du conteneur>
docker image rm hello-world
docker run hello-world
docker image ls

Commandes utiles

Gérer le système, nettoyer les conteneurs et les images

Quelques commandes utiles :

  • pour monitorer docker :

    docker system df        # Montre l'utilisation du disque par docker
    docker system prune     # Supprime les données inutilisées ; à utiliser avec précaution
    

  • 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 :

    docker image ls               # Liste les images présentes
    docker image rm <image-id>    # Supprime une image
    docker image prune -a         # Supprime toutes les images inutilisées
    

Plus généralement, pour obtenir la liste des commandes docker, tapez :

docker help

ou pour obtenir des informations sur l'exécution d'une commande :

docker <commande> --help

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 :

docker container ls [OPTIONS] ...
docker ps [OPTIONS] ...
docker container rm [OPTIONS] ...
docker rm [OPTIONS] ...
docker container run [OPTIONS] ...
docker run [OPTIONS] ...
docker image ls [OPTIONS] ...
docker images [OPTIONS] ...
docker image rm [OPTIONS] ...
docker rmi [OPTIONS] ...

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:

docker run [OPTIONS] <image>

Note

docker run crée et démarre un conteneur. Elle combine les deux commandes suivantes:

docker create [OPTIONS] <image>
docker start <conteneur>

Cette commande supporte un certain nombre d´options qui peuvent être listées à l'aide de:

docker run --help

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 nom mycontainer 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
Terminal #1
user@host $ docker run -it --name mycontainer --rm python
Python 3.12.0
>>> print('Bonjour Python')
Bonjour Python
>>>
Terminal #2
user@host $ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a4f09072980 python:latest "python3" il y a 3 minutes Up 3 minutes mycontainer

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:

docker run [OPTIONS] <image> <commande>

Exercice

Réexécuter le même conteneur en ouvrant l'interpréteur de commandes bash.

Solution
user@host $ docker run -it --name mycontainer --rm python /bin/bash
root@6d7702e04353:/# python
Python 3.12.0
>>>

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:

   docker run -it --rm python
   docker run -it --rm python:latest
Pour trouver les tags associées à une image et choisir celle qui vous convient, vous pouvez vous rendre sur le site d'une registry comme dockerhub.

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.

Solution
user@host $ docker run -it --rm python:3.10
Python 3.10.13
>>>

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 que ro 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:

   docker run [OPTIONS] -v </path/on/host>:</path/inside/container>[:ro] <image>:<tag>

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

Au lieu d'ouvrir l'interpréteur bash du conteneur, il est aussi possible d'exécuter directement le code python :

docker run -it --name mycontainer --rm -v application:/var/code python:3.10 python /var/code/hello_world.py

Remarque

A travers cet exemple, nous pouvons voir l'intérêt de personnaliser notre propre image Docker.

Authors: Aurélien Bailly-Reyre