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.

Virtualisierung mit Docker
Aufbau der Virtualisierung mit Docker
Quelle: https://www.docker.com/sites/default/files/d8/2018-11/docker-containerized-appliction-blue-border_2.png

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.

Aktivitätsdiagramm der Beispielanwendung
EPK der Beispielanwendung mit Dotnet Core

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