Blog

Bootstrapping und Überwachung mehrerer Prozesse in Docker mit monit

Mark van Holsteijn

Aktualisiert Oktober 22, 2025
4 Minuten

Wenn Sie schon einmal versucht haben, einen Docker-Container zu starten und am Laufen zu halten, sind Sie sicher schon einmal auf das Problem gestoßen, dass dies keine leichte Aufgabe ist. Die meisten Dinge, die ich in Containern starten möchte, sind Dinge wie http-Server, Anwendungsserver und verschiedene andere Middleware-Komponenten, die in der Regel über Startskripte verfügen, die das Programm dämonisieren. Das Starten eines einzelnen Prozesses ist mühsam, das Starten von mehreren Prozessen wird unangenehm. Ich rate Ihnen, monit zu verwenden, um alle außer den einfachsten Docker-Anwendungscontainern zu starten! Als ich monit entdeckte, als ich das Innenleben von Cloud Foundry durchstöberte, war ich begeistert davon! Es war so elegant, klein, schnell und hatte eine wunderbare DSL, dass ich dachte, es sei das Heißeste seit geschnittenem Brot! Ich war fest entschlossen, es von den Dächern zu bloggen. Bis.... entdeckte ich, dass die erste Version irgendwo aus dem Jahr 2002 stammte. Es war also nicht heiß und neu; offensichtlich hatte ich schon eine ganze Weile unter einem UNIX-Felsen gelegen. Diesmal war es an der Zeit, darüber zu schreiben! Die meisten Middleware-Komponenten, die ich in einem Docker-Container starten möchte, haben die Angewohnheit, den Prozess zu starten, ihn zu dämonisieren und sofort wieder zu beenden, wobei der Docker-Container auf dem Fuße folgt. Mein erster Versuch, dies beim Starten eines Tomcat-Servers in Docker zu umgehen, sah ungefähr so aus:

/bin/bash -c "service tomcat7 start;while service tomcat7 status;do sleep 1;done

Ziemlich grauenhaft. Stellen Sie sich die Hässlichkeit vor, wenn Sie mehrere Prozesse starten müssen. Es wird eine bessere Lösung benötigt: Mit dem zabbix Docker-Container wurde das Problem mit simplevisor gelöst. Wie Sie in diesem Beitrag lesen können, war auch das keine angenehme Erfahrung. Da ich mich mit simplevisor kaum auskannte und das Problem nicht lösen konnte, habe ich eine Anfrage gestellt und auf eine einfache Installation zurückgegriffen. Aber eine Stimme in meinem Kopf begann zu nörgeln: "Warum beheben Sie das Problem nicht und schicken einen Pull Request?" (eigentlich war es die Stimme meines Kollegen Arjan Molenaar). Dann erinnerte ich mich an meine früheren Erkundungen des Innenlebens von Cloud Foundry und an ein Tool, das für diese Aufgabe wirklich geeignet wäre: monit. Und warum? Das wird sie:

  1. Sie erhalten eine schöne, lesbare Spezifikationsdatei, die angibt, welche Prozesse gestartet werden sollen.
  2. Stellen Sie sicher, dass Ihre Prozesse weiterlaufen
  3. Liefern Sie eine saubere und scharfe Überwachungsanwendung
  4. Reduzieren Sie alle Ihre Docker-Starts auf einen einzigen Befehl!

Im Fall des Zabbix-Servers mussten sieben Prozesse gestartet werden: der Zabbix-Server, der Agent, der Java-Agent, Apache, mysql und sshd. In monit sieht dies wie folgt aus:

check process mysqld with pidfile /var/run/mysqld/mysqld.pid
        start program = "/sbin/service mysqld start"
        stop program = "/sbin/service mysqld stop"
check process zabbix-server with pidfile /var/run/zabbix/zabbix_server.pid
        start program = "/sbin/service zabbix-server start"
        stop program = "/sbin/service zabbix-server stop"
        depends on mysqld
check process zabbix-agent with pidfile /var/run/zabbix/zabbix_agentd.pid
        start program = "/sbin/service zabbix-agent start"
        stop program = "/sbin/service zabbix-agent stop"
check process zabbix-java-gateway with pidfile /var/run/zabbix/zabbix_java.pid
        start program = "/sbin/service zabbix-java-gateway start"
        stop program = "/sbin/service zabbix-java-gateway stop"
check process httpd with pidfile /var/run/httpd/httpd.pid
        start program = "/sbin/service httpd start"
        stop program = "/sbin/service httpd stop"
        depends on zabbix-server
check process sshd with pidfile /var/run/sshd.pid
        start program = "/sbin/service sshd start"
        stop program = "/sbin/service sshd stop"

Wenn Sie monit starten, wird es normalerweise als Daemon gestartet. Aber zum Glück können Sie dies mit der folgenden Konfiguration verhindern.

set init

Ihre Dockerfile CMD kann jetzt immer gleich aussehen:


    monit -d 10 -Ic /etc/monitrc

Wenn Sie schließlich die folgende Anweisung zur Konfiguration hinzufügen, erhalten Sie eine Anwendung, mit der Sie den Status Ihrer Container-Prozesse einsehen können,

set httpd
     port 2812
     allow myuser:mypassword

Nachdem Sie den Container gestartet haben, surfen Sie zu Port 2812 und Sie erhalten eine schöne Seite, die den Status Ihrer Prozesse anzeigt und die Möglichkeit bietet, diese anzuhalten und neu zu starten.

Monit-Übersicht  monit Prozesskontrolle

Schauen Sie einfach in die Dokumentation von monit und Sie werden noch viel mehr Funktionen finden, die es Ihnen ermöglichen, Netzwerkports und Dateien zu überwachen, Korrekturmaßnahmen einzuleiten und Warnmeldungen zu versenden. Monit bleibt seinem UNIX-Erbe treu: Es ist elegant und fördert ein autonomes Überwachungssystem. Monit ist cool!

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.