Docker auf dem Raspberry Pi
Docker
Docker ist eine Containerisierungstechnologie, die es ermöglicht eine leichtgewichtige Virtualisierung zu erreichen. Im Unterschied zu VMs wird bei Docker Containern keine Emulation der Hardware verwendet, sondern Applikationen mittels namespaces isoliert. Docker Container stellen abgekapselte Einheiten dar, die unabhängig voneinander ausgeführt werden können, egal wo sie sich gerade befinden. Die Container sind schnell und effizient skalierbar, falls mehr Instanzen einer Anwendung benötigt werden. Die Basis eines Docker Containers bildet ein Docker-Image, das alle Komponenten enthält um eine Applikation plattformunabhängig auszuführen.

Installation von Docker
Herunterladen des Installations-Skripts und Ausführung dieses Skriptes
curl -sSL https://get.docker.com | sh
Pi-Benutzer die Erlaubnis zum Ausführen von Docker-Befehlen erteilen
sudo usermod -aG docker pi
Nach des Befehls sollte der Raspberry Pi neugestartet werden, oder die nächsten Befehle sollten mit sudo
ausgeführt werden!
Um zu testen ob Docker funktioniert kann Hello-World ausgeführt werden
docker run hello-world
Als Ausgabe sollte nun folgende sein, wenn alles funktioniert hat:
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Eigenes Docker-Image
Das Schreiben eines Dockerfiles ist der erste Schritt zum Image-Erstellen einer Anwendung. Das Dockerfile in der Bulletin-Board-Anwendung sieht wie folgt aus:
# Use the official image as a parent image.
FROM node:current-slim
# Set the working directory.
WORKDIR /usr/src/app
# Copy the file from your host to your current location.
COPY package.json .
# Run the command inside your image filesystem.
RUN npm install
# Add metadata to the image to describe which port the container is listening on at runtime.
EXPOSE 8080
# Run the specified command within the container.
CMD [ „npm“, „start“ ]
# Copy the rest of your app’s source code from your host to your image filesystem.
COPY . .
Dotnet Anwendung als Docker-Image
Installation der Dotnet-Runtime
# Herunterladen der Dotnet-Runtime 3.5
wget https://download.visualstudio.microsoft.com/download/pr/a2223d1f-c138-4586-8cd1-274c5387e975/623ece755546aca8f4be268f525683c5/aspnetcore-runtime-3.1.10-linux-arm.tar.gz
# Erstellen des Verzeichnisses
sudo mkdir -p $HOME/dotnet
# Entpacken der Anwendung ins ausgewählte Verzeichnis
sudo tar zxf dotnet-sdk-3.1.100-linux-arm.tar.gz -C $HOME/dotnet
# Setzen der Pfade für Dotnet
export DOTNET_ROOT=$HOME/dotnet
# Verlinkung der Dotnet Anwendung
export PATH=$PATH:$HOME/dotnet
Beispielanwendung
Zu Demonstrationszwecken wurde eine kleine C# Test-Awendung erstellt, welche Dotnet-Core Runtime benötigt. Das Update-script kompiliert das Programm und erstellt danach das Docker-Image. Hierbei wird auch noch Dotnet-Core SDK benötigt. Die Anwendung wird beim Image-Build vom Hauptverzeichniss in das App Verzeichniss im Docker-Image kopiert und dann ausgeführt. Da es nur eine Konsolen-Applikation mit einem einmaligen Log ist, beendet sich der Container sofort wieder. Wenn der Container dauerhauft laufen soll, muss eine Endlosschleife in der Anwendung ausgeführt werden.
Dockerfile auf dem Raspberry Pi
FROM mcr.microsoft.com/dotnet/core/runtime:3.1.9-buster-slim-arm32v7
WORKDIR /app
COPY program/bin/Release/netcoreapp3.0/ .
COPY data data
CMD [„./program“]
Update-script
#!/bin/bash
cd /home/pi/Projects/docker/program/
git fetch
if git status | grep -q "behind"; then
git pull
dotnet build --configuration Release
cd ..
docker rm $(docker stop $(docker ps -a -q --filter ancestor=program:1.0 --format="{{.ID}}"))
docker build --tag program:1.0 .
docker container run program:1.0
fi
Das folgende EPK zeigt die funktionsweise des Updatescriptes.

Cron-Jobs
# aufrufen aller cron jobs
crontab -e
# akuteller cron job auf dem Raspberry pi
5 * * * * /home/pi/Projects/docker/update.sh
Git Repo
Debugging
docker exec -it <id> bash
Alternative Geräte und Boards
OrangePi
BananaPi
RockPi4
Intel: System on a Stick
LattePanda 4G/64G
Vortragsfolien
Vortragsfolien: Docker auf Raspberry Pi
Autoren: Sebastian Pötter, Mathis Greve
Eine Antwort auf “Docker auf dem Raspberry Pi”