Deux concepts centraux :
Autres concepts primordiaux :
Docker Compose : Un outil pour décrire des applications multiconteneurs.
Docker Machine : Un outil pour gérer le déploiement Docker sur plusieurs machines depuis un hôte.
Docker Hub : Le service d’hébergement d’images proposé par Docker Inc. (le registry officiel)
Docker Engine pour lancer des commandes docker
Docker Compose pour lancer des application multiconteneurs
Portainer, un GUI Docker
VirtualBox pour avoir une VM Linux quand on est sur Windows
Docker est basé sur le noyau Linux :
Quatre possibilités :
Solution WSL2 : on utilise Docker Desktop WSL2:
Solution Windows : on utilise Docker Desktop for Windows:
Solution VirtualBox : on utilise Docker Engine dans une VM Linux
Solution legacy : on utilise Docker Toolbox pour configurer Docker avec le driver VirtualBox :
Pas de virtualisation nécessaire car Docker (le Docker Engine) utilise le noyau du système natif.
On peut l’installer avec le gestionnaire de paquets de l’OS mais cette version peut être trop ancienne.
Sur Ubuntu ou CentOS la méthode conseillée est d’utiliser les paquets fournis dans le dépôt officiel Docker (vous pouvez avoir des surprises avec la version snap d’Ubuntu).
Docker possède à la fois un module pour lancer les applications (runtime) et un outil de build d’application.
Pour lister les images on utilise :
docker images
docker image ls
Docker fonctionne avec des sous-commandes et propose de grandes quantités d’options pour chaque commande.
Utilisez --help
au maximum après chaque commande, sous-commande ou sous-sous-commandes
docker image --help
docker info # affiche plein d'information sur l'engine avec lequel vous êtes en contact
docker ps # affiche les conteneurs en train de tourner
docker ps -a # affiche également les conteneurs arrêtés
docker run [-d] [-p port_h:port_c] [-v dossier_h:dossier_c] <image> <commande>
créé et lance le conteneur
--name
-d
permet* de lancer le conteneur en mode daemon ou détaché et libérer le terminal-p
permet de mapper un port réseau entre l’intérieur et l’extérieur du conteneur, typiquement lorsqu’on veut accéder à l’application depuis l’hôte.-v
permet de monter un volume partagé entre l’hôte et le conteneur.--rm
(comme remove) permet de supprimer le conteneur dès qu’il s’arrête.-it
permet de lancer une commande en mode interactif (un terminal comme bash
).-a
(ou --attach
) permet de se connecter à l’entrée-sortie du processus dans le container.Le démarrage d’un conteneur est lié à une commande.
Si le conteneur n’a pas de commande, il s’arrête dès qu’il a fini de démarrer
docker run debian # s'arrête tout de suite
docker run debian echo 'attendre 10s' && sleep 10 # s'arrête après 10s
docker run
créé un nouveau conteneur à chaque fois.
docker stop <nom_ou_id_conteneur> # ne détruit pas le conteneur
docker start <nom_ou_id_conteneur> # le conteneur a déjà été créé
docker start --attach <nom_ou_id_conteneur> # lance le conteneur et s'attache à la sortie standard
Les conteneurs sont plus que des processus, ce sont des boîtes isolées grâce aux namespaces et cgroups
Depuis l’intérieur d’un conteneur, on a l’impression d’être dans un Linux autonome.
Plus précisément, un conteneur est lié à un système de fichiers (avec des dossiers /bin
, /etc
, /var
, des exécutables, des fichiers…), et possède des métadonnées (stockées en json
quelque part par Docker)
Les utilisateurs Unix à l’intérieur du conteneur ont des UID et GID qui existent classiquement sur l’hôte mais ils peuvent correspondre à un utilisateur Unix sans droits sur l’hôte si on utilise les user namespaces.
La commande docker exec
permet d’exécuter une commande à l’intérieur du conteneur s’il est lancé.
Une utilisation typique est d’introspecter un conteneur en lançant bash
(ou sh
).
docker exec -it <conteneur> /bin/bash
Une des forces de Docker vient de la distribution d’images :
pas besoin de dépendances, on récupère une boîte autonome
pas besoin de multiples versions en fonction des OS
Dans ce contexte un élément qui a fait le succès de Docker est le Docker Hub : hub.docker.com
Il s’agit d’un répertoire public et souvent gratuit d’images (officielles ou non) pour des milliers d’applications pré-configurées.
On peut y chercher et trouver presque n’importe quel logiciel au format d’image Docker.
Il suffit pour cela de chercher l’identifiant et la version de l’image désirée.
Puis utiliser docker run [<compte>/]<id_image>:<version>
La partie compte
est le compte de la personne qui a poussé ses images sur le Docker Hub. Les images Docker officielles (ubuntu
par exemple) ne sont pas liées à un compte : on peut écrire simplement ubuntu:focal
.
On peut aussi juste télécharger l’image : docker pull <image>
On peut également y créer un compte gratuit pour pousser et distribuer ses propres images, ou installer son propre serveur de distribution d’images privé ou public, appelé registry.