Docker pour débutants

Qu’est-ce que Docker ?

Docker est une plateforme de conteneurisation qui permet d’empaqueter une application et toutes ses dépendances dans un conteneur standardisé. Imaginez un conteneur comme une boîte isolée qui contient tout ce dont votre application a besoin pour fonctionner : le code, les bibliothèques, les outils système et les configurations. L’avantage majeur ? Votre application fonctionnera de manière identique, que ce soit sur votre ordinateur portable, sur un serveur de production ou sur la machine d’un collègue. Fini les fameux « mais ça marche sur ma machine ! » qui sont la hantise des développeurs.

Contrairement aux machines virtuelles qui émulent un système d’exploitation complet, Docker partage le noyau du système hôte, ce qui le rend beaucoup plus léger et rapide. Un conteneur démarre en quelques secondes, consomme peu de ressources et peut être facilement déployé, dupliqué ou supprimé. C’est cette simplicité et cette efficacité qui ont fait de Docker un outil incontournable dans le monde du développement moderne.

Image et conteneur

L’Image : Le plan ou la recette

Une image est un fichier statique et immuable (qui ne change pas). C’est un « instantané » qui contient tout ce dont votre application a besoin pour fonctionner : le code, les bibliothèques, les variables d’environnement et les fichiers de configuration. On peut la comparer à une recette de cuisine ou au plan d’une maison. Elle ne « tourne » pas, elle est simplement stockée sur votre disque dur ou sur un registre (comme Docker Hub).

Le Conteneur : La réalisation concrète

Le conteneur, en revanche, est l’instance vivante de l’image. C’est ce qui se passe quand vous exécutez l’image. Si l’image est la recette, le conteneur est le plat cuisiné prêt à être mangé. C’est un environnement isolé, léger et portable où votre application s’exécute réellement. La grande force de ce système est que vous pouvez créer plusieurs conteneurs identiques (plusieurs plats) à partir d’une seule et même image (une seule recette), garantissant que l’application se comportera exactement de la même manière partout.

Où trouver des images Docker ?

Avant de vous lancer dans l’utilisation des commandes, il est important de savoir où trouver les images Docker. Le principal répertoire d’images est Docker Hub (hub.docker.com), une plateforme publique qui héberge des milliers d’images officielles et communautaires. Vous y trouverez des images pour pratiquement tous les besoins : bases de données (MySQL, PostgreSQL, MongoDB), serveurs web (Nginx, Apache), langages de programmation (Node.js, Python, Java), et bien plus encore. Les images officielles, reconnaissables par un badge « Official Image », sont maintenues par Docker et les éditeurs de logiciels, ce qui garantit leur qualité et leur sécurité. Vous pouvez rechercher des images directement sur le site de Docker Hub ou en utilisant la commande docker search <terme> depuis votre terminal. Une fois que vous avez trouvé l’image qui vous convient, notez son nom (par exemple nginx, postgres:14, ou node:18-alpine) et utilisez docker pull pour la télécharger sur votre machine.


Les commandes Docker essentielles

Afficher la version de docker

ob@debian:~$ docker --version
Docker version 29.1.3, build f52814d
bob@debian:~$ 

Gestion des images

docker pull <nom-image>
Télécharge une image depuis Docker Hub (le registre public d’images Docker). Par exemple : docker pull nginx pour télécharger l’image du serveur web Nginx.

bob@debian:~$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
9f8c63d0a0c1: Download complete 
d6799cf0ce70: Pull complete 
99ae2d6d05ef: Pull complete 
02d7611c4eae: Pull complete 
dcea87ab9c4a: Pull complete 
35df28ad1026: Pull complete 
d03ca78f31fe: Pull complete 
a2b008488679: Pull complete 
ba7af65e8f34: Download complete 
Digest: sha256:ca871a86d45a3ec6864dc45f014b11fe626145569ef0e74deaffc95a3b15b430
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

docker images
Affiche la liste de toutes les images présentes sur votre machine avec leurs tailles et leurs identifiants.

bob@debian:~$ docker images
                                                                            i Info →   U  In Use
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA
hello-world:latest   d4aaab6242e0       25.9kB         9.52kB    U   
nginx:latest         ca871a86d45a        228MB         62.6MB        

docker rmi <nom-image>
Supprime une image de votre système. Utilisez docker rmi <id-image> si vous préférez utiliser l’identifiant.

bob@debian:~$ docker rmi nginx
Untagged: nginx:latest
Deleted: sha256:ca871a86d45a3ec6864dc45f014b11fe626145569ef0e74deaffc95a3b15b430
bob@debian:~$ docker images
                                                                                  i Info →   U  In Use
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA
hello-world:latest   d4aaab6242e0       25.9kB         9.52kB    U   
      

docker build -t <nom-image> .
Construit une nouvelle image à partir d’un Dockerfile présent dans le répertoire courant. L’option -t permet de donner un nom à votre image.

Gestion des conteneurs

docker run <nom-image>
Crée et démarre un nouveau conteneur à partir d’une image. C’est la commande la plus utilisée. Exemple : docker run -d -p 8080:80 nginx lance Nginx en arrière-plan et expose le port 80.

bob@debian:~$ docker run -p 8080:80 --name web_server nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf

On peut créer plusieurs conteneur à partir d’une image.
Par exemple:

bob@debian:~$ docker run -d -p 8080:80 --name web_server -v /home/bob/data:/usr/share/nginx/html nginx
abbcc2b75712c68eba1aa5660a8c3aaae0e2d45890e811a69eed8a3be4b6fc76
bob@debian:~$ 
bob@debian:~$ docker run -d -p 8081:80 --name web_server-2  nginx

docker ps
Liste tous les conteneurs en cours d’exécution. Ajoutez l’option -a pour voir également les conteneurs arrêtés.

bob@debian:~$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES
05b3199014b3   nginx     "/docker-entrypoint.…"   57 seconds ago   Up 55 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   elated_lichterman
bob@debian:~$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                     NAMES
05b3199014b3   nginx     "/docker-entrypoint.…"   57 seconds ago   Up 55 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   elated_lichterman

docker stop <id-conteneur>
Arrête un conteneur en cours d’exécution de manière propre. Le conteneur peut être redémarré plus tard.

bob@debian:~$ docker stop 05b3199014b3
05b3199014b3
bob@debian:~$ docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

docker start <id-conteneur>
Redémarre un conteneur qui a été arrêté précédemment.

bob@debian:~$ docker start 05b3199014b3
05b3199014b3
bob@debian:~$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                     NAMES
05b3199014b3   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 6 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   elated_lichterman

docker restart <id-conteneur>
Redémarre un conteneur (équivalent à un stop suivi d’un start).

docker rm <id-conteneur>
Supprime définitivement un conteneur arrêté. Utilisez docker rm -f pour forcer la suppression d’un conteneur en cours d’exécution.

bob@debian:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                     PORTS     NAMES
c93dac38cc93   nginx     "/docker-entrypoint.…"   3 minutes ago   Exited (0) 8 seconds ago             web_server-2
abbcc2b75712   nginx     "/docker-entrypoint.…"   3 minutes ago   Exited (0) 6 seconds ago             web_server
bob@debian:~$ docker rm web_server -f
web_server
bob@debian:~$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                     PORTS     NAMES
c93dac38cc93   nginx     "/docker-entrypoint.…"   5 minutes ago   Exited (0) 2 minutes ago             web_server-2

Interaction avec les conteneurs

docker exec -it <id-conteneur> <commande>
Exécute une commande à l’intérieur d’un conteneur en cours d’exécution. Très utile pour ouvrir un terminal : docker exec -it mon-conteneur bash ou docker exec -it mon-conteneur sh.

bob@debian:~$ docker exec -it 05b3199014b3 sh
# ls
bin   dev		   docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc			 lib   media  opt  root  sbin  sys  usr
# cd /etc	 

docker logs <id-conteneur>
Affiche les logs d’un conteneur. Ajoutez -f pour suivre les logs en temps réel (comme un tail -f).

bob@debian:~$ docker logs 05b3199014b3
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf

docker inspect <id-conteneur>
Affiche des informations détaillées sur un conteneur au format JSON (configuration réseau, volumes, variables d’environnement, etc.).

bob@debian:~$ docker inspect 05b3199014b3
[
    {
        "Id": "05b3199014b3aaf5608febb71f33e86acb32344040c1c2166968571b852fae39",
        "Created": "2026-01-01T20:57:42.271233458Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],

Commandes de nettoyage

docker system prune
Nettoie votre système en supprimant les conteneurs arrêtés, les réseaux non utilisés et les images orphelines. Ajoutez -a pour supprimer aussi les images non utilisées.

bob@debian:~$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - unused build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
992d2177e3dc0ca1cc95620679dca87e43bcc10010882f7175d1a93047adce4e
3a2d3dc7873dd347f2990addbf98e5dd447f2fccbb3202a46b0ffcd5392c2617
313121395b549051b71761eab6dff6d9c914bce88f87a9588020b53f489618d4
7007dc02bc51d7e0663e713a4cd18b6f7aa28f89092ee8b4a266c2cba9f08aed
a0c3192aa39ad6d476b218a3ce088d5751d88b0daf26f83f3243b2bbc3adb02c

Total reclaimed space: 167.9kB

docker volume prune
Supprime tous les volumes Docker non utilisés pour libérer de l’espace disque.

Options courantes à connaître

Lors de l’utilisation de docker run, plusieurs options sont très utiles :

  • -d : mode détaché (le conteneur tourne en arrière-plan)
  • -p <port-hôte>:<port-conteneur> : expose un port du conteneur vers l’hôte
  • --name <nom> : donne un nom personnalisé au conteneur
  • -v <chemin-hôte>:<chemin-conteneur> : monte un volume pour persister les données
  • -e <VARIABLE=valeur> : définit une variable d’environnement
  • --rm : supprime automatiquement le conteneur quand il s’arrête

Les volumes : conserver les données

Par défaut, les données stockées dans un conteneur sont perdues lorsqu’il est supprimé. Pour éviter cela, on utilise des volumes.

bob@debian:~$ docker run -d -p 8080:80 --name web_server -v /home/bob/data:/usr/share/nginx/html nginx
319745848d13bfe238d87a367f3920ac539dd15041fcbfffd4fc8830fa9d022a
bob@debian:~$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                     NAMES
319745848d13   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 5 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   web_server

Cela permet de stocker les fichiers du site web sur la machine hôte.

On peut maintenant stocker les fichiers du serveur web dans /home/bob/data

Pour aller plus loin

Une fois ces commandes maîtrisées, vous serez capable de gérer le cycle de vie complet de vos conteneurs Docker. N’hésitez pas à consulter la documentation officielle avec docker --help ou docker <commande> --help pour découvrir toutes les options disponibles. La pratique reste le meilleur moyen d’apprendre, alors lancez-vous et expérimentez !

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *