OK, hier mal ein kleiner Docker-Crashkurs für alle Einsteiger. @Nerds: Bitte nicht über die Vereinfachungen schimpfen!
Docker ist eine Umgebung, die „leichte virtuelle Computer“ ausführt.
Im Prinzip ist ein Docker-Container ein komplett installierter Computer mit Betriebssystem, Anwendungen etc., der in einen Sandkasten gesteckt wird und benutzt werden kann, ohne irgendetwas (außer Docker) installieren zu müssen.
Eine docker-compose.yml ist eine Auflistung von Containern mit den vom Anwender gewünschten Einstellungen, die ich in einem Paket starten möchte (englisch ‚to compose‘: zusammenstellen, also eine Zusammenstellung von Containern). Das Format YML ist relativ einfach und beruht darauf, dass man durch Einrückung der Zeilen Blöcke bilden kann.
Mit dem Befehl docker compose
sagt man Docker, dass es in die Datei docker-compse.yml im aktuellen Pfad schauen und die dort stehenden Anweisungen ausführen soll. Dazu gibt es verschiedene Sub-Befehle:
docker compose up
: Container hochfahren (up halt)
docker compose up -d
: Container hochfahren und im Hintergrund laufen lassen (auch bei Neustart des Rechners)
docker compose stop
: Container herunterfahren und entfernen
Jetzt pflücken wir mal die YML auseinander:
services:
hier kommt der Abschnitt mit den Diensten (Containern) die laufen sollen
watchtower:
der Name des ersten Dienstes (2 Leerzeichen eingerückt, da Unterpunkt zu services:)
image: containrrr/watchtower
Jetzt kommen die Eigenschaften des Containers. Wieder 2 Leerzeichen eingerückt, da Unterpunkt zu watchtower:, also insgesamt 4 Leerzeichen.
Welcher Container soll verwendet werden, lädt das Image mit diesem Namen von docker.com herunter (Pfad https://hub.docker.com/r/containrrr/watchtower wird automatisch gebildet)
container_name: watchtower
Mein Name für den Container. Wird z.B. verwendet, wenn ich nur einen einzelnen Container stoppen will und nicht alle (docker compose stop watchtower)
restart: unless-stopped
Was soll getan werden, wenn der Container abstürzt; hier: neu starten, außer der Anwender hat explizit docker compose stop watchtower
eingegeben.
Und jetzt aus meinem Container:
environment:
In diesem Abschnitt werden die „Umgebungsvariablen“ definiert, die der Container als Konfiguration mitgegeben bekommt. Die Variablen werden beim Start im Container ausgelesen und machen alle wichtigen Einstellungen, da das Image ja universell sein soll. Achtung: Das ist bei jedem Container anders, da muss man die Anleitung des Container-Bauers lesen oder eine Bespieldatei, die meist dabei ist anpassen.
TZ: "Europe/Berlin"
Und auch hier wieder die Unterpunkte 2 Zeichen eingerückt, damit insgesamt 6 Leerzeichen.
Zeitzone, sollte für uns passen
POLESTAR_EMAIL: "xx@xxx"
POLESTAR_PASSWORD: "XXX"
POLESTAR_VIN: "LPSVSEDEEMLxxxxxx"
Zugangsdaten
ÜBRIGENS: Wenn man mehr als einen Polestar hat, muss man einfach 2 Container bauen. Also Konfiguration in der YML verdoppeln, VIN bei der Kopie anpassen und BASE-Topic anpassen bei der Kopie. Fertig
POLESTAR_CYCLE: 300 # seconds
Intervall für die Wiederholung
MQTT_BROKER: "192.168.1.100"
MQTT_PORT: "1883"
Adresse meines MQTT-Brokers (Nachrichtenzentrale für MQTT), kann auch ein Name wie raspi.fritz.box sein. Mein Broker (mosquitto) läuft auch in einem Container auf dem Raspi. Der Port ist für MQTT der Standard und muss in der Regel nicht angepasst werden.
MQTT_USER: "" # has to be empty ("") if broker has no password
MQTT_PASSWORD: "" # has to be empty ("") if broker has no password
Zugangsdaten
BASE_TOPIC: "polestar2"
Basis-Pfad, der vor die Daten unseres Autos gehängt wird sieht dann so aus:
labels:
# automatic update using Watchtower (https://github.com/containrrr/watchtower) highly recommended
- "com.centurylinklabs.watchtower.enable=true"
Labels sind Eigenschaften des Containers, die für die Steuerung gesetzt werden können. Dieses Label hier sagt: mach automatische Updates mit Watchtower. Dafür muss aber ein Watchtower-Container laufen, der das übernimmt, siehe oben.