Kompozícia kontajnerov
alebo o tom, ako naraz spustiť niekoľko kontajnerov
Videá pre cvičenie
Upozornenie
Pred príchodom na cvičenie si ešte doma stiahnite nasledujúce obrazy:
To docielite týmto príkazom:
$ docker image pull telegraf:alpine eclipse-mosquitto grafana/grafana ghcr.io/benphelps/homepage
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
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
Upozornenie
Ak používate OS Windows, tak potrebujete uviesť celú cestu vedúcu k pripájanému priečinku. Uvedený príkaz pre používateľov OS Windows bude teda vyzerať nasledovne:
$ docker container run --rm \
--name telegraf \
--volume "c:/Users/jano/iot/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ý:
- názov merania (measurement) - v našom
prípade
cpu
- zoznam značiek (tag set) - v našom prípade
sa jedná o kľúče
cpu
ahost
- zoznam položiek (field set) - v našom
prípade sa jedná o kľúče s prefixom
usage_
- č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
Poznámka
Všimnite si, že pri definovaní zväzkov je možné v prípade kompozície
použiť lokálnu cestu miesto absolútnej, ako tomu bolo v prípade
spustenia kontajneru pomocou príkazu
docker compose run
.
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.
Poznámka
Podobne, ako v prípade spustenia kontajnera pomocou príkazu
docker container run
je možné aj kompozíciu spustiť na
pozadí pomocou prepínača --detach
.
Poznámka
Po spustení si je možné všimnúť, že názov každého vytvoreného Docker objektu má prefix názvu priečinku, v ktorom k spusteniu došlo. To sa týka názvov kontajnerov, sietí ako aj zväzkov.
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
Poznámka
Po ukončení kompozície si môžete všimnúť, že boli ukončené všetky kontajnery a bola odstránená aj vytvorená sieť.
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
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 porte3000
- 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áciehomepage.description
- opis aplikáciehomepage.icon
- ikona aplikáciehomepage.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žbemosquitto
- aplikácia
Node-RED
sa spustí až po spustení službymosquitto
Task
Overte funkčnosť vašej aktualizovanej kompozície.
Ďalšie odkazy
- Compose
specification - špecifikácia konfiguračného súboru
docker-compose.yaml
- docker-dompose Cheatsheet - jeden z mnohých ťahákov pre Docker Compose
- Stream metrics from Telegraf to Grafana - článok opisujúci, ako posielať dáta z Telegraf-u do aplikácie Grafana
- Monitor Linux System with Grafana and Telegraf - ďalší článok o tom, ako monitorovať systém pomocou nástrojov Telegraf, InfluxDB a Grafana