Proxy filtrant devant l'API Docker. Il permet à un service de lire l'état des conteneurs sans lui donner accès au socket Docker, qui équivaut à un accès root sur l'hôte.
Utilisateurs
| Service | Besoin | Requête |
|---|---|---|
| n8n | Notification des mises à jour de conteneurs | GET /containers/json |
Stack
services:
dockersocket:
image: tecnativa/docker-socket-proxy:latest
container_name: dockersocket
restart: unless-stopped
environment:
- CONTAINERS=1
- POST=0
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- docker-api
networks:
docker-api:
name: docker-api
dockersocket:
image: tecnativa/docker-socket-proxy:latest
container_name: dockersocket
restart: unless-stopped
environment:
- CONTAINERS=1
- POST=0
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- docker-api
networks:
docker-api:
name: docker-api
- Seule la lecture des conteneurs est ouverte ; toutes les autres sections de l'API sont fermées par défaut.
- POST=0 interdit toute écriture : création, arrêt ou suppression de conteneurs sont refusés (403).
- Le proxy est sur un réseau dédié, docker-api. Seuls les services qui en ont besoin y sont ajoutés, en déclarant ce réseau en external dans leur stack.
Vérifier
Depuis un conteneur autorisé, la lecture doit fonctionner et l'écriture être refusée :
docker exec n8n wget -qO- http://dockersocket:2375/containers/json | head -c 80; echo
docker exec n8n wget -qO- --post-data='' http://dockersocket:2375/containers/create 2>&1 | tail -1
docker exec n8n wget -qO- --post-data='' http://dockersocket:2375/containers/create 2>&1 | tail -1
Voir quelles requêtes passent réellement par le proxy :
docker logs dockersocket --since 24h 2>&1 | grep -oE '(GET|POST|DELETE|PUT) [^ ]+' | sed -E 's/\?.*//' | sort | uniq -c | sort -rn