Docker & Docker-Compose auf dem RaspberryPi

In diesem Beitrag zeige ich Euch wie Ihr in ein paar Schritten den Docker inkl. Docker Compose auf dem Raspberry Pi bzw. einem Linux System installiert.

Ich nutze Docker eigentlich auf jedem meiner Pi´s und meiner Linux Systeme um damit verschiedene Container bzw. Programme laufen zu lassen. Wie Ihr sehen könnt habe ich auf meinem Heim Server aktuell 9 Container laufen die wobei hier aber stetig neue hinzukommen.

In diesem Beispiel nutze ich den RaspberryPi 4.

Als erstes updaten/upgraden wir das System auf den neuesten Stand.

1. Update RaspberryPi:

sudo apt-get update && sudo apt-get upgrade

Danach solltet Ihr den Pi neu starten.

Jetzt könne wir schon mit der eigentlichen Installation beginnen, dazu laden wir uns ein Installations Skript herunter:

2. Download & Install Skript:

curl -fsSL https://get.docker.com -o get-docker.sh

Dann führen wir das Skript aus

sudo sh get-docker.sh

Nachdem das Skript durchgelaufen ist (ca. 2-5min) bekommt Ihr die Version in dem Output angezeigt.

3. Nicht Root User zur Docker Gruppe hinzufügen:

Um jetzt nicht ständig “sudo” vor den docker befehlen eingeben zu müssen fügen wir einfach einen Benutzer der Docker Gruppe hinzu. In meinem Fall logge ich mich mit dem User pi ins Terminal ein somit füge ich pi zur Docker Gruppe:

sudo usermod -aG docker pi

Ihr bekommt keine Bestätigung oder sonstigen Output es sei denn es wurde ein Fehler gemacht.

Um das ganze jetzt zu aktivieren bzw. geltend zu machen schließt ihr den Terminal/Putty und loggt euch dann erneut mit dem User pi ein.

Jetzt könnt Ihr die Docker Version überprüfen mit

docker version

Mit docker info bekommt Ihr sogar noch mehr Informationen

4. Docker testen:

Um jetzt Docker zu testen um zu kontrollieren ob alles reibungslos funktioniert könnt Ihr den Hello World Container benutzen.

docker run hello-world

Ihr solltet dann die Nachricht “Hello from Docker !” und This message shows that your installation appears to be working correctly bekommen.

Für ein Docker update reicht der übliche Befehl:

sudo apt-get upgrade

Falls Ihr Docker deinstallieren bzw. entfernen wollt benötigt Ihr nur diese Zeile:#

sudo apt-get purge -y docker-ce docker-ce-cli
sudo apt-get autoremove -y --purge docker-ce docker-ce-cli
sudo rm -rf /var/lib/docker /etc/docker
sudo rm /etc/apparmor.d/docker
sudo groupdel docker
sudo rm -rf /var/run/docker.sock

Nun sollte Docker einwandfrei laufen und Ihr könnt mit der Installation von Docker-Compose fortfahren. Natürlich könnt Ihr auch jetzt schon den Docker nutzen nur finde ich die Verwendung mit dem Docker-Compose um einiges übersichtlicher.

5. Docker-Compose installieren:

Mit dem neuesten Docker Script Update sollte Docker Compose gleich mit installiert werden. Nachdem das Script durchgelaufen ist und ihr mit docker version die Version überprüft habt könnt Ihr ebenso überprüfen ob docker compose installiert wurde mit docker compose version.

Um Docker-Compose installieren zu können benötigen wir pip3 und python3.

sudo apt-get install libffi-dev libssl-dev
sudo apt install python3-dev
sudo apt-get install -y python3 python3-pip

Nachdem dieser Schritt erledigt ist benötigen wir nur noch diese Zeile um Docker-Compose zu installieren:

sudo pip3 install docker-compose

Um jetzt den Docker sowie auch Docker-Compose nach einem reboot zu starten gebt Ihr diese Zeile ein:
Mit dieser Zeile werden dann auch alle Container die “always” oder “unless-stopped” gesetzt haben automatisch wieder gestartet.

sudo systemctl enable docker

So nun haben wir alles installiert um mit Docker arbeiten zu können. Um jetzt die Compose Files anlegen zu können habe ich in diesem Beispiel einen Ordner angelegt in

6. Docker-Compose Ordner und Dateistruktur

/home/pi

Diesen Ordner nenne ich docker-compose-data (beim Beispiel hier benutze ich statt pi – debian)

In dem Ordner docker-compose-data kommen dann all meine “Services” rein, für diese legt Ihr euch am besten auch eigene Ordner an.

Dann in dem Ordner portainer z.b. liegt dann die eigentliche .yml Datei. In dem Ordner könnt Ihr z.b. in WinSCP einfach auf Datei neu klicken und eine Datei mit dem Namen docker-compose.yml erstellen. In diese Datei fügt Ihr dann folgendes ein.

