Ein Container voller Himbeeren: Docker auf dem Raspberry Pi

the next big thing  –  3 Kommentare

Der Raspberry Pi dient vielen Webentwicklern als Einstieg in das Internet der Dinge. Das Deployment basiert auf SSH und ist daher zwar mächtig, allerdings auch umständlich. Außerdem erfordert die verwendete ARM-Architektur speziell angepasste Anwendungen. Warum also nicht Docker auf dem Raspberry Pi ausführen, um das Problem zu lösen?

Seit der initialen Veröffentlichung im März 2013 hat sich Docker zum Quasi-Standard für das Deployment von Cloud-Anwendungen entwickelt. Das Verpacken einer Anwendung erfolgt anhand einer Konfigurationsdatei entweder von Hand, auf einem Buildserver oder – unterstützt durch GitHub und den Docker Hub – vollständig in der Cloud. Das Vorgehen setzt eine x64-kompatible Hardware als Basis voraus.

Der Raspberry Pi basiert allerdings wie auch sein Nachfolger, der Raspberry Pi 2, auf der ARM-Architektur: Das heißt, dass die üblichen Images auf der Plattform nicht lauffähig sind, sondern speziell für den Raspberry Pi angepasst werden müssen. Das gilt nicht nur für die Basis-Images, sondern auch für die darauf aufbauenden anwendungsspezifischen Images.

Will man den Aufwand und die Fallstricke einer Cross-Übersetzung vermeiden, bleibt lediglich die Möglichkeit, das Image direkt auf einem Raspberry Pi zu bauen. Dazu muss sich Docker aber zunächst selbst auf dem Raspberry Pi ausführen lassen.

Abhilfe schafft das Projekt Hypriot, das ein SD-Karten-Image für den Raspberry Pi entwickelt. Das Image basiert derzeit auf dem Linux-Kernel 3.18.8, verwendet Raspbian als Betriebssystem und enthält Docker 1.5.0. Zusätzlich unterstützt das Image den Zugriff per FTDI-Kabel, sodass sich der Raspberry Pi rein über den USB-Anschluss des Computers betreiben lässt. Bemerkenswert ist darüber hinaus, dass das Image ohne Anpassungen auf dem Raspberry Pi und dem Raspberry Pi 2 lauffähig ist.

Um das Image zu verwenden, muss man es zunächst herunterladen, entpacken und auf eine SD-Karte übertragen. Danach lässt sich der Raspberry Pi mit der SD-Karte starten. Die Anmeldung gelingt per SSH mit dem Benutzernamen root und dem Kennwort hypriot. Anschließend lässt sich unter anderem Node.js auf dem Raspberry Pi ausführen, indem man ein fertiges Docker-Image verwendet:

$ docker run -it thenativeweb/rpi-node bash

Alternativ lässt sich ein eigenes Image bauen, indem man ein Dockerfile erzeugt und darin von einem bestehenden Basis-Image ableitet:

FROM resin/rpi-raspbian:jessie
MAINTAINER the native web <hello@thenativeweb.io>

RUN
apt-get update && \
apt-get install -y build-essential git libssl-dev python wget

RUN
wget http://nodejs.org/dist/v0.10.28/
node-v0.10.28-linux-arm-pi.tar.gz && \
tar -xvzf node-v0.10.28-linux-arm-pi.tar.gz && \
rm node-v0.10.28-linux-arm-pi.tar.gz && \
mv node-v0.10.28-linux-arm-pi opt/node

ENV
PATH $PATH:/opt/node/bin

Anschließend gilt es, das Image durch einen Aufruf des build-Kommandos von Docker zu bauen:

$ docker build --no-cache -t thenativeweb/rpi-node 

Auf beiden Wegen erhält man ein Raspberry Pi-kompatibles Docker-Image, das sich anschließend für den Betrieb eigener Anwendungen verwenden lässt. Legt man ein eigenentwickeltes Image zudem im Docker Hub ab, kann man es zu einem späteren Zeitpunkt bequem wiederverwenden, ohne es erneut bauen zu müssen.

Das Ausführen von Docker auf dem Raspberry Pi mit Hilfe einer Hypriot-basierten SD-Karte genügt für viele Anwendungsfälle, löst allerdings das Problem des Deployments nicht. Das Problem löst das Unternehmen Resin.io, das sich auf das Übertragen von Containern auf IoT-Hardware wie den Raspberry Pi spezialisiert hat.

Dazu ist zunächst das Registrieren eines Benutzerkontos bei Resin.io erforderlich. Nach dem Anmelden lassen sich dann Anwendungen registrieren und mit bestehenden Geräten wie dem Raspberry Pi verbinden. Resin.io unterstützt neben dem Raspberry Pi auch den Raspberry Pi 2 und das BeagleBone Black, weitere Geräte wie Intel Edison und Intel NUC sind in Vorbereitung.

