Redis Container unter Portainer bereitstellen

Das Bereitstellen einer Redis Datenbank, die dann zum Beispiel als States DB für ioBroker genutzt werden kann, ist dank Portainer schnell erledigt.

Wie das geht und was es zu beachten gibt, zeige ich euch in diesem Tutorial. 

Voraussetzungen

Natürlich setze ich voraus, dass ihr einen laufenden und eingerichteten Portainer Container habt mit dem Ihr euren Docker Host auch administrieren könnt. 🙂

Für die persistente Speicherung der Redis Datenbank benötigen wir außerdem ein Volume oder ein Verzeichnis auf dem Docker Host, welches wir dann später in den Container einbinden können.  

Außerdem werden wir den Container in ein Bridge Netzwerk einbinden und nur den Datenbank Port nach außen öffnen. Da es beim Standard Bridge Netzwerk von Docker einige Einschränkungen gibt (z.B. keine Namensauflösung) empfehle ich die Einrichtung eines benutzerdefinierten Bridge Netzwerks

Container erstellen

Dann kann es also los gehen. Über Portainer starten wir im Menüpunkt „Containers“ und klicken auf „Add container“.

Als erstes vergeben wir einen Namen für den Container und bestimmen das Image aus dem der Container erstellt werden soll. Für den Namen verwende ich hier einfach „redis“. Bei dem Image handelt es sich um das offizielle Redis Docker Image welches wir im per „redis:latest“ referenzieren können.

Unter „Network ports configuration“ brauchen wir nur dann einen Port publishen, wenn wir auch wirklich von Außen auf die Datenbank zugreifen müssen (z.B. im Falle von ioBroker Multihost). Solange die Verbindungen zur Datenbank nur aus anderen Containern heraus aufgebaut werden sollen, muss hier entsprechend nichts angegeben werden. Zur Anschauung publishe ich an dieser Stelle den Standard Port „6379“ für den externen Zugriff. 

Nun gilt es noch drei weitere Einstellungen unter „Advanced container settings“ zu konfigurieren. 

Unter „Volumes“ binden wir unser Datenverzeichnis ein, in dem später die Redis Datenbank persistent gespeichert wird. Nach einem Klick auf „map additional volume“ können wir den Dateipfad innerhalb des Containers definieren. Für Redis ist dies „/data“. Durch einen Kick auf „Bind“ wählen wir die Option ein Verzeichnis einzubinden, anstatt ein Docker Volume zu verwenden.

Da ich mal wieder auf meiner virtuellen DiskStation unterwegs bin und einen lokalen Ordner als Pfad angeben möchte, klicke ich auf „Bind“ und trage meinen lokalen Pfad zu meinem vorbereiteten Ordner auf dem Docker Host „/volume1/docker/redis_data“ ein.  

Unter Network definieren wir nun das Netzwerk über das unser ioBroker später auf die Datenbank zugreifen kann. Ich verwende hier das von mir im Vorfeld manuell angelegte Bridge Netzwerk „internal“. Als Hostname hinterlege ich „redis“. Eine feste IP-Adresse aus dem Docker Netzwerk „internal“ kann ich hier außerdem vergeben. In meinem Beispiel wähle ich die 172.18.0.3.

Ebenfalls optional ist die Konfiguration der „Restart policy“ für meinen Container. Damit mein Container sich im Fehlerfall immer von selbst neu startet wähle ich hier allerdings „Always“.

Das war es dann auch schon. Mit einem Klick auf „Deploy the container“ erstelle ich den Container. Sobald dieser läuft ist meine Redis Datenbank bereit. 

Verbindung zur Redis DB testen

Ob die Redis DB jetzt wirklich funktioniert können wir natürlich auch testen. Dazu gibt es zum Beispiel das „Redis command line interface“, kurz redis-cli.

Da ich die Redis DB für meinen ioBroker nutzen möchte, führe ich den Test direkt aus der Kommandozeile meines ioBroker Containers heraus durch. Hier sind zufälliger Weise auch alle Voraussetzungen für das Tool (wie zum Beispiel das Vorhandensein von NPM) schon erfüllt. 🙂 

Hinweis

Wenn ihr die Funktion aus einem anderen Container (z.B. wie ich vom ioBroker) testet, dann muss sich dieser Container natürlich auch im Netzwerk „internal“ befinden. Die Kommunikation zwischen den Containern muss also gegeben sein.  

Installation redis-cli

Damit wir redis-cli nutzen können, müssen wir es natürlich erst einmal installieren:

npm install -g redis-cli

Anschließend lässt sich mit dem Tool eine Verbindung zum Server aufbauen:

rdcli -h [IP_oder_Hostname_des_Redis_Containers]

Die offene Verbindung wird wie folgt angezeigt Der aufgeführte Port ist dabei der Standard Port von Redis:

[IP_oder_Hostname]:6379>

Eine Fehlermeldung in der Form “/usr/bin/rdcli: 2: /usr/bin/rdcli: [[: not found” können wir, sofern vorhanden, in diesem Szenario einfach ignorieren.

Redis Funktionstest

Folgender Dialog lässt uns nun die Funktion von redis prüfen. Dabei wird zuerst ein PING gesendet, der von redis quittiert wird. Anschließend schreiben wir einen Wert in die Datenbank und lesen ich wieder aus:


[IP_oder_Hostname]:6379> ping
PONG
[IP_oder_Hostname]:6379> set test irgendeinwert
OK
[IP_oder_Hostname]:6379> get test
irgendeinwert
[IP_oder_Hostname]:6379> quit
OK

Mit STRG+C beenden wir das Tool und kehren zur normalen Kommandozeile zurück. Die Redis Datenbank ist nun einsatzbereit.

Alles viel einfacher mit docker-compose aka "Portainer Stacks"

Für alle die die Vorzüge von docker-compose schätzen gibt es im Portainer die Option Container in „Stacks“ zu erstellen. Hierbei werden die Config-Daten zu einem oder mehreren Containern und ggf. Netzwerken in einer entsprechenden Config-Datei (compose file) bereitgestellt.

Das Compose File für dieses Beispiel würde dann wie folgt aussehen. Enthalten ist darin neben dem Redis Datenbank Container auch das Bridge Netzwerk. 

version: "2"
services:
  redis:
    container_name: redis
    image: redis:latest
    hostname: redis
    restart: always
    networks:
      internal:
        ipv4_address: 172.18.0.3
    ports:
      - "6379:6379"
    volumes:
      - /volume1/docker/redis_data:/data

networks:
  internal:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16
          gateway: 172.18.0.1
          ip_range: 172.18.0.1/24

Achtung

Wenn ihr als Host eine Synology Disk Station nutzt und euch Portainer beim Erstellen eines Stacks mit „bla bla mem_swappiness bla bla“ anmeckert, dann fügt bitte unterhalb der Definition der volumes für den redis-container noch die folgende Definition an: mem_swappiness: -1

Das war’s dann eigentlich auch schon. Wie immer steht euch die Kommentarfunktion für Fragen oder Feedback zur Verfügung.

MfG,
André

Änderungshistorie

2020-12-26

Erste Veröffentlichung.