version: '3'

services:
  portainer:
    image: portainer/portainer:latest
    container_name: portainer
    restart: always
    ports:
      - 8999:9000
      - 8000:8000
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
volumes:
  portainer_data:

Jetzt betrachten wir uns diese .yml Datei genauer.

Ihr könnt auch mehrere services in einer .yml Datei einbinden bzw. hinterlegen, ich nutze diese Funktion jedoch nicht da ich bei eventuellen Fehlern das dann mit der jeweiligen .yml Datei eingrenzen kann.

Am Anfang muss immer die Version stehen, hier zu sehen mit version: ´3´, diese ist abhängig von der installierten Docker-Compose Version. Hier nach dieser Anleitung nutzt einfach immer die Version 3.

Bei den services: tragt ihr dann den zu installierenden Service ein. Hier in diesem Fall portainer:

Das image: das genutzt bzw. installiert werden soll ist hier portainer/portainer:latest dieses hängt natürlich auch immer mit dem Service zusammen.

Der container_name: portainer ist frei wählbar.

Die restart: Funktion ist sehr wichtig da es diese ermöglicht unsere Container automatisch nach einem reboot zu starten hier könnt ihr entweder always oder unless-stopped eingeben.

Die Ports sind teilweise vorgegeben können aber auch teilweise verändert werden dass kommt immer auf den Service/Container an. Hier verwenden wir ports: – 8999 (unter diesem Port ist der Service im Browser erreichbar dieser kann nach belieben verändert werden, http://localhost:8999) : 9000 ist der interne Port für Portainer. Die zweite Zeile hier bei Portainer ist speziell und ist ein “Tunnel” Port und wird für Edge Agent benötigt also diesen könnt Ihr nicht verändern.

Die volumes: /var/run/docker.sock:/var/run/docker.sock ist vorgegeben und sollte nicht verändert werden, das ist im Endeffekt der Zugriff auf unseren Docker selbst. Sieht natürlich auch bei anderen Containern etwas anders aus.

Bei – portainer_data: /data wird das Volume portainer_data erstellt (auf dem Pi) und “verbunden” mit :/data, das wiederum ist der Pfad in dem Container Portainer. Der Container verliert ja nach Beendigung die Daten deswegen wird der Pfad gemapped.

So nun aber genug mit der eigentlich .yml Datei. Meistens gibts die Dateien schon fertig irgendwo im Web die Ihr dann einfach so benutzen könnt. Wenn Ihr genaueres über die .yml Dateistruktur wissen wollt schaut einfach mal auf https://docs.docker.com/compose/

7. Starten des Containers und Docker-Compose Befehle

Nachdem Ihr die Datei gespeichert habt gehen wir in Putty oder im Terminal in das Verzeichnis portainer das wir oben erstellt haben.

Wenn Ihr dann in diesem Verzeichnis seit startet Ihr den Container einfach mit:

docker-compose up

Beim erstmaligen ausführen wird erst das Image geladen somit kann das ein bisschen dauern. Nachdem Ihr euch das Image gezogen habt funktioniert dieser Befehl aber rasend schnell.

Um jetzt zu überprüfen ob der Container auch läuft könnt Ihr einfach diesen Befehl eingeben:

sudo docker container ls -a

Dann solltet Ihr eine Ausgabe mit diesen Informationen erhalten:

Um jetzt z.b. einen Container zu stoppen geht ihr wieder in das zugehörige Verzeichnis und gebt folgendes ein.

docker-compose stop

Starten mit:

docker-compose start

Neustarten

docker-compose restart

Container löschen

docker-compose rm

Es gibt noch etliche weitere Befehle https://docs.docker.com/engine/reference/commandline/compose/

So nachdem wir den Container jetzt gestartet haben sollten wir mit der Browser Zeile http://localhost:8999 die Portainer Oberfläche sehen und somit läuft das ganze 😉

4 Gedanken zu “Docker & Docker-Compose auf dem RaspberryPi

  1. Hallo,
    nach dem Befehl:
    sudo pip3 install docker-compose
    bekomme ich folgende Fehlermeldung:

    Building wheels for collected packages: bcrypt
    Building wheel for bcrypt (PEP 517) … error
    ERROR: Command errored out with exit status 1:
    command: /usr/bin/python3 /tmp/tmpa3t4f0b3_in_process.py build_wheel /tmp/tmpdnvakwxb
    cwd: /tmp/pip-install-a3pw8tk8/bcrypt_af605f25d8794b90b6fd9e1f32abad1a
    Complete output (58 lines):
    running bdist_wheel
    running build
    running build_py
    creating build
    creating build/lib.linux-armv7l-cpython-39
    creating build/lib.linux-armv7l-cpython-39/bcrypt
    copying src/bcrypt/__init__.py -> build/lib.linux-armv7l-cpython-39/bcrypt
    copying src/bcrypt/__about__.py -> build/lib.linux-armv7l-cpython-39/bcrypt
    running egg_info
    writing src/bcrypt.egg-info/PKG-INFO
    writing dependency_links to src/bcrypt.egg-info/dependency_links.txt
    writing requirements to src/bcrypt.egg-info/requires.txt
    writing top-level names to src/bcrypt.egg-info/top_level.txt
    reading manifest file ‘src/bcrypt.egg-info/SOURCES.txt’
    reading manifest template ‘MANIFEST.in’
    warning: no previously-included files found matching ‘requirements.txt’
    warning: no previously-included files found matching ‘release.py’
    warning: no previously-included files found matching ‘mypy.ini’
    warning: no previously-included files matching ‘*’ found under directory ‘.github’
    warning: no previously-included files matching ‘*’ found under directory ‘.circleci’
    warning: no previously-included files found matching ‘src/_bcrypt/target’
    warning: no previously-included files matching ‘*’ found under directory ‘src/_bcrypt/target’
    adding license file ‘LICENSE’
    writing manifest file ‘src/bcrypt.egg-info/SOURCES.txt’
    copying src/bcrypt/_bcrypt.pyi -> build/lib.linux-armv7l-cpython-39/bcrypt
    copying src/bcrypt/py.typed -> build/lib.linux-armv7l-cpython-39/bcrypt
    running build_ext
    running build_rust

    =============================DEBUG ASSISTANCE=============================
    If you are seeing a compilation error please try the following steps to
    successfully install bcrypt:
    1) Upgrade to the latest pip and try again. This will fix errors for most
    users. See: https://pip.pypa.io/en/stable/installing/#upgrading-pip
    2) Ensure you have a recent Rust toolchain installed. bcrypt requires
    rustc >= 1.56.0.

    Python: 3.9.2
    platform: Linux-5.15.56-v7+-armv7l-with-glibc2.31
    pip: n/a
    setuptools: 65.3.0
    setuptools_rust: 1.5.1
    rustc: n/a
    =============================DEBUG ASSISTANCE=============================

    error: can’t find Rust compiler

    If you are using an outdated pip version, it is possible a prebuilt wheel is available for this package but pip is not able to install from it. Installing from the wheel would avoid the need for a Rust compiler.

    To update pip, run:

    pip install –upgrade pip

    and then retry package installation.

    If you did intend to build this package from source, try installing a Rust compiler from your system package manager and ensure it is on the PATH during installation. Alternatively, rustup (available at https://rustup.rs) is the recommended way to download and update the Rust compiler toolchain.

    This package requires Rust >=1.56.0.
    —————————————-
    ERROR: Failed building wheel for bcrypt
    Failed to build bcrypt
    ERROR: Could not build wheels for bcrypt which use PEP 517 and cannot be installed directly

  2. Hi Ede Anscheind ist den lieben bagertech was mal vor kommen kann untergegangen. 🙂
    Hier mal die Lösung deines Problems.. fals du es noch nicht hinbekommen hast
    1. docker neu aufsetzen.
    2. sudo apt update && sudo apt upgrade durchführen.
    3. sudo apt install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg2 \ software-properties-common
    4. curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo “$ID”)/gpg | sudo apt-key add –
    5. echo “deb [arch=$(dpkg –print-architecture)] https://download.docker.com/linux/$(. /etc/os-release; echo “$ID”) \ $(lsb_release -cs) stable” | \
    6. sudo tee /etc/apt/sources.list.d/docker.list
    7. sudo apt update
    8. sudo apt install -y –no-install-recommends \ docker-ce \ cgroupfs-mount
    9. sudo systemctl enable –now docker
    10. bei aufgabe 10. musst du gucken welches System du hast also falls du ein Pi 3 hast gibst du in der console
    sudo curl -L https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-armv6 -o /usr/bin/docker-compose ein wenn du ein Pi4 hast gibst du dies ein
    sudo curl -L https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-armv7 -o /usr/bin/docker-compose
    letzterschriet
    11. sudo chmod +x /usr/bin/docker-compose

    und schon kannst du mit “nano docker-compose.yaml” und mit “docker-compose up -d” Arbeiten.

    warum auch immer pip nicht mehr so geht .steht mal in den sternen

  3. Hallo,

    erstmal vielen lieben Dank für die klasse Anleitung. Eine Frage hätte ich noch bzgl. der docker-compose.yml für Portainer:

    volumes:
    portainer_data: –> sollte das nicht so aussehen?
    volumes:
    portainer_data:/data

    Liebe Grüße
    Paul

Schreibe einen Kommentar zu Schumacher Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert