Kolumne

Docker rockt Java: Docker-Cluster auf dem Raspberry Pi

Peter Roßbach

© Shutterstock/Mclek

Peter Roßbach ist zurück mit einer neuen Folge seiner Kolumne „Docker rockt Java.“ Dieses Mal geht es dem JAX-Speaker um die Verbindung von Docker mit dem Raspberry Pi.

Docker-Cluster auf dem Raspberry Pi

Auf der DockerCon 2015 in San Francisco stellte Dieter Reuter erstmalig die Hypriot-Raspberry-Pi-Docker-Portierung vor. Offiziell ist Docker nur auf x86_64 Bit verfügbar, aber schon Ende 2013 gab es Portierungen für den ARM-basierten Raspberry Pi. Das Hypriot-Team hat sich nun entschlossen, eine echte Edition mit Tools und wichtigen Docker-Basis-Images bereitzustellen. Zeit für einen ersten Test.

Auf den ersten Blick mag es komisch anmuten, sich mit Docker auf einem Raspberry Pi zu beschäftigen. Der Raspberry Pi ist ein wirklich preiswerter Rechner, der zur Steuerung von IOT-Geräten, als Einstiegscomputer für Kinder oder als Multimediazentrale eingesetzt wird. Der Raspberry Pi 2 arbeitet mit einem Quad-Core ARM 7, vier USB-2-Ports, 100 Mbit Ethernet, HDMI-Ausgang, diversen IO-Schnittstellen und hat 1 GB Ram – genug Power für Experimente. Die Vielfalt von Betriebssystemen und Lösungen kennt schier keine Grenzen. Allerdings ist die Verbreitung von fertiger Software eine Herausforderung. Oft müssen die Programme anderer Entwickler mühsam zusammen installiert und konfiguriert werden. Mit Docker könnte hier eine entscheidende Erleichterung zur Lieferung und Verbreitung von Software für den Raspberry Pi entstehen. Die Software wird einfach als Docker-Images verpackt, auf eine Docker Registry oder den offiziellen Hub gepusht und kann somit auf jedem Docker-RPI geladen werden. Sogar Docker-Cluster-Experimente mit mehreren Raspberry-Pi-Maschinen sind dann möglich (Abb. 1). Erste Hadoop-, Crate-, resin.io- oder Cassandra-Cluster sind schon auf diversen IT-Konferenzen vorgeführt worden.

DevOpsCon Whitepaper 2018

Free: BRAND NEW DevOps Whitepaper 2018

Learn about Containers,Continuous Delivery, DevOps Culture, Cloud Platforms & Security with articles by experts like Michiel Rook, Christoph Engelbert, Scott Sanders and many more.

Die Portierung von Docker auf den ARM-basierten Raspberry Pi gelingt gut, da für Docker die Programmiersprache Go verwendet wird. In verschiedenen Linux-Distribution für den Raspberry Pi steht seit diesem Jahr ein Docker-Package bereit, leider nicht immer aktuell oder ohne Unterstützung aller Features. Das Hypriot-Team liefert nun ein fertiges SD-Card-Image mit einem halbwegs aktuellen Linux-Kernel und netterweise immer aktuellem Docker-Release. Die Edition basiert auf Debian Wheezy, ein Beta-Debian-Jessie-Release ist ebenfalls verfügbar.

Abb. 1: Docker-Raspberry-Pi-Cluster

Abb. 1: Docker-Raspberry-Pi-Cluster

Docker auf Raspberry Pi

Das Hypriot-SD-Card-Image muss in einem ersten Schritt geladen und auf eine entsprechende SD-Karte kopiert werden. Mit den entsprechenden Tools unter Linux oder dem Mac gelingt das spielerisch. Allerdings bietet das Flash-Skript von Hypriot die Möglichkeit zur Konfiguration des Images, (Listing 1). So können Card-Images aus dem lokalen Dateisystem, von einem HTTP-Server oder via S3 Storage verwendet werden. Neben dem Hostnamen kann auch gleich der Zugang zu dem lokalen WiFi-Netz konfiguriert werden, falls eine WiFi-Anbindung auf dem Raspberry Pi verfügbar ist. Es sollte mindestens eine 4-GB-SD-Card, besser eine 16-GB-Karte gewählt werden. Nach dem Einsetzen der neuen Karte in den Raspberry Pi und dem obligatorischen Booten ist der Docker Raspberry Pi nun mit SSH erreichbar. Beim ersten Start wird automatisch das Dateisystem auf die maximale Größe gebracht. Um sich weitere lästige Anmeldungen zu ersparen, lohnt es sich, den eigenen SSH Public Key auf dem Root-Account des Raspberry Pi in der Datei /root/.ssh/authorized_keys abzulegen.

$ wget https://raw.githubusercontent.com/hypriot/flash/master/$(uname -s)/flash
$ chmod +x flash
$ sudo mv flash /usr/local/bin/flash
$ brew install pv
$ brew install awscli
$ flash help
...
  --config|-c    Copy this config file to /boot/occidentalis.txt
  --hostname|-n  Set hostname for this SD image
  --ssid|-s      Set WiFi SSID for this SD image
  --password|-p  Set WiFI password for this SD image
...
$ flash --hostname rpi-001 \
  http://downloads.hypriot.com/hypriot-rpi-20150416-201537.img.zip

Die Card-Images unterstützen zurzeit Raspberry Pi 1 und 2. Im Debian-Wheezy-Image ist Docker 1.6 installiert. Neuere Docker-Releases können von der Hypriot-Site direkt geladen und manuell installiert werden. Nach dem Restart des Docker Daemon ist die aktuelle Version verfügbar. Es kommt ein modernes Overlay-Filesystem auf der Basis eines 3.18-Linux-Kernels zum Einsatz (Listing 2). Damit auch die neuesten Optionen in der Bash Completion bereitstehen, kann das Docker-Completion-Skript installiert werden. Im offiziellen Docker-Hub befinden sich schon einige ARM-Images. Sehr häufig wird das Base-Image von resin.io verwendet. So ist es nun problemlos möglich, ein Docker-Base-Image mit Jessie zu laden (Listing 3). Genauso stehen die Linux-Distribution Arch Linux, BusyBox oder Alpine zur Verfügung. Die eigene Software kann nun einfach für verschiedene Distributionen auf einem Raspberry Pi ohne lästiges Wechseln der SD-Karte und booten getestet werden. Das Risiko, dass eine Installation von Services, Programmen und Tools die eigene SD-Card-Installation zerstört, wird durch den Einsatz von Docker nun minimiert. Jede Software wird in einem eigenen Image verpackt und als separater Container betrieben. Ideal wäre natürlich, dass nun auch jede Software in einem minimalen Image für Raspberry Pis verpackt wird, aber ein Docker-RPI-Library-Projekt gibt es leider noch nicht. Das Hypriot-Team hat schon verschiedene Sprach- und Tool-Images bereitgestellt, sucht aber noch Hilfe oder Sponsoren für ein Raspberry-Pi-Docker-Projekt.

$ wget http://downloads.hypriot.com/docker-hypriot_1.8.1-1_armhf.deb
$ dpkg -i docker-hypriot_1.8.1-1_armhf.deb
$ service docker restart
$ docker info
Containers: 18
Images: 116
Storage Driver: overlay
 Backing Filesystem: extfs
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.18.11-hypriotos-v7+
Operating System: Raspbian GNU/Linux 7 (wheezy)
CPUs: 4
Total Memory: 925.1 MiB
Name: rpi-001
ID: V57A:JOG4:5GRL:WKXF:BL2H:ZCFS:MGIF:6M3V:XD2I:FS6M:TXGU:6HRF
Labels:
 provider=hypriot
$ cd /etc/bash-completion.d
$ rm docker
$ URL_BASE=https://raw.githubusercontent.com/docker
$ wget $(URL_BASE)/docker/master/contrib/completion/bash/docker
# login again!
$ exit
$ ssh root@rpi-001
$ docker run --rm -ti resin/rpi-raspbian:jessie
> cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=Debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

Das Docker-Ökosystem trifft auf Raspberry Pis

