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
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.
Hallo André,
vielen Dank für deine interessanten Tutorials und den ioBroker Container 🙂 !
Ich betreibe jetzt seit einiger Zeit den ioBroker über mein Synology NAS im Docker Container inkl. MACVLAN und Portainer Stacks(Docker-Compose).
Nach der Umstellung auf Docker-Compose kann ich auch viel flexibler testen.
Ich habe jetzt am letzten Wochenende für die States DB einen Redis Container an den Start gebracht. Alles scheint grundsätzlich zu funktionieren, aber ich bekomme wie Heike auch einige Warnungen, nach dem Start:
1:C 23 Feb 2021 21:48:08.855 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 23 Feb 2021 21:48:08.858 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 23 Feb 2021 21:48:08.858 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‚vm.overcommit_memory = 1′ to /etc/sysctl.conf and then reboot or run the command ’sysctl vm.overcommit_memory=1‘ for this to take effect.
Ist das „normal“ ? Warnungen sind ja keine Fehler aber, vielleicht ist hier doch den Empfehlungen zu folgen ?
Vielen dank im Voraus
Guido
[EDIT] Log auf „WARNING“ gekürzt.
Hallo Guido,
ich beschäftige mich in meinem Tutorial aktuell nur mit der Bereitstellung von Redis in der default Konfiguration. Selbstverständlich kann man Redis, wie die meisten anderen Datenbanken auch, je nach Anwendungszweck konfigurieren bzw. optimieren. Dabei reichen die Möglichkeiten von Sicherheitsoptionen über Speichermanagement bis hin zur Hochverfügbarkeit der Redis Datenbank.
Deinen Logauszug habe ich mal auf die Warnings reduziert. Die erste Warning ließe sich vermutlich schon damit erschlagen, wenn man überhaupt ein individuelles config-File bereit stellt. 🙂 Für die optimale Konfiguration der weiteren „angemeckerten“ Optionen müsste man dann mal Google bemühen.
Ich nehme aber mal den Punkt zum Bereitstellen eine individuellen Config-Datei zu meinen ToDos. Denke das, zusammen mit dem Hinweis auf die Möglichkeit der individuellen Konfiguration von Redis, würde hier noch gut in das Tutorial hinein passen.
Danke für dein Feedback!
MfG,
André
Hallo André,
ich verfolge schon seit langem Deine Anleitungen. In den letzten Tagen habe ich nun meine ioBroker Anwendungen komplett neu aufgesetzt … diese war in den letzten 4 Jahre gewachsen.
Nun laufen diverse Docker Container auf der Synology: Dein ioBroker Image, Redis, MariaDB, Portainer, Grafana etc.
Alles soweit super und auch die Umstellung auf Redis hat viel gebracht. Der Multihost Master läuft auf der Diskstation, der Slave auf einem Pi4. MACVLAN setzte ich nicht ein, da ich damit nicht auf die DS (Surveillance API) zugreifen konnte.
Jetzt stelle ich mir die Frage, wie ich Redis richtig konfiguriere – Insbesondere die Persistance. Ich habe im Docker Image keinen redis.conf File gefunden. Wo sollte der liegen und wie stelle ich die „richtige“ Persistance ein?
Das Redis data directory habe ich im iobroker-data Verzeichnis unter redis_data angelegt. Dort liegt auch der dump.rdb File.
Reicht das so? Was muss ich noch beachten?
Grüße
Thomas
Hallo Thomas,
falls du doch MACVLAN nutzen möchtest, kannst du deinem ioBroker Container zusätzlich zum MACVLAN ein Bridge Netzwerk hinzufügen und kannst dann über das Gateway des Bridge Netzwerks auf deine Disk Station zugreifen. 🙂
Was Redis angeht, da habe ich jetzt kein redis.conf vorgesehen. Falls du Redis konfigurieren willst, kannst du ein zweites Volume/ einen zweiten Mount für die Config machen. Wie das geht, steht auch hier: https://hub.docker.com/_/redis.
Ein Best Practice was die Redis Konfiguration angeht habe ich nicht. Ich kann dir dazu aber diesen ioBroker Forum Thread empfehlen: https://forum.iobroker.net/topic/26327/.
MfG,
André
Hallo André, erstmal
vielen Dank für Deine Anleitungen. Ich bin durch mein Telegram Abo heute hier gelandet und wollte mich nun mal an redis versuchen (1 zu 1 an Deine Anleitung gehalten), aber ich bekomme keine Verbindung.
Fehlermeldung:
root@iobroker:~# rdcli -h 172.18.0.3
172.18.0.3:6379> (error) Redis connection to 172.18.0.3:6379 failed – connect ENETUNREACH 172.18.0.3:6379
root@iobroker:~# rdcli -h redis
redis:6379> (error) Redis connection to redis:6379 failed – getaddrinfo ENOTFOUND redis
root@iobroker:~#
Das Log vom redis Container sagt folgendes:
1:C 03 Jan 2021 14:37:12.153 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo,
1:C 03 Jan 2021 14:37:12.153 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=1, just started,
1:C 03 Jan 2021 14:37:12.153 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf,
1:M 03 Jan 2021 14:37:12.156 * Running mode=standalone, port=6379.,
1:M 03 Jan 2021 14:37:12.156 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.,
1:M 03 Jan 2021 14:37:12.156 # Server initialized,
1:M 03 Jan 2021 14:37:12.156 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‚vm.overcommit_memory = 1′ to /etc/sysctl.conf and then reboot or run the command ’sysctl vm.overcommit_memory=1‘ for this to take effect.,
1:M 03 Jan 2021 14:37:12.156 * Loading RDB produced by version 6.0.9,
1:M 03 Jan 2021 14:37:12.156 * RDB age 240 seconds,
1:M 03 Jan 2021 14:37:12.156 * RDB memory usage when created 0.77 Mb,
1:M 03 Jan 2021 14:37:12.156 * DB loaded from disk: 0.000 seconds,
1:M 03 Jan 2021 14:37:12.156 * Ready to accept connections,
Egal ob ich den Container und das Netzwerk von Hand erstelle, oder über Stack, das Ergebnis ist das Gleiche. Woran könnte das liegen ? Welche Infos brauchst Du für eine eventuelle Hilfe ?
PS: ioBroker läuft im Container (MCVLAN). Portainer läuft im Container (Bridge) / Beides nach Deinen Anleitungen vor längerer Zeit erstellt.
Gruß
Heiko
Ich habe dem ioBroker Container noch das neue Bridge Netzwerk zusätzlich zum MACVLAN gegeben, dann funktionert es.
Ist also erledigt.
Hallo Heiko,
freut mich, dass du den Fehler selbst finden konntest. Habe dazu gerade mal noch einen Hinweis im Tutorial hinzugefügt. Danke für dein Feedback.
MfG,
André