Docker au quotidien
Création de container
Créer un container revient à lancer un processus dans un contexte d'isolation. Ce container est créé à partir d'une image contenant un système de fichiers complet, ainsi que toutes les dépendances nécessaires au fonctionnement d'une application. Ce container est disponible via un registry.
Le lancement d'un container s'effectue de la manière suivante :
docker container run [OPTIONS] image [COMMAND] [ARG]L'ensemble des commandes est disponible à l'adresse suivante : https://docs.docker.com/engine/reference/commandline/run/
Le mode intéractif
Soit l'exemple suivant :
docker container run -it -i ubuntu bashLe flag -t ajout un pseudo TTY et -i garde le stdin ouvert. Le shell est alors accessible depuis un terminal.
Foreground vs Background
Par défaut un container est lancé en foreground. Toutefois si l'option -d est stipulée, il sera alors lancé en background et l'identifiant du container créé sera retourné.
Dans l'exemple suivant, le container lancera un ping sur les dns de Google au démarrage du container
docker container run -d alpine ping 8.8.8.8docker container run -d nginx
e1604d2535b5d479adb74356c43a26b9962a459ecdf62304b7be8dbf9ffa91eaPublication de port
Dans l'exemple précédent nous avons lancé une instance de l'image Nginx en tâche de fond. Toutefois celui-ci n'est pas acecssible depuis l'extérieur. Pour palier à cette problématique il convient de binder un port.
docker container run -d -p 8080:80On peut alors y accéder depuis http://localhost:8080/. Le port 8080 de la machine hôte est donc bindé sur le port 80 du container. On parle d'allocation statique.
Il est toutefois possible d'alloue dynamiquement un port via le flag -Pdocker container run -d -P nginx
Docker utilise alors un port dont le range est compris entre 32768 et 65535. Il est à noter que si un port est déjà utilisé, le daemon retournera une erreur.
Bind mount
Le bind de répertoire ou de fichier consiste à monter une source issue de la machine hôte sur un répertoire ou fichier du container à l'aide de l'option -v ou -mount.
docker container run -v $PWD/src:/var/www/html httpddocker run --mount type=bind,src=$PWD/src,dst=/var/www/html httpdDans les 2 cas il est à noter l'usage de la variable d'environnement $PWD, indispensable au bon fonctionnement de la commande ; Docker ne sachant pas utiliser de chemin relatif dans le cas présent.
Lors du dévelopement d'une application web il est par exemple très pratique de pouvoir mapper directement les sources du projet sur le vhost du serveur http installé dans le container.
Attention toutefois au bind-mount. Il est de bon ton de limiter les permissions en read-only lorsque l'on mappe un volume sur le container. un montage tel que le suivant pourrait avoir des effets désastreux
docker container run -v /:/host -ti alpineD'une part il s'agit du genre de montage que l'on ne souhaite pas faire et d'autre il conviendrait de rajouter le flag :ro pour limiter les risques
docker container run -v /:/host:ro -ti alpineUn autre cas d'usage très pratique du bind consiste à permettre au container d'utiliser la socket de docker afin de pouvoir contrôler le daemon docker depuis le container. C'est par exemple le cas de Portainer, un outil dédié à cet usage.
Lorsque l'on lance un container avec bind mount de la socket il devient alors possible d'utiliser l'api de dockerd
docker container run -d --name test -ti -v /var/run/docker.sock:/var/run/docker.sock alpine sleep infinity
docker exec -it test apk add curl
docker exec -it test curl --unix-socket /var/run/docker.sock -X POST http://localhost/v1.41/containers/[CONTAINER_ID]/startOn pourra également s'attacher au daemon de docker afin d'écouter en temps réel les différents événements.
curl --unix-socket /var/run/docker.sock http://localhost/eventsL'ensemble des possibilités offertes par l'api de Docker est accessible à l'adresse suivante : https://docs.docker.com/engine/api/sdk/examples/ .
Limiter les ressources
Par défaut aucune limite n'est appliquée aux containers : CPU, RAM et I/O sont illimités. Les ressources étant partagées via le kernel, il est nécessaire d'imposer des limites afin de ne pas impacter le reste du système.
La liste des limitations applicables à un container est disponible sur https://docs.docker.com/config/containers/resource_constraints/.
Commandes de base
Voici quelques exemples de commandes de bases utiles pour une utisation de Docker quotidienne
docker container [CMD] [ARGS]| Commande | Description |
|---|---|
| run | Démarre un container |
| ls | Liste les containers |
| inspect | Liste un container |
| logs | Visualise les logs d'un container |
| exec | Exécute un processus au sein d'un container |
| stop | Arrête un container |
| rm | Supprime un container |
Lister les containers actifs
docker container lsLister les containers actifs et stoppés
docker container ls -aLister les ids des containers actifs et stoppés
docker container ls -a -Inspecter un container
docker inspect [CONTAINER_ID_OR_NAME]Visualiser les logs d'un container
docker container logs -f [CONTAINER_ID_OR_NAME]Exécuter une commande au sein d'un container
docker container exec -it [CONTAINER_ID_OR_NAME] shStopper un container
docker stop [CONTAINER_ID_OR_NAME]Stopper tous les containers
docker stop $(docker container ls -)Supprimer un container
docker container rm [CONTAINER_ID_OR_NAME]Supprimer tous les containers
docker container rm -f $(docker container ls -aq)Spécifier le nom du container
docker container run -d --name sancho alpine:3.20 sleep 1000Supprimer un container automatiquement lorsqu'il est stoppé
docker container run --rm --name debug alpine:3.20 sleep 1000Redémarrer automatiquement un container
docker container run --name api --restart=on-failure nodePortainer
Portainer a pour vocation de simplifier la gestion des différents containers en proposant une interface graphique accessible via un navigateur web à l'adresse suivante http://localhost:9000.
Pour l'installer, en mode standalone, il est nécessaire de :
- Créer un volume
docker volume create portainer_data- Démarrer portainer
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ee:2.21.1La documentation officielle fournit une documentation plus complète sur les différentes manières d'installer Portainer.