Damit der Raum für Experimente vergrößert wird, wäre es natürlich ideal, weitere Docker-Werkzeuge auf dem Raspberry Pi bereitzustellen. Die gerade veröffentlichte Docker-Toolbox enthält die Docker Orchestration Tools, Machine, Swarm, Compose und Kitematic. Die Anpassungen und Portierungen sind vom Hypriot-Team ebenfalls geleistet worden. Auf Linux und Mac steht eine angepasste Version von Docker Machine für den Raspberry Pi bereit. Damit lässt sich dann ein Docker Swarm in der Version 0.2 nutzen. Elegant und mit denselben Tools wie für eine Cloud lässt sich ein Raspberry-Pi-Docker-Cluster orchestrieren (Abb. 2) [1]. Das Projekt Docker Compose basiert auf Python und ist ebenfalls in der aktuellen Version 1.4 direkt auf dem Raspberry Pi oder Remote ablauffähig. Die Integration in das UI-Werkzeug Kitematic für MAC OS X steht ebenfalls schon durch Hypriot bereit. Weiterhin existieren erste Portierungen für Consul, etcd, Registrator, HAProxy, NGINX, Apache, Tomcat, Java, MySql, resin.io, PostgreSQL, Hadoop, Node.js, Python, Go oder Ruby. Oftmals sind die Anpassungen von Docker-Images durch Ersetzen des Base-Images im Dockerfile möglich. Leider sind nicht immer alle Packages schon für ARM verfügbar, und hier ist dann Eigeninitiative gefordert. Da die Ressourcen auf einem Raspberry Pi begrenzt sind, bietet es sich an, lieber statische Binaries selbst anzufertigen und sie als Docker-Image bereitzustellen. Dieses Abenteuer ist dann oftmals noch zeitintensiver, lohnt sich aber in jeder Beziehung bei einer wiederholten Verwendung.

Abb. 2: Docker Raspberry Pi Swarm

Abb. 2: Docker Raspberry Pi Swarm

$ wget http://downloads.hypriot.com/docker-machine_0.4.0-dev_darwin-amd64
$ chmod +x docker-machine_0.4.0-dev_darwin-amd64
$ ln -sf docker-machine_0.4.0-dev_darwin-amd64 docker-machine
$ export PATH=$(pwd):$PATH
$ export SWARM_TOKEN=$(ssh root@rpi-001 docker run --rm hypriot/rpi-swarm create)
$ export IP=$(ssh root@rpi-001 /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}')
$ ./docker-machine create -d hypriot \
 --hypriot-ip-address=${IP} \
 --swarm \
 --swarm-master \
 --swarm-discovery token://${SWARM_TOKEN} \
 rpi-001
$ eval $(./docker-machine env rpi-001 --swarm)
$ docker info
Containers: 18
Images: 0
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 1
 rpi-001: 192.168.178.109:2376
  └ Containers: 18
  └ Reserved CPUs: 0 / 4
  └ Reserved Memory: 0 B / 971.3 MiB
CPUs: 0
Total Memory: 0 B

Fazit

Trotz der noch nicht offiziellen Unterstützung von Docker auf dem Raspberry Pi ist die gesamte aktuelle Toolbox lauffähig. Erstaunlich preiswerte Experimente lassen sich mit dieser Plattform realisieren. Für weniger als 270 Euro bekommt man einen vollwertigen Cluster mit vier Raspberry Pis, Netzteilen und Router und kann erste Betriebserfahrungen mit echter Hardware sammeln. Die Ergebnisse sind auf eine Cloud oder das eigene Rechenzentrum direkt übertragbar. Sicherlich könnten die Raspberry-Pi-Knoten mehr RAM, schnelleres IO und Netzwerk vertragen, aber dann steigt der Preis deutlich. Besonders attraktiv ist an dieser Lösung, dass für ein IoT-Projekt die Lieferungen aller Teile mit dem Docker-Ökosystem realisiert werden können. Ob Bestandteile in der Cloud oder vor Ort auf dem Raspberry Pi liegen, ist dann quasi mit derselben Toolbox zu gestalten. Dem Support von Docker auf verschiedenen Rechnerarchitekturen und Betriebssystemen gehört die Zukunft. Die ersten offiziellen verfügbaren Windows- und Solaris-Portierungen von Docker sind für das nächste Jahr angekündigt.

Aufmacherbild: Software developer von Shutterstock / Urheberrecht: Mclek

Geschrieben von
Peter Roßbach
Peter Roßbach
Peter Roßbach ist ein Infracoder, Systemarchitekt und Berater vieler Websysteme. Sein besonderes Interesse gilt dem Design und der Entwicklung von komplexen Infrastrukturen. Er ist Apache Tomcat Committer und Apache Member. Mit der bee42 solutions gmbh realisiert er Infrastrukturprodukte und bietet Schulungen auf der Grundlage des Docker-Ökosystems, aktuellen Webtechnologien, NoSQL-Datenbanken und Cloud-Plattformen an.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: