Raspberry Pi mit Raspberry Pi OS und Docker

Aus Laub-Home Wiki

Der Raspberry Pi ist perfekt geeignet um die ersten Schritte mit Docker und Docker Compose zu gehen. Das Setup hier hat keine 30 Minuten in Anspruch genommen. Man kann also Ruckzuck die ersten Docker Container starten und nutzen. Eine Sache gibt es jedoch zu beachten. Aufgrund der ARM Architektur sind nicht alle Docker Images lauffähig. Nur die ARM (aarch64 / armv7l) kompatiblen Images funktionieren auf dem Raspberry Pi. Heißt auch, dass ihr ggf. die Images neu für den Raspberry Pi bauen (build) müsst.

Den Raspberry Pi 4 im Set bekommt ihr hier:

Den neuen Raspberry Pi 5 hier:


Installation Raspberry Pi OS

Um Docker zu installieren benötigt ihr ein lauffähiges Raspberry Pi OS im besten Fall eine 64bit Installation. Wie man ein aktuelles Raspbberry Pi OS installiert, könnt ihr hier nachlesen:

Installation Docker

Nun kommen wir zur Docker Installation auf dem Raspberry Pi unter Raspberry Pi OS. Dies passiert mit folgendem Einzeiler ganz einfach und schnell:

curl -sSL https://get.docker.com | sh

das war es schon. getestet werden kann das Ganze dann mit dem hello World Container:

docker run hello-world

bringt dann in etwas den folgenden Output:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4ee5c797bcd7: Pull complete 
Digest: sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm32v7)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Docker Compose

Docker Compose ist mittlerweile Bestandteil der normalen Docker Installation und muss nicht mehr nach installiert werden.

Tuning

Im Syslog tauchen einige Meldungen bezüglich Mounts auf. Ich habe diese deaktiviert:

des Weiteren kam es noch zu folgender Meldung:

  • containerd[546]: time="2020-12-02T07:53:04.917195089+01:00" level=warning msg="OOM monitoring failed" error="cgroups: memory cgroup not supported on this system"

Dies bekommt man weg in dem man die /boot/cmdline.txt um cgroup_memory=1 und cgroup_enable=memory erweitert:

/boot/cmdline.txt

console=serial0,115200 console=tty1 root=PARTUUID=738a4d67-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait cgroup_memory=1 cgroup_enable=memory

danach sollte man den Raspberry Neustarten:

reboot

IPv6 deaktivieren

DHCPCD Problem

Es kommt bei zu vielen virtuellen Docker Netzwerkinterfacen dazu, das der dhcpcd5 Daemon abstürzt, und beim Booten erst gar nicht geladen wird. Heißt auch, das euer System nach einer Zeit die IP Adresse verliert und euer System nicht mehr erreichbar ist. Dieses Problem wird wohl in einer neueren Version des dhcpcd5 behoben, ist aber noch nicht unter dem Raspberry Pi OS verfügbar. Dieser Workaround sorgt dafür, das die virtuellen veth* interfaces nicht vom dhcpcd5 daemon genutzt werden. Hierfür muss der Datei /etc/dhcpcd.conf am Ende die folgende Zeile hinzugefügt werden:

denyinterfaces veth*

Die Fehlermeldung sieht so aus:

Warning: The unit file, source configuration file or drop-ins of dhcpcd.service changed on disk. Run 'systemctl daemon-reload' to reload units. ● dhcpcd.service - dhcpcd on all interfaces

  Loaded: loaded (/lib/systemd/system/dhcpcd.service; enabled; vendor preset: enabled)
 Drop-In: /etc/systemd/system/dhcpcd.service.d
          └─wait.conf
  Active: failed (Result: signal) since Fri 2021-01-22 15:36:35 CET; 1 day 6h ago
 Process: 340 ExecStart=/usr/lib/dhcpcd5/dhcpcd -q -w (code=exited, status=0/SUCCESS)
Main PID: 484 (code=killed, signal=SEGV)

Jan 22 15:36:35 home-server dhcpcd[484]: veth2c6abe3: waiting for carrier Jan 22 15:36:35 home-server dhcpcd[484]: vethf713b46: IAID 69:de:ae:f1 Jan 22 15:36:35 home-server dhcpcd[484]: vethf713b46: adding address fe80::e7........7:52f9 Jan 22 15:36:35 home-server dhcpcd[484]: veth88ef6b4: waiting for carrier Jan 22 15:36:35 home-server dhcpcd[484]: veth514e931: waiting for carrier Jan 22 15:36:35 home-server dhcpcd[484]: route socket overflowed - learning interface state Jan 22 15:36:35 home-server dhcpcd[484]: vethf32a0ec: carrier acquired Jan 22 15:36:35 home-server dhcpcd[484]: vethf32a0ec: IAID bf:44:26:9c Jan 22 15:36:35 home-server systemd[1]: dhcpcd.service: Main process exited, code=killed, status=11/SEGV Jan 22 15:36:35 home-server systemd[1]: dhcpcd.service: Failed with result 'signal'.

Mehr dazu hier:

Quellen