{"id":4943,"date":"2026-08-20T08:00:00","date_gmt":"2026-08-20T08:00:00","guid":{"rendered":"https:\/\/netguide.io\/linux\/?p=4943"},"modified":"2026-08-10T23:42:26","modified_gmt":"2026-08-10T23:42:26","slug":"docker-healthcheck-einrichten","status":"publish","type":"post","link":"https:\/\/netguide.io\/linux\/de\/docker-healthcheck-einrichten\/","title":{"rendered":"Docker Healthcheck einrichten \u2013 Container \u00fcberwachen"},"content":{"rendered":"<script type=\"text\/plain\" data-tcf=\"waiting-for-consent\" data-id=\"4797\" data-bid=\"2\" data-placement=\"4798\">PGRpdiBpZD0ibmV0Z3VpZGVhLTExNTE5NTIzMzQiIGNsYXNzPSJuZXRndWlkZWEtYmVmb3JlLWNvbnRlbnQgbmV0Z3VpZGVhLWVudGl0eS1wbGFjZW1lbnQiPjxkaXYgY2xhc3M9Im5ldGd1aWRlYS1hZGxhYmVsIj5BZHZlcnRpc2VtZW50czwvZGl2PjxzY3JpcHQgYXN5bmMgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9qcy9hZHNieWdvb2dsZS5qcz9jbGllbnQ9Y2EtcHViLTYyNTg1NTYyNTcyNDU5OTgiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PjxpbnMgY2xhc3M9ImFkc2J5Z29vZ2xlIiBzdHlsZT0iZGlzcGxheTpibG9jazsiIGRhdGEtYWQtY2xpZW50PSJjYS1wdWItNjI1ODU1NjI1NzI0NTk5OCIgCmRhdGEtYWQtc2xvdD0iMzQ5NDExNTM0MiIgCmRhdGEtYWQtZm9ybWF0PSJhdXRvIj48L2lucz4KPHNjcmlwdD4gCihhZHNieWdvb2dsZSA9IHdpbmRvdy5hZHNieWdvb2dsZSB8fCBbXSkucHVzaCh7fSk7IAo8L3NjcmlwdD4KPC9kaXY+<\/script>\n<p class=\"wp-block-paragraph\">Ein Container l\u00e4uft \u2013 aber tut er auch, was er soll? \u201eL\u00e4uft&#8221; hei\u00dft nicht automatisch \u201egesund&#8221;. Mit einem <strong>Healthcheck<\/strong> pr\u00fcft Docker den tats\u00e4chlichen Zustand deiner Container regelm\u00e4\u00dfig selbst. In dieser Anleitung richtest du einen <strong>Docker Healthcheck<\/strong> im Dockerfile und in Compose ein und erf\u00e4hrst, wie du auf einen kranken Container reagierst.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein <strong>Docker Healthcheck<\/strong> ist der Unterschied zwischen \u201eder Container l\u00e4uft&#8221; und \u201eder Dienst funktioniert wirklich&#8221;. Ohne Healthcheck wei\u00df Docker nur, ob der Hauptprozess noch lebt \u2013 nicht aber, ob deine Anwendung Anfragen beantwortet, die Datenbankverbindung steht oder ein Webserver einen 200er liefert. Genau diese L\u00fccke schlie\u00dft du mit einer <strong>Gesundheitspr\u00fcfung<\/strong>, die Docker in festen Intervallen selbst ausf\u00fchrt. In dieser Anleitung richtest du Healthchecks im <strong>Dockerfile<\/strong> und in <strong>Docker Compose<\/strong> ein, lernst die wichtigsten Parameter kennen und siehst, wie Orchestrierung und Neustart-Logik auf einen kranken Container reagieren.<\/p>\n\n\n\t\t\t\t<div class=\"wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-1ffd1ad5      \"\n\t\t\t\t\tdata-scroll= \"1\"\n\t\t\t\t\tdata-offset= \"30\"\n\t\t\t\t\tstyle=\"\"\n\t\t\t\t>\n\t\t\t\t<div class=\"uagb-toc__wrap\">\n\t\t\t\t\t\t<div class=\"uagb-toc__title\">\n\t\t\t\t\t\t\tInhaltsverzeichnis\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"uagb-toc__list-wrap \">\n\t\t\t\t\t\t<ol class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#warum-ein-healthcheck\" class=\"uagb-toc-link__trigger\">Warum ein Healthcheck?<\/a><li class=\"uagb-toc__list\"><a href=\"#healthcheck-in-der-docker-composeyml\" class=\"uagb-toc-link__trigger\">Healthcheck in der docker-compose.yml<\/a><li class=\"uagb-toc__list\"><a href=\"#healthcheck-im-dockerfile\" class=\"uagb-toc-link__trigger\">Healthcheck im Dockerfile<\/a><li class=\"uagb-toc__list\"><a href=\"#den-status-pr\u00fcfen\" class=\"uagb-toc-link__trigger\">Den Status pr\u00fcfen<\/a><li class=\"uagb-toc__list\"><a href=\"#auf-einen-gesunden-dienst-warten\" class=\"uagb-toc-link__trigger\">Auf einen gesunden Dienst warten<\/a><li class=\"uagb-toc__list\"><a href=\"#die-healthcheck-parameter-im-detail\" class=\"uagb-toc-link__trigger\">Die Healthcheck-Parameter im Detail<\/a><li class=\"uagb-toc__list\"><a href=\"#womit-du-wirklich-pr\u00fcfen-solltest\" class=\"uagb-toc-link__trigger\">Womit du wirklich pr\u00fcfen solltest<\/a><li class=\"uagb-toc__list\"><a href=\"#healthcheck-in-orchestrierung-und-neustarts\" class=\"uagb-toc-link__trigger\">Healthcheck in Orchestrierung und Neustarts<\/a><li class=\"uagb-toc__list\"><a href=\"#h\u00e4ufige-fragen\" class=\"uagb-toc-link__trigger\">H\u00e4ufige Fragen<\/a><li class=\"uagb-toc__list\"><a href=\"#warum-bleibt-mein-container-auf-starting-stehen\" class=\"uagb-toc-link__trigger\">Warum bleibt mein Container auf \u201estarting&quot; stehen?<\/a><li class=\"uagb-toc__list\"><a href=\"#braucht-der-healthcheck-curl-im-image\" class=\"uagb-toc-link__trigger\">Braucht der Healthcheck curl im Image?<\/a><li class=\"uagb-toc__list\"><a href=\"#kann-ich-einen-im-image-definierten-healthcheck-abschalten\" class=\"uagb-toc-link__trigger\">Kann ich einen im Image definierten Healthcheck abschalten?<\/a><li class=\"uagb-toc__list\"><a href=\"#fazit\" class=\"uagb-toc-link__trigger\">Fazit<\/a><\/ol>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Warum ein Healthcheck?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ohne Healthcheck kennt Docker nur zwei Zust\u00e4nde: Der Hauptprozess l\u00e4uft oder nicht. Eine App kann aber laufen und trotzdem nicht antworten \u2013 etwa weil die Datenbank h\u00e4ngt. Ein Healthcheck testet die echte Funktion und markiert den Container als <code>healthy<\/code> oder <code>unhealthy<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Healthcheck in der docker-compose.yml<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Am h\u00e4ufigsten definierst du den Healthcheck pro Dienst in Compose. Das Beispiel pr\u00fcft alle 30 Sekunden, ob ein Webserver antwortet:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>services:\n  web:\n    image: nginx:latest\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http:\/\/localhost\/\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 20s<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #85E89D\">services<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">  web<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    image<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">nginx:latest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    healthcheck<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      test<\/span><span style=\"color: #E1E4E8\">: [<\/span><span style=\"color: #9ECBFF\">\"CMD\"<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">\"curl\"<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">\"-f\"<\/span><span style=\"color: #E1E4E8\">, <\/span><span style=\"color: #9ECBFF\">\"http:\/\/localhost\/\"<\/span><span style=\"color: #E1E4E8\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      interval<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">30s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      timeout<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">10s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      retries<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #79B8FF\">3<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      start_period<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">20s<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Parameter<\/th><th>Bedeutung<\/th><\/tr><\/thead><tbody><tr><td><code>test<\/code><\/td><td>Der Pr\u00fcfbefehl (Exit 0 = gesund)<\/td><\/tr><tr><td><code>interval<\/code><\/td><td>Abstand zwischen den Pr\u00fcfungen<\/td><\/tr><tr><td><code>timeout<\/code><\/td><td>Maximale Dauer einer Pr\u00fcfung<\/td><\/tr><tr><td><code>retries<\/code><\/td><td>Fehlversuche bis \u201eunhealthy\u201c<\/td><\/tr><tr><td><code>start_period<\/code><\/td><td>Anlaufzeit, in der Fehler ignoriert werden<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Die Compose-Grundlagen dazu findest du in <a href=\"https:\/\/netguide.io\/linux\/de\/docker-compose-installieren-ubuntu-debian\/\">Docker Compose installieren<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Healthcheck im Dockerfile<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Alternativ verankerst du den Check direkt im <a href=\"https:\/\/netguide.io\/linux\/de\/dockerfile-eigenes-docker-image-bauen\/\">Dockerfile<\/a>, dann bringt jedes Image ihn mit:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>HEALTHCHECK --interval=30s --timeout=10s --retries=3 \\\n  CMD curl -f http:\/\/localhost\/ || exit 1<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F97583\">HEALTHCHECK<\/span><span style=\"color: #E1E4E8\"> --interval=30s --timeout=10s --retries=3 \\<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">  CMD<\/span><span style=\"color: #E1E4E8\"> curl -f http:\/\/localhost\/ || exit 1<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Den Status pr\u00fcfen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der aktuelle Gesundheitszustand erscheint direkt in der Container-Liste:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>docker ps<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #B392F0\">docker<\/span><span style=\"color: #9ECBFF\"> ps<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">In der Spalte STATUS steht dann z. B. <code>(healthy)<\/code>. Bleibt ein Container <code>unhealthy<\/code>, lohnt ein Blick in die <a href=\"https:\/\/netguide.io\/linux\/de\/docker-logs-anzeigen-verwalten\/\">Container-Logs<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Auf einen gesunden Dienst warten<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein besonders praktischer Nebeneffekt: In Compose kannst du einen Dienst erst starten lassen, wenn ein anderer <code>healthy<\/code> ist. So wartet die App zuverl\u00e4ssig auf die Datenbank, statt bei einem Neustart ins Leere zu laufen:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#24292e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#e1e4e8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>services:\n  app:\n    image: meine-app:latest\n    depends_on:\n      datenbank:\n        condition: service_healthy<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark\" style=\"background-color: #24292e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #85E89D\">services<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">  app<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    image<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">meine-app:latest<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">    depends_on<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">      datenbank<\/span><span style=\"color: #E1E4E8\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #85E89D\">        condition<\/span><span style=\"color: #E1E4E8\">: <\/span><span style=\"color: #9ECBFF\">service_healthy<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Die Healthcheck-Parameter im Detail<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Healthcheck ist mehr als nur ein Test-Befehl. \u00dcber mehrere Optionen steuerst du, wie oft gepr\u00fcft wird, wie lange ein Test dauern darf und ab wann Docker einen Container als <code>unhealthy<\/code> markiert. Die richtige Abstimmung verhindert Fehlalarme bei langsam startenden Diensten ebenso wie zu tr\u00e4ges Reagieren auf echte Ausf\u00e4lle.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Parameter<\/th><th>Bedeutung<\/th><th>Typischer Wert<\/th><\/tr><\/thead><tbody><tr><td><code>interval<\/code><\/td><td>Abstand zwischen zwei Pr\u00fcfungen<\/td><td>30s<\/td><\/tr><tr><td><code>timeout<\/code><\/td><td>Maximale Dauer eines einzelnen Tests<\/td><td>5s<\/td><\/tr><tr><td><code>retries<\/code><\/td><td>Fehlversuche bis <code>unhealthy<\/code><\/td><td>3<\/td><\/tr><tr><td><code>start_period<\/code><\/td><td>Anlaufzeit, in der Fehler ignoriert werden<\/td><td>30s<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Gerade <code>start_period<\/code> wird oft vergessen: Braucht deine Anwendung beim Start ein paar Sekunden, um Migrationen auszuf\u00fchren oder einen Cache aufzubauen, w\u00fcrde sie sonst sofort als krank gelten. Mit einer gro\u00dfz\u00fcgigen Anlaufzeit gibst du ihr Luft, ohne die sp\u00e4tere \u00dcberwachung abzuschw\u00e4chen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Womit du wirklich pr\u00fcfen solltest<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein guter Healthcheck testet den Dienst dort, wo ihn auch echte Nutzer erreichen. Ein simples <code>curl -f http:\/\/localhost:8080\/health<\/code> auf einen dedizierten Health-Endpunkt sagt mehr aus als die Frage, ob der Prozess existiert. Der Endpunkt sollte leichtgewichtig sein und im Idealfall auch abh\u00e4ngige Ressourcen kurz antippen.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Webdienste:<\/strong> HTTP-Anfrage auf einen <code>\/health<\/code>-Pfad, der einen Statuscode 200 liefert.<\/li>\n\n\n\n<li><strong>Datenbanken:<\/strong> ein Ping-Kommando wie <code>pg_isready<\/code> oder <code>mysqladmin ping<\/code>.<\/li>\n\n\n\n<li><strong>Worker ohne Port:<\/strong> Pr\u00fcfung einer Heartbeat-Datei oder eines internen Status-Kommandos.<\/li>\n\n\n\n<li><strong>Vermeide<\/strong> zu schwere Tests \u2013 jeder Check l\u00e4uft im festen Intervall und kostet Ressourcen.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Healthcheck in Orchestrierung und Neustarts<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der wahre Nutzen zeigt sich im Zusammenspiel mit Neustart-Regeln und Abh\u00e4ngigkeiten. In Docker Compose kannst du mit <code>depends_on<\/code> und der Bedingung <code>service_healthy<\/code> festlegen, dass ein Dienst erst startet, wenn seine Datenbank tats\u00e4chlich gesund ist \u2013 nicht nur gestartet. Das beseitigt eine ganze Klasse von Race-Conditions beim Hochfahren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kombinierst du den Healthcheck mit einer <a href=\"https:\/\/netguide.io\/linux\/de\/docker-compose-installieren-ubuntu-debian\/\">Compose<\/a>-Restart-Policy wie <code>restart: unless-stopped<\/code>, sorgt Docker au\u00dferdem daf\u00fcr, dass abgest\u00fcrzte Container automatisch wieder hochkommen. In gr\u00f6\u00dferen Setups mit Swarm oder Kubernetes steuert der Gesundheitsstatus sogar das Ausrollen neuer Versionen und das Herausnehmen kranker Instanzen aus dem Load Balancer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr den laufenden Betrieb lohnt es sich, den Status aktiv zu beobachten. Mit <code>docker ps<\/code> siehst du in der Spalte STATUS direkt Werte wie <code>(healthy)<\/code> oder <code>(unhealthy)<\/code>. M\u00f6chtest du auf Zustandswechsel reagieren, liefert <code>docker events --filter event=health_status<\/code> einen Live-Stream, den du in Monitoring-Skripte oder Benachrichtigungen einbinden kannst. So erf\u00e4hrst du von einem kranken Dienst, bevor deine Nutzer es tun.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">H\u00e4ufige Fragen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Beim Einrichten von Healthchecks tauchen typische Stolpersteine auf. Diese Antworten helfen dir schnell weiter.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Warum bleibt mein Container auf \u201estarting&#8221; stehen?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Solange die <code>start_period<\/code> l\u00e4uft oder noch keine erfolgreiche Pr\u00fcfung stattgefunden hat, zeigt Docker den Status <code>starting<\/code>. Pr\u00fcfe mit <code>docker inspect --format '{{json .State.Health}}' container<\/code> die letzten Ausgaben deines Test-Befehls \u2013 meist stimmt der Pfad oder der Port nicht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Braucht der Healthcheck curl im Image?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Der Test-Befehl l\u00e4uft im Container, also muss das Werkzeug dort vorhanden sein. Bei schlanken Images fehlt <code>curl<\/code> oft. Nutze dann <code>wget<\/code>, das eingebaute Kommando deiner Anwendung oder installiere <code>curl<\/code> gezielt im Dockerfile.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kann ich einen im Image definierten Healthcheck abschalten?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ja. In Compose setzt du <code>healthcheck: { disable: true }<\/code>, beim <code>docker run<\/code> nutzt du <code>--no-healthcheck<\/code>. Das ist praktisch, wenn du in einer bestimmten Umgebung eine andere Pr\u00fcfung verwenden m\u00f6chtest.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Healthcheck macht aus \u201eder Container l\u00e4uft&#8221; ein belastbares \u201eder Dienst funktioniert&#8221;. Definiere Pr\u00fcfbefehl, Intervall und Fehlversuche \u2013 in Compose oder im Dockerfile \u2013 und du erkennst Probleme, bevor deine Nutzer es tun. Mit <code>depends_on<\/code> und <code>service_healthy<\/code> steuerst du zus\u00e4tzlich die Startreihenfolge. In Kombination mit einer <a href=\"https:\/\/netguide.io\/linux\/de\/docker-restart-policy-container-automatisch-starten\/\">Restart-Policy<\/a> h\u00e4ltst du deine Dienste zuverl\u00e4ssig am Laufen.<\/p>\n<script type=\"text\/plain\" data-tcf=\"waiting-for-consent\" data-id=\"4799\" data-bid=\"2\" data-placement=\"4800\">PGRpdiBpZD0ibmV0Z3VpZGVhLTMxMjY3NTYzOTkiIGNsYXNzPSJuZXRndWlkZWEtYWZ0ZXItY29udGVudCBuZXRndWlkZWEtZW50aXR5LXBsYWNlbWVudCI+PGRpdiBjbGFzcz0ibmV0Z3VpZGVhLWFkbGFiZWwiPkFkdmVydGlzZW1lbnRzPC9kaXY+PHNjcmlwdCBhc3luYyBzcmM9Ii8vcGFnZWFkMi5nb29nbGVzeW5kaWNhdGlvbi5jb20vcGFnZWFkL2pzL2Fkc2J5Z29vZ2xlLmpzP2NsaWVudD1jYS1wdWItNjI1ODU1NjI1NzI0NTk5OCIgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+PGlucyBjbGFzcz0iYWRzYnlnb29nbGUiIHN0eWxlPSJkaXNwbGF5OmJsb2NrOyIgZGF0YS1hZC1jbGllbnQ9ImNhLXB1Yi02MjU4NTU2MjU3MjQ1OTk4IiAKZGF0YS1hZC1zbG90PSI0NTU5Nzg1MDAyIiAKZGF0YS1hZC1mb3JtYXQ9ImF1dG8iPjwvaW5zPgo8c2NyaXB0PiAKKGFkc2J5Z29vZ2xlID0gd2luZG93LmFkc2J5Z29vZ2xlIHx8IFtdKS5wdXNoKHt9KTsgCjwvc2NyaXB0Pgo8L2Rpdj4=<\/script>","protected":false},"excerpt":{"rendered":"<p>Docker Healthcheck einrichten: den Zustand von Containern automatisch pr\u00fcfen, im Dockerfile und in docker-compose.yml definieren und auf \u201eunhealthy\u201c reagieren.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[231,9],"tags":[],"class_list":["post-4943","post","type-post","status-publish","format-standard","hentry","category-docker","category-linux"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Tobias","author_link":"https:\/\/netguide.io\/linux\/author\/tobias-pries\/"},"uagb_comment_info":0,"uagb_excerpt":"Docker Healthcheck einrichten: den Zustand von Containern automatisch pr\u00fcfen, im Dockerfile und in docker-compose.yml definieren und auf \u201eunhealthy\u201c reagieren.","brizy_media":[],"_links":{"self":[{"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/posts\/4943","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/comments?post=4943"}],"version-history":[{"count":2,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/posts\/4943\/revisions"}],"predecessor-version":[{"id":4970,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/posts\/4943\/revisions\/4970"}],"wp:attachment":[{"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/media?parent=4943"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/categories?post=4943"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netguide.io\/linux\/wp-json\/wp\/v2\/tags?post=4943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}