Einfache Überwachung von Docker - Containern

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:

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:
Cooler Ansatz, allerdings brichts IMHO an dem Punkt wo das Monitoring eines Hosts auf eben jenem selben Host laeuft. Woher weisst du, dass die Kiste noch lebt?
 
Der Host selbst wird natürlich auch vom externen Monitoring-System überwacht und das Docker-Monitoring Script hier ist auch nur eine lokale Komponente, die von extern abgefragt wird.
 
Last edited:
Uptime Kuma kann auch Docker überwachen, wenn man auf der Maschine selbst

Code:
      - /var/run/docker.sock:/var/run/docker.sock
als Volume in den UK reinlegt.

Alternativ kann UK wohl auch von extern via TVP/HTTP Docker direkt überwachen. Die ganzen Notification Optionen sind da halt sehr praktisch.

Alternativ überwacht man das Ergebnis, also das Webinterface oder ähnliches.
 
ich weiss jetzt nicht warum du dir so einen stress machst, nimm doch die checkmk integrierte Version...
https://docs.checkmk.com/latest/de/monitoring_docker.html

Wenn du dann den Container selber auch noch anlegst mit "No IP" werden die Checks per Piggyback an den Host angefügt:
1698408910953.png
 
Back
Top