Installing docker-exporter on Raspberry Pi 5 / ARM64
Two ways to run it — docker run or Docker Compose — plus a one-line Docker-group GID fix when the socket needs group access (the common case on Raspberry Pi and other hardened hosts).
The image is published to GHCR for linux/amd64 and linux/arm64:
ghcr.io/dlepaux/docker-exporter:latestPin a specific version (e.g. :1.4.0) in production rather than :latest.
docker run
docker run -d \
--name docker-exporter \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-p 9713:9713 \
--restart unless-stopped \
ghcr.io/dlepaux/docker-exporter:latestThe :ro on the socket mount is deliberate — docker-exporter only ever reads.
Docker Compose
services:
docker-exporter:
image: ghcr.io/dlepaux/docker-exporter:latest
container_name: docker-exporter
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- "9713:9713"Fixing Docker socket permission errors on Raspberry Pi
docker-exporter runs as UID 65532 (the distroless nonroot user). The Docker socket is normally owned by root:docker, so the container needs the host's docker group GID to read it:
docker run -d \
--name docker-exporter \
--group-add "$(getent group docker | cut -d: -f3)" \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-p 9713:9713 \
ghcr.io/dlepaux/docker-exporter:latestIf the exporter exits immediately or /metrics shows docker_exporter_up 0, a missing docker group GID is the usual cause — see Troubleshooting.
Rootless Docker
Rootless Docker exposes the socket at $XDG_RUNTIME_DIR/docker.sock, not /var/run/docker.sock — see Docker's rootless mode docs. Mount that path instead.
Verify
curl -s http://localhost:9713/metrics | head
curl -s http://localhost:9713/health # -> 200 okIf container_memory_working_set_bytes reads zero in /metrics, that's a host cgroup-v2 / Raspberry Pi config issue (memory cgroups disabled by default), not this exporter — see Why cAdvisor shows zero memory on Raspberry Pi 5.
docker ps also shows a health status — the image's HEALTHCHECK runs the binary with --health, a TCP liveness probe to its own port on loopback (no shell, no wget). It only confirms the server is listening, though; the /health endpoint is what verifies the Docker daemon is reachable.
Next
- Configuration — bind address, log level, container exclusion.
- Prometheus & Grafana — scrape configuration and dashboards.
- Why cAdvisor shows zero memory on Raspberry Pi 5 — if you're migrating from cAdvisor and memory metrics look wrong.
- docker-exporter vs cAdvisor — footprint and correctness comparison if you're evaluating both.