8.1 a. Introduction
Un socket est un point de terminaison dans un réseau qui permet la transmission de données entre applications. docker.sock est un socket Unix utilisé par le démon Docker (dockerd) pour permettre la communication avec le démon via l'API REST.
Le fichier /var/run/docker.sock représente ce socket Unix sur lequel le démon Docker écoute par défaut et qui peut être monté dans un conteneur pour permettre l'interaction avec l'API Docker. En tant que fichier, il peut être partagé et monté dans un conteneur, permettant à celui-ci de communiquer directement avec le démon Docker de l'hôte. Il peut ainsi démarrer ou arrêter d'autres conteneurs, créer des images Docker, ou même accéder au système de fichiers de l'hôte.
8.2 b. Communiquer avec le socket Docker grâce à curl
Commençons par installer l'utilitaire jq, qui permettra de formater les réponses JSON de manière lisible pour les étapes suivantes :
sudo apt install jq -y
Pour afficher la version actuelle de Docker, utilisez la commande suivante :
curl --silent -XGET --unix-socket /run/docker.sock http://localhost/version | jq .
Exemple de sortie :
{
"Platform": {
"Name": "Docker Engine - Community"
}
}
La commande suivante permet d'afficher les informations générales de Docker via le chemin /info :
curl --silent -XGET --unix-socket /run/docker.sock http://localhost/info | jq .
Il est également possible de surveiller en temps réel les événements de l'instance Docker via le chemin /events :
curl --silent -XGET --unix-socket /run/docker.sock http://localhost/events
8.3 c. Créer un conteneur en interagissant avec la socket Docker
Tout d'abord, récupérons l'image officielle de Nginx avec la commande suivante :
docker image pull nginx:latest
Ensuite, créons un conteneur basé sur cette image en communiquant avec la socket Docker via une requête HTTP POST, en transmettant les paramètres requis dans le corps de la requête :
curl --silent -XPOST --unix-socket /run/docker.sock \
-d '{"Image":"nginx:latest"}' \
-H 'Content-Type: application/json' \
http://localhost/containers/create?name=nginx
Exemple de sortie :
{"Id":"2952cbbedd48...","Warnings":[]}
Nous pouvons maintenant démarrer ce conteneur en utilisant l'ID fourni par Docker :
curl --silent -XPOST --unix-socket /run/docker.sock \
-H 'Content-Type: application/json' \
http://localhost/containers/2952cbbedd48949728daa148796636b15d96297aa332e28cba963abef9ae593d/start
Vérifions ensuite que le conteneur Nginx est bien en cours d'exécution avec la commande :
docker ps
Exemple de sortie :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2952cbbedd48 nginx:latest "/docker-entrypoint.…" About a minute ago Up 2 seconds 80/tcp nginx
La liste des conteneurs présents sur l'instance Docker peut être affichée avec la commande suivante :
curl --silent -XGET --unix-socket /run/docker.sock \
-H 'Content-Type: application/json' \
http://localhost/containers/json | jq .
Exemple de sortie :
[
{
"Id": "2952cbbedd48949728daa148796636b15d96297aa332e28cba963abef9ae593d",
"Names": ["/nginx"],
"Image": "nginx:latest",
"State": "running",
"Status": "Up 4 minutes"
}
]
8.4 Conclusion
Nous avons démontré qu'il est possible de communiquer avec le démon Docker via sa socket Unix, sans passer par la ligne de commande traditionnelle. Cette méthode permet d'automatiser les interactions avec Docker via des requêtes HTTP, mais elle nécessite une gestion rigoureuse des droits d'accès pour éviter tout risque de sécurité.