greystone
Active Member
||Einfache Überwachung von Docker Containern mittels Labels||
Ich habe gerade ein einfaches Monitoring für meine Docker-Container realisiert. Die Umgebung sind einfache Docker-Hosts, deren Container ich mittels docker-compose verwalte. (Kein Swarm, Kein Kubernetes). Dabei möchte ich nur wissen, ob ein Container läuft oder nicht. Ein präziserer Health-Check, der mir prüft ob die Anwendung auch wirklich läuft, wäre der nächste Schritt.
In dem Fall will ich es hier einfach haben. Deswegen erweitere ich meine docker-compose.yml mit einem Label, dass bestimmt, dass dieser Docker-Container überwacht werden soll. So sieht meine docker-compose.yml (ist noch ein altes docker-compose.yml Format) aus:
Hier ist dann ein Script, dass alle Container regelmässig ausliest und eine entprechende Statusmeldung pro Container ausgibt.
Das ist dann die Ausgabe:
Ich empfehle das Script asynchron laufen zu lassen. Der Fall, dass "docker inspect" hängt, tritt bei mir recht häufig auf. Ich habe dazu auch einen Bugreport gesehen.
Das funktioniert nur, wenn der Container vorhanden ist. Wenn man mittels docker-compose down die Anwendung gestoppt hat, dann wird auch kein Fehler-Status angezeigt. Bei mir löst sich dass dadurch, das das Monitoring dann meckert, weil Ihm Daten zu diesen Checks fehlen. Aber vielleicht ist hier auch eine einfache Textdatei mit den Namen zu überwachender Docker-Container sinnvoll. An der Lösung gefällt mir, dass das Monitoring in der Containerdefinition aktiviert wird - keine Datei außerhalb.
Ich habe gerade ein einfaches Monitoring für meine Docker-Container realisiert. Die Umgebung sind einfache Docker-Hosts, deren Container ich mittels docker-compose verwalte. (Kein Swarm, Kein Kubernetes). Dabei möchte ich nur wissen, ob ein Container läuft oder nicht. Ein präziserer Health-Check, der mir prüft ob die Anwendung auch wirklich läuft, wäre der nächste Schritt.
In dem Fall will ich es hier einfach haben. Deswegen erweitere ich meine docker-compose.yml mit einem Label, dass bestimmt, dass dieser Docker-Container überwacht werden soll. So sieht meine docker-compose.yml (ist noch ein altes docker-compose.yml Format) aus:
Code:
version: '2.4'
services:
onlyoffice:
container_name: onlyoffice
image: onlyoffice/documentserver:7.1
restart: always
volumes:
- ./logs:/var/log/onlyoffice
- ./data:/var/www/onlyoffice/Data
- ./cache:/var/lib/onlyoffice
- ./postgresql:/var/lib/postgresql
environment:
- JWT_ENABLED=true
- JWT_SECRET=secret
ports:
- 127.0.0.1:10080:80
labels:
monitoring.mydomain.de: "monitoring-enabled"
Hier ist dann ein Script, dass alle Container regelmässig ausliest und eine entprechende Statusmeldung pro Container ausgibt.
Code:
#!/bin/bash
declare -rx TIMEOUT=3
declare -rx PATH=/bin:/usr/bin:/usr/local/bin
declare -rx LC_ALL=C
declare -rx MON_LABEL="monitoring.mydomain.de"
declare -rx MON_ENABLED_VALUE="monitoring-enabled"
declare -rx MAX_ATTEMPTS=20
declare -x docker_data_json
get_json_data() {
# sometimes docker inspect hangs. catch that with timeout. try multiple times
for((try=1;try<=$MAX_ATTEMPTS;try++)) ;do
if docker_data_json="$(timeout $TIMEOUT docker inspect $(docker ps --quiet --all) 2>/dev/null)" ; then
return
fi
sleep 5
done
return 1
}
main() {
get_json_data || exit 1
while read container status ;do
[ "$status" == "running" ] && mon_status=0 || mon_status=2
message="Monitored Docker container $container is $( [ $mon_status -ne 0 ] && echo "not ")running"
# Display CheckMK local check line
echo "$mon_status docker_$container - $message"
done < <( jq -r ".[] | select(.Config.Labels.\"$MON_LABEL\" == \"$MON_ENABLED_VALUE\" ) \
| .Name[1:] + \" \" + .State.Status " <<<"$docker_data_json" )
}
main
Das ist dann die Ausgabe:
Code:
0 docker_nextcloud_db - Monitored Docker container nextcloud_db is running
0 docker_onlyoffice - Monitored Docker container onlyoffice is running
0 docker_nextcloud_sdklfsdj1Da13c - Monitored Docker container nextcloud_sdklfsdj1Da13c is running
0 docker_nextcloud_1Dsze5zGcP9k - Monitored Docker container nextcloud_1Dsze5zGcP9k is running
Ich empfehle das Script asynchron laufen zu lassen. Der Fall, dass "docker inspect" hängt, tritt bei mir recht häufig auf. Ich habe dazu auch einen Bugreport gesehen.
Das funktioniert nur, wenn der Container vorhanden ist. Wenn man mittels docker-compose down die Anwendung gestoppt hat, dann wird auch kein Fehler-Status angezeigt. Bei mir löst sich dass dadurch, das das Monitoring dann meckert, weil Ihm Daten zu diesen Checks fehlen. Aber vielleicht ist hier auch eine einfache Textdatei mit den Namen zu überwachender Docker-Container sinnvoll. An der Lösung gefällt mir, dass das Monitoring in der Containerdefinition aktiviert wird - keine Datei außerhalb.
Last edited: