Kompozícia kontajnerov

alebo o tom, ako naraz spustiť niekoľko kontajnerov

Videá pre cvičenie

Motivácia

Zatiaľ vieme spustiť práve jeden kontajner. Bežne sa však vaše riešenie bude skladať z väčšieho množstva kontajnerov. Napríklad v prípade informačných systémov to môžu byť minimálne dva kontajnery: aplikácia informačného systému a databázový systém.

Na dnešnom cvičení vytvoríme kompozíciu pozostávajúcu zo štyroch služieb a vytvoríme tak jednoduchý tok dát, v ktorom najprv vypublikujeme údaje do MQTT brokera, prihlásime sa na ich odber a následne ich vizualizujeme.

Goals

  • zostaviť kompozíciu kontajnerov
  • naučiť sa pracovať so súborom docker-compose.yaml
  • zoznámiť sa s nástrojom Telegraf
  • zoznámiť sa s MQTT brokerom Eclipse Mosquitto
  • zoznámiť sa s využitím možností značkovania kontajnerov

Content

Čítanie údajov zo senzorov

Telegraf: prehľad systému zásuvných modulov (zdroj)

V prvom kroku sa zoznámime s nástrojom Telegraf, pomocou ktorého budeme zbierať dáta zo senzorov. Telegraf je agent pre zbieranie a preposielanie metrík a udalostí z databáz, rozličných systémov a IoT senzorov. V tomto prípade budeme zbierať dáta o aktuálnom zaťažení lokálneho systému (z angl. system load).

Task

V priečinku dnešného cvičenia vytvorte priečinok telegraf/, v ktorom vytvoríme konfiguračný súbor pre nástroj Telegraf s názvom telegraf.conf.

Obsah konfiguračného súboru bude vyzerať nasledovne:

[agent]
  interval = "1s"
  flush_interval = "1s"

[[inputs.cpu]]
  percpu = false
  totalcpu = true

[[outputs.file]]
  files = ["stdout"]

V rámci konfiguračného súboru je zadefinovaný jeden vstup a jeden výstup. Vstupom je aktuálne zaťaženie systému, ktoré sa bude zapisovať na štandardný výstup každú sekundu.

Task

Spustite kontajner z obrazu telegraf a pripojte k nemu lokálny priečinok telegraf/ do kontajnera k priečinku /etc/telegraf/:ro.

$ docker container run --rm \
  --name telegraf \
  --volume "$(pwd)/telegraf/:/etc/telegraf/:ro" \
  telegraf

Task

Upravte konfiguráciu tak, aby sa vo výsledku nachádzala len hodnota položky usage_system.

Na obrazovke sa v sekundových intervaloch budú zobrazovať záznamy, ako napr. tento:

cpu,cpu=cpu-total,host=9c857b52b59d usage_iowait=0.2528445006327,\
usage_softirq=0.37926675094904994,usage_steal=0,usage_guest_nice=0,\
usage_user=7.585335018969501,usage_system=2.4020227559962772,\
usage_idle=88.74841972202594,usage_nice=0,usage_irq=0.6321112515817499,\
usage_guest=0 1665169167000000000

Každý záznam je v tvare tzv. Line protokol-u databázového systému InfluxDB. Každý sa skladá z týchto štyroch častí:

measurementName,tagKey=tagValue fieldKey="fieldValue" 1465839830100400200
--------------- --------------- --------------------- -------------------
       |               |                  |                    |
  Measurement       Tag set           Field set            Timestamp

Ich význam je nasledovný:

  1. názov merania (measurement) - v našom prípade cpu
  2. zoznam značiek (tag set) - v našom prípade sa jedná o kľúče cpu a host
  3. zoznam položiek (field set) - v našom prípade sa jedná o kľúče s prefixom usage_
  4. časová značka (timestamp) - v našom prípade sa jedná o hodnotu 1665169167000000000

To, ako každý záznam bude vyzerať, môžeme upraviť v konfigurácii vstupu alebo výstupu. V našom prípade upravíme konfiguráciu vstupu, ktorá bude vyzerať nasledovne:

[[inputs.cpu]]
  percpu = false
  totalcpu = true

  name_override = "metrics"
  data_format = "influx"
  fieldpass = [
    "usage_system"
  ]
  tags = [
    "cpu"
  ]

Po opätovnom spustení telegrafu s novou konfiguráciou bude výsledný záznam vyzerať takto:

metrics,cpu=cpu-total,host=13eac84cde29 usage_system=1.7654476670812262 1665170033000000000

Kompozícia kontajnerov

Zatiaľ sme spustili len jeden kontajner. Na vytvorenie dnešného scenára ich však potrebujeme spustiť ešte tri. Aby sme každý ďalší kontajner nemuseli spúšťať osobitne z príkazového riadku, vytvoríme konfiguračný súbor docker-compose.yaml, v ktorom zadefinujeme našu kompozíciu.

Task

V koreňovom priečinku cvičenia vytvorte súbor docker-compose.yaml a v ňom vytvorte konfiguráciu pre spustenie Telegraf-u na snímanie aktuálneho zaťaženia systému.

Do konfiguračného súboru docker-compose.yaml prepíšeme príkaz na spustenie kontajnera:

$ docker container run --rm \
  --name telegraf \
  --volume "$(pwd)/telegraf/:/etc/telegraf/:ro" \
  telegraf

Prepis bude vyzerať nasledovne:

version: "3"

services:
  telegraf:
    image: telegraf
    volumes:
    - ./telegraf/:/etc/telegraf/:ro

Task

Overte vytvorený konfiguračný súbor spustením kompozície.

Kompozíciu spustíme príkazom:

$ docker compose up

Ak sme postupovali správne, spustí sa kontajner a na obrazovke uvidíme každú sekundu záznam vo formáte line protokol-u o aktuálnom zaťažení systému.

Task

Ukončite vytvorenú kompozíciu.

Kompozíciu je možné ukončiť spustením nasledovnéhom príkazu z priečinku, v ktorom sa nachádza súbor s konfiguráciou docker-compose.yaml:

$ docker compose down

Publikovanie dát cez MQTT

Komunikačný protokol MQTT je jedným z najpopulárnejších komunikačných protokolov v IoT. A keďže ho budeme pre naše riešenia používať tiež, potrebujeme vlastný MQTT broker, ktorý bude slúžiť na komunikáciu našich zariadení a služieb v našej architektúre. Na tento účel použijeme otvorený MQTT broker Eclipse Mosquitto.

Task

Do kompozície pridajte novú službu s názvom mosquitto, ktorá do kompozície pridá podporu pre komunikačný protokol MQTT.

Pre novú službu mosquitto nech platí:

  • službu spustite z obrazu eclipse-mosquitto
  • služba bude navonok komunikovať na porte 1883
  • pre jej konfiguráciu vytvorte priečinok mosquitto/ a pripojte ho do kontajnera k priečinku /mosquitto/config/

Do lokálneho priečinku mosquitto/ pridajte konfiguráciu v súbore mosquitto.conf:

listener 1883
allow_anonymous true

Výsledná konfigurácia pre spustenie kontajnera s MQTT brokerom Mosquitto bude v súbore docker-compose.yaml vyzerať nasledovne:

mosquitto:
  image: eclipse-mosquitto
  ports:
  - 1883:1883
  volumes:
  - ./mosquitto:/mosquitto/config

Task

Pridajte do konfigurácie Telegraf-u výstup do MQTT.

Výsledný konfiguračný súbor bude po úpravách vyzerať takto:

[agent]
  interval = "1s"
  flush_interval = "1s"

[[inputs.cpu]]
  percpu = false
  totalcpu = true

[[outputs.mqtt]]
  servers = [ "mosquitto:1883" ]
  topic = "gateway/metrics"
  keep_alive = 30

Task

Overte funkčnosť upravenej konfigurácie agenta Telegraf.

Funkčnosť vieme overiť pomocou ľubovoľného MQTT klienta. Kontajner mosquitto má nainštalované nástroje mosquitto_pub a mosquitto_sub a môžeme ich použiť na overenie funkčnosti konfigurácie.

Najprv spustíme príkazový riadok v bežiacom kontajneri/službe v kompozícii:

$ docker compose exec mosquitto sh

V kontajneri sa následne prihlásime na odber všetkých správ z témy gateway/metrics príkazom:

$ mosquitto_sub -h mosquitto -t "gateway/metrics/#" -F "%t: %p"

Ak je konfigurácia v poriadku, každú sekundu uvidíte na obrazovke výpis údajov z MQTT brokera.

Node-RED ako testovací MQTT klient

Aby sme mohli otestovať nie len fungujúcu komunikáciu prostredníctvom MQTT protokolu, pridáme do našej kompozície aj Node-RED.

Task

Pridajte do kompozície aplikáciu Node-RED a otestujte úspešnosť pridania pomocou webového prehliadača.

Pred spustením vytvoríme priečinok nodered/, do ktorého bude Node-RED ukladať svoje dáta.