Für jedes Gerät ist zunächst die Art der Internetverbindung (LAN oder WLAN) auszuwählen. Im Fall von WLAN müssen zudem die Anmeldedaten des WLANs angegeben werden. Anschließend lässt sich ein individuell auf das jeweilige Gerät zugeschnittenes SD-Karten-Image herunterladen, das auf dem bereits bekannten Weg auf eine SD-Karte übertragen werden muss.

Nach dem Starten registriert sich der Raspberry Pi innerhalb weniger Minuten bei Resin.io und wird in der Web-Oberfläche innerhalb der zuvor zugeordneten Anwendung angezeigt. Jeder Anwendung wird zudem ein Git-Endpunkt zugeordnet, was das Deployment per git push ermöglicht. Dazu ist es lediglich erforderlich, den Endpunkt dem lokalen Repository einmalig hinzuzufügen:

$ git remote add resin git@git.resin.io:<user>/<application>.git

Anschließend gelingt das Deployment mit einem einzigen Aufruf auf der Kommandozeile:

$ git push resin master

Resin.io verpackt die Anwendung automatisch in ein geeignetes Image. Genügt dieses den individuellen Anforderungen nicht, lässt sich der Anwendung ein Dockerfile hinzufügen, das die genauen Details vorgibt. Selbstverständlich ist es bei dem Vorgehen erforderlich, ein für den Raspberry Pi geeignetes Basis-Image wie das zuvor erwähnte thenativeweb/rpi-node zu verwenden. Auf dem Weg lässt sich jedoch nicht nur Node.js nutzen, sondern auch jede beliebige andere Plattform.

Nach dem Bauen überträgt Resin.io das Image automatisch auf die der Anwendung zugeordneten Geräte. Der Vorgang dauert unter Umständen zwar einige Minuten, verläuft aber ohne Probleme. Ist ein Gerät zum Zeitpunkt eines Updates nicht online, holt Resin.io das Deployment automatisch zu einem späteren Zeitpunkt nach.

Auch den Zugriff auf die GPIO-Schnittstelle gestattet Resin.io. Zu diesem Zweck empfiehlt das Unternehmen das Modul pi-pins, das ebenfalls zuverlässig funktioniert.

Vergleicht man Hypriot und Resin.io, fallen zahlreiche Gemeinsamkeiten auf, sowohl in positiver wie auch in negativer Hinsicht. Beide Projekte reduzieren den Aufwand für den Einsatz von Docker auf dem Raspberry Pi auf wenige Klicks und funktionieren ausgesprochen zuverlässig. Allerdings mangelt es auch beiden Projekten an Transparenz, was tatsächlich auf dem Gerät ausgeführt wird.

In beiden Fällen ist ein Fernzugriff auf den Raspberry Pi möglich, bei Hypriot direkt per SSH, bei Resin.io mit Hilfe eines Web-basierten Terminals. Da der Aufwand zum Überprüfen eines proprietären Systems auf Schwachstellen und Hintertüren allerdings enorm hoch ist, läuft es letztlich trotzdem auf die simple Frage hinaus, ob man den jeweiligen Anbieter als vertrauenswürdig einstuft oder nicht. Mehr Offenheit und Transparenz wäre daher sowohl bei Hypriot als auch bei Resin.io höchst wünschenswert.

Sieht man über diese Bedenken hinweg, ergänzen die beiden Projekte einander ausgezeichnet, da sie den Schwerpunkt allen Gemeinsamkeiten zum Trotz unterschiedlich wählen: Hypriot bietet sich vor allem dann an, wenn eigene Docker-Images entwickelt werden sollen. Resin.io hingegen ist der Vorzug zu geben, wenn ein einfaches Deployment wünschenswert und die Verbindung zwischen Gerät und Cloud auf Grund der geplanten Anwendung ohnehin gegeben ist.

Auf jeden Fall tragen sowohl Hypriot als auch Resin.io maßgeblich dazu bei, Docker auf dem Raspberry Pi salonfähig zu machen. Jedem Entwickler, der sich mit dem Internet der Dinge auf Basis der ARM-Plattform beschäftigen will, seien sie daher ans Herz gelegt.

tl;dr: Hypriot und Resin.io führen Docker auf dem Raspberry Pi aus. Hypriot legt den Schwerpunkt eher auf die Entwicklung, Resin.io auf das Deployment. Wer Docker auf der ARM-Plattform ausführen will, sollte sich die beiden Projekte daher näher ansehen.