Skip to content

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 :

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

shell
docker container run -it -i ubuntu bash

Le 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

shell
docker container run -d alpine ping 8.8.8.8
shell
docker container run -d nginx
e1604d2535b5d479adb74356c43a26b9962a459ecdf62304b7be8dbf9ffa91ea

Publication 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.

shell
docker container run -d -p 8080:80

On 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.

shell
docker container run -v $PWD/src:/var/www/html httpd
shell
docker run --mount type=bind,src=$PWD/src,dst=/var/www/html httpd

Dans 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

shell
docker container run -v /:/host -ti alpine

D'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

shell
docker container run -v /:/host:ro -ti alpine

Un 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

shell
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]/start

On pourra également s'attacher au daemon de docker afin d'écouter en temps réel les différents événements.

shell
curl --unix-socket /var/run/docker.sock http://localhost/events

L'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

shell
docker container [CMD] [ARGS]
CommandeDescription
runDémarre un container
lsListe les containers
inspectListe un container
logsVisualise les logs d'un container
execExécute un processus au sein d'un container
stopArrête un container
rmSupprime un container

Lister les containers actifs

shell
docker container ls

Lister les containers actifs et stoppés

shell
docker container ls -a

Lister les ids des containers actifs et stoppés

shell
docker container ls -a -

Inspecter un container

shell
docker inspect [CONTAINER_ID_OR_NAME]

Visualiser les logs d'un container

shell
docker container logs -f [CONTAINER_ID_OR_NAME]

Exécuter une commande au sein d'un container

shell
docker container exec -it [CONTAINER_ID_OR_NAME] sh

Stopper un container

shell
docker stop [CONTAINER_ID_OR_NAME]

Stopper tous les containers

shell
docker stop $(docker container ls -)

Supprimer un container

shell
docker container rm [CONTAINER_ID_OR_NAME]

Supprimer tous les containers

shell
docker container rm -f $(docker container ls -aq)

Spécifier le nom du container

shell
docker container run -d --name sancho alpine:3.20 sleep 1000

Supprimer un container automatiquement lorsqu'il est stoppé

shell
docker container run --rm --name debug alpine:3.20 sleep 1000

Redémarrer automatiquement un container

shell
docker container run --name api --restart=on-failure node

Portainer

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
shell
docker volume create portainer_data
  • Démarrer portainer
shell
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.1

La documentation officielle fournit une documentation plus complète sur les différentes manières d'installer Portainer.