nodered:
  image: nodered/node-red
  ports:
  - 1880:1880
  volumes:
  - ./nodered:/data

Po spustení kompozície otvoríme prehliadač na adrese http://localhost:1880.

Task

V nástroji Node-RED vytvorte flow, v ktorom prepojíte uzol mqtt in s uzlom debug.

Pri konfigurácii uzla mqtt in uveďte:

  • adresu MQTT Broker-a uveďte mosquitto
  • ako tému, v ktorej budete počúvať, použite gateway/metrics

Ak ste postupovali správne, tak v paneli debug uvidíte správy, ktoré nástroj Telegraf posiela do MQTT Brokera.

Homepage

Homepage Logo

Aplikácia Homepage patrí do kategórie aplikácií označovaných ako “application dashboard”. Pre naše potreby vytvorí elegantné používateľské rozhranie so zoznamom a prehľadom aplikácií a služieb spustených na zariadení IoT Gateway. Aby to však bolo možné, konfiguráciu kontajnerov, ktoré budeme chcieť v aplikácii Homepage zobraziť, rozšírime o značky (z angl. labels).

Task

Pre potreby konfigurácie aplikácie vytvorte priečinok homepage/.

Do tohto priečinka rovno vložte súbor docker.yaml s nasledovným obsahom:

iot-gateway:
  socket: /var/run/docker.sock

Task

Rozšírte svoju kompozíciu o aplikáciu homepage, ktorá sa spustí na porte 80.

Pre spustenie aplikácie homepage v kompozícii bude platiť:

  • aplikáciu v kompozícii pomenujte homepage
  • repozitár pre obrazu je ghcr.io/benphelps/homepage:latest
  • aplikáciu spustite na porte 80, pričom v obraze sa spúšťa na porte 3000
  • pripojte k nej soket pre komunikáciu so službou Docker, ktorý sa v hostiteľskom operačnom systéme nachádza v súbore /var/run/docker.sock do kontajnera s rovnakým umiestnením
  • lokálny priečinok homepage/ s konfiguráciou namapujte na priečinok /app/config v kontajneri.

Výsledná konfigurácia kompozície pre aplikáciu homepage bude vyzerať nasledovne:

homepage:
  image: ghcr.io/benphelps/homepage:latest
  ports:
  - 80:3000
  volumes:
    - ./homepage:/app/config
    - /var/run/docker.sock:/var/run/docker.sock

Task

Pridajte do konfigurácie aplikácie Node-RED v kompozícii značky pre jej zobrazenie v aplikácii Homepage.

Pre zobrazenie konkrétnej aplikácie, resp. služby v aplikácii Homepage môžeme použiť tieto značky:

  • homepage.group - názov skupiny, v ktorej sa aplikácia zobrazí
  • homepage.name - názov aplikácie
  • homepage.description - opis aplikácie
  • homepage.icon - ikona aplikácie
  • homepage.href - URL adresa, na ktorú bude možné prejsť po kliknutí

Aktualizovaná konfigurácia aplikácie Node-RED o potrebné značky bude vyzerať nasledovne:

nodered:
  image: nodered/node-red
  ports:
  - 1880:1880
  volumes:
  - ./nodered:/data
  labels:
    homepage.group: IoT Gateway
    homepage.name: Node-RED
    homepage.description: Low level programming.
    homepage.icon: node-red.png
    homepage.href: http://localhost:1880

Task

Podobným spôsobom pridajte značky aj pre Telegraf a Mosquitto.

Task

Overte, či sa jednotlivé označkované aplikácie zobrazia v aplikácii Homepage.

Závislé spúšťanie služieb

V niektorých prípadoch sa vyžaduje, aby sa niektoré služby spúšťali až potom, ako naštartujú iné služby. V našom scenári by sme takto vedeli identifikovať napríklad:

  • najprv je potrebné spustiť MQTT broker a až potom službu, ktorá bude do neho publikovať údaje

V opačnom prípade môže dôjsť k pádu služby, ktorá sa neúspešne snaží posielať údaje do nespustenej služby. Tomu vieme zabrániť vhodným použitím elementu depends_on v príslušnej závislej službe.

Task

Aktualizujte vašu kompozíciu tak, aby sa závislé služby spustili až po nezávislých službách.

V našom prípade pôjde o tieto závislosti:

  • služba telegraf sa môže spustiť až po službe mosquitto
  • aplikácia Node-RED sa spustí až po spustení služby mosquitto

Task

Overte funkčnosť vašej aktualizovanej kompozície.

Ďalšie odkazy