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
![Telegraf: prehľad systému zásuvných modulov (zdroj)](https://www.influxdata.com/wp-content/uploads/Main-Diagram_06.01.2022v1.png)
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
![Homepage Logo](https://gethomepage.dev/v0.7.3/assets/banner_dark%402x.png)
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