{"id":8747,"date":"2026-01-22T10:46:20","date_gmt":"2026-01-22T10:46:20","guid":{"rendered":"\/de\/tutorials\/?p=8747"},"modified":"2026-01-22T10:46:23","modified_gmt":"2026-01-22T10:46:23","slug":"docker-tutorial","status":"publish","type":"post","link":"\/de\/tutorials\/docker-tutorial","title":{"rendered":"Docker-Tutorial: Eine vollst\u00e4ndige Anleitung zum Ausf\u00fchren von Containern"},"content":{"rendered":"<p>Docker ist eine offene Plattform, die entwickelt wurde, um die Entwicklung, Bereitstellung und Ausf&uuml;hrung von Anwendungen zu vereinfachen. Die Softwarebereitstellung wird dabei durch <strong>Containerisierung<\/strong> standardisiert &ndash; eine Technologie, bei der Anwendungen gemeinsam mit ihren Abh&auml;ngigkeiten in isolierte, lauff&auml;hige Einheiten, sogenannte <strong>Container<\/strong>, verpackt werden. Dadurch wird sichergestellt, dass Anwendungen unabh&auml;ngig von der zugrunde liegenden Umgebung konsistent funktionieren.<\/p><p>Im Kern basiert Docker auf mehreren zentralen Konzepten, darunter <strong>Docker Engine<\/strong>, <strong>Docker Hub<\/strong>, <strong>Images<\/strong>, <strong>Container<\/strong>, <strong>Dockerfiles<\/strong> und <strong>Docker Compose<\/strong>. Ein grundlegendes Verst&auml;ndnis dieser Komponenten ist erforderlich, um containerisierte Anwendungen zu erstellen, bereitzustellen und effizient zu verwalten.<\/p><p>Die Interaktion mit Docker erfolgt in der Regel &uuml;ber die Kommandozeile, Docker stellt jedoch zus&auml;tzlich eine Desktop-Version mit grafischer Benutzeroberfl&auml;che bereit. Der Einrichtungsprozess unterscheidet sich entsprechend: W&auml;hrend Docker Desktop wie eine herk&ouml;mmliche Anwendung &uuml;ber eine <strong>.dmg<\/strong>&ndash; oder <strong>.exe<\/strong>-Datei installiert wird, erfolgt die Installation der Docker CLI typischerweise &uuml;ber einen Paketmanager wie <strong>APT<\/strong> oder <strong>Homebrew<\/strong>.<\/p><p>Beim Arbeiten mit dem Docker-&Ouml;kosystem k&ouml;nnen auf unterschiedlichen Ebenen Fehler auftreten &ndash; etwa auf Image-Ebene, innerhalb eines Dockerfiles oder beim Ausf&uuml;hren von Containern. Da solche Probleme die Funktionalit&auml;t der gesamten Container-Umgebung beeintr&auml;chtigen k&ouml;nnen, ist es wichtig, die h&auml;ufigsten Fehlerbilder, ihre Ursachen und geeignete L&ouml;sungsans&auml;tze zu kennen. Auf diese Aspekte wird im weiteren Verlauf detaillierter eingegangen, nachdem zun&auml;chst die grundlegenden Docker-Konzepte erl&auml;utert wurden.<\/p><p>\n\n\n\n\n\n\n<\/p><h2 class=\"wp-block-heading\" id=\"h-what-is-containerization\">Was ist Containerisierung?<\/h2><p>Containerisierung ist eine Form der Virtualisierung auf Betriebssystemebene, bei der Softwareanwendungen so verpackt werden, dass sie in isolierten Benutzerbereichen ausgef&uuml;hrt werden. Diese isolierten Einheiten werden als Container bezeichnet.<\/p><div class=\"wp-block-image\">\n<figure data-wp-context='{\"imageId\":\"69ecec878faa1\"}' data-wp-interactive=\"core\/image\" class=\"aligncenter size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"572\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2026\/01\/eine-Visualisierung-der-Funktionsweise-von-Containern-im-Vergleich-zu-einer-virtuellen-Maschine.png\/public\" alt=\"Eine Visualisierung der Funktionsweise von Containern im Vergleich zu herk&ouml;mmlichen virtuellen Maschinen\" class=\"wp-image-8417\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2026\/01\/eine-Visualisierung-der-Funktionsweise-von-Containern-im-Vergleich-zu-einer-virtuellen-Maschine.png\/w=1024,fit=scale-down 1024w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2026\/01\/eine-Visualisierung-der-Funktionsweise-von-Containern-im-Vergleich-zu-einer-virtuellen-Maschine.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2026\/01\/eine-Visualisierung-der-Funktionsweise-von-Containern-im-Vergleich-zu-einer-virtuellen-Maschine.png\/w=768,fit=scale-down 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Vergr&ouml;&szlig;ern\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><\/div><p>Ein Container b&uuml;ndelt eine Anwendung mit allen erforderlichen Komponenten &ndash; darunter Code, Systembibliotheken, Abh&auml;ngigkeiten und Konfigurationsdateien &ndash; und stellt damit eine abgeschlossene Laufzeitumgebung bereit.<\/p><p>Im Gegensatz zu virtuellen Maschinen (VMs) sind Container deutlich leichtergewichtig, da sie sich den Betriebssystemkernel des Hostsystems teilen. Durch diese Entkopplung von der zugrunde liegenden Infrastruktur wird eine konsistente Ausf&uuml;hrung von Anwendungen &uuml;ber verschiedene Umgebungen hinweg erm&ouml;glicht.<\/p><p>Zu den zentralen Vorteilen der Containerisierung geh&ouml;ren:<\/p><ul class=\"wp-block-list\">\n<li><strong>Portabilit&auml;t<\/strong>: Container lassen sich konsistent in nahezu jeder Umgebung ausf&uuml;hren &ndash; von lokalen Entwicklungsrechnern bis hin zu Remote-Servern bei Anbietern wie Hostinger. Dadurch wird ein h&auml;ufiges Problem beseitigt, bei dem Anwendungen beim Wechsel zwischen Systemen w&auml;hrend der Bereitstellung oder Zusammenarbeit auf Kompatibilit&auml;tsprobleme sto&szlig;en.<\/li>\n\n\n\n<li><strong>Effizienz<\/strong>: W&auml;hrend virtuelle Maschinen ein vollst&auml;ndiges Gastbetriebssystem sowie einen Hypervisor erfordern, entf&auml;llt dieser Overhead bei Containern. Dadurch stellt Containerisierung eine ressourcenschonendere und effizientere Form der Virtualisierung dar.<\/li>\n\n\n\n<li><strong>Isolation<\/strong>: Jeder Container f&uuml;hrt Prozesse isoliert aus und verf&uuml;gt &uuml;ber eigene Software, Konfigurationen, einen separaten Netzwerk-Stack sowie eigene Umgebungsvariablen. Dies erh&ouml;ht die Sicherheit und verhindert Konflikte zwischen parallel betriebenen Anwendungen.<\/li>\n<\/ul><h3 class=\"wp-block-heading\" id=\"h-why-should-i-use-docker\">Warum Docker verwenden?<\/h3><p><a href=\"\/de\/tutorials\/was-ist-docker\" data-type=\"post\" data-id=\"8725\">Docker<\/a> bietet eine zuverl&auml;ssige, effiziente und standardisierte M&ouml;glichkeit zum Erstellen, Verteilen und Ausf&uuml;hren von Anwendungen. Die Plattform adressiert mehrere praxisrelevante Herausforderungen in der Softwareentwicklung und -bereitstellung:<\/p><ul class=\"wp-block-list\">\n<li><strong>Das Problem &bdquo;Auf meinem Rechner funktioniert es&ldquo;<\/strong>. Docker stellt sicher, dass eine Anwendung f&uuml;r alle Entwickler und &uuml;ber s&auml;mtliche Phasen der Bereitstellung hinweg identisch ausgef&uuml;hrt wird. Dadurch werden umgebungsbedingte Fehler effektiv eliminiert.<\/li>\n\n\n\n<li><strong>Schnelle Entwicklung und Bereitstellung<\/strong>. Docker vereinfacht die Erstellung reproduzierbarer Umgebungen erheblich. Bestehende Komponenten wie Caching-Systeme oder Zahlungsgateways lassen sich integrieren, ohne diese von Grund auf neu implementieren zu m&uuml;ssen, was Entwicklungszeit spart.<\/li>\n\n\n\n<li><strong>Skalierbarkeit und Portabilit&auml;t<\/strong>. Mithilfe von Tools wie Docker Compose k&ouml;nnen komplexe Multi-Container-Anwendungsstacks in einer einzigen Konfigurationsdatei definiert und weitergegeben werden. Dies erleichtert die Zusammenarbeit in Teams, stellt Konsistenz sicher und erm&ouml;glicht das bedarfsgerechte Skalieren einzelner Dienste.<\/li>\n\n\n\n<li><strong>Ressourceneffizienz<\/strong>. Da Container leichtgewichtig sind und den Kernel des Host-Betriebssystems gemeinsam nutzen, ben&ouml;tigen sie deutlich weniger Systemressourcen als klassische virtuelle Maschinen.<\/li>\n<\/ul><h2 class=\"wp-block-heading\" id=\"h-what-are-the-core-docker-concepts\">Was sind die Kernkonzepte von Docker?<\/h2><p>Docker strukturiert das Prinzip der Containerisierung in eine Reihe zentraler, voneinander abh&auml;ngiger Komponenten. Diese Elemente arbeiten gemeinsam als Plattform, um den gesamten Lebenszyklus einer containerisierten Anwendung zu verwalten &ndash; von der Erstellung des ersten Entwurfs bis zur Ausf&uuml;hrung einer produktiven Multi-Service-Anwendung.<\/p><h3 class=\"wp-block-heading\" id=\"h-docker-engine\">Docker-Engine<\/h3><p>Die Docker Engine ist die zentrale Open-Source-Komponente zum Erstellen, Bereitstellen und Ausf&uuml;hren containerisierter Anwendungen. Sie basiert auf einer Client-Server-Architektur und verwaltet Docker-Objekte wie Images, Container, Netzwerke und Volumes.<\/p><p>Die Docker Engine besteht aus drei Hauptkomponenten:<\/p><ol class=\"wp-block-list\">\n<li><strong>Der Server<\/strong>: Ein dauerhaft laufender Daemon-Prozess (<strong>dockerd<\/strong>), der zentrale Aufgaben wie das Erstellen, Starten, Stoppen und Entfernen von Containern &uuml;bernimmt.<\/li>\n\n\n\n<li><strong>APIs<\/strong>: Programmierschnittstellen, &uuml;ber die Clients &ndash; einschlie&szlig;lich der Docker CLI &ndash; mit dem Daemon kommunizieren und Aktionen ausl&ouml;sen k&ouml;nnen.<\/li>\n\n\n\n<li><strong>Der CLI-Client<\/strong>: Das Docker-Kommandozeilenwerkzeug, das die prim&auml;re Schnittstelle zur Interaktion mit der Docker-Plattform darstellt.<\/li>\n<\/ol><p>Zur besseren Veranschaulichung l&auml;sst sich die Docker Engine mit einem Restaurantbetrieb vergleichen:<\/p><ul class=\"wp-block-list\">\n<li>Der Server (<strong>dockerd<\/strong>) fungiert als <strong>K&uuml;che<\/strong>, die die eigentliche Ausf&uuml;hrung der Arbeitsschritte &uuml;bernimmt &ndash; vergleichbar mit der Zubereitung eines Gerichts.<\/li>\n\n\n\n<li>Die <strong>APIs<\/strong> <strong>entsprechen der Speisekarte, die definiert<\/strong>, welche Aktionen m&ouml;glich sind und wie diese angefordert werden k&ouml;nnen.<\/li>\n\n\n\n<li>Die <strong>Docker CLI<\/strong> dient als <strong>Kellner (Schnittstelle)<\/strong>, &uuml;ber den Befehle entgegengenommen und an den Daemon weitergeleitet werden.<\/li>\n<\/ul><p>Um zu &uuml;berpr&uuml;fen, ob die Docker Engine aktiv ist und korrekt mit dem Client kommuniziert, kann ein einfacher Befehl ausgef&uuml;hrt werden, der eine Antwort vom Daemon erwartet, zum Beispiel:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker ps<\/pre><p>Dieser Befehl fordert den <strong>Docker-Daemon<\/strong> auf, alle <strong>aktuell laufenden Container<\/strong> aufzulisten. Funktioniert die Docker Engine ordnungsgem&auml;&szlig;, wird eine entsprechende Ausgabe angezeigt.<\/p><h3 class=\"wp-block-heading\" id=\"h-docker-hub\">Docker Hub<\/h3><p><strong>Docker Hub<\/strong> ist die standardm&auml;&szlig;ige &ouml;ffentliche Registry f&uuml;r Docker-Images und dient als zentraler Speicher- und Verteilungsdienst. Die Plattform stellt offizielle Images f&uuml;r weit verbreitete Software wie <strong>nginx<\/strong>, <strong>Node.js<\/strong> oder <strong>Python<\/strong> bereit und erm&ouml;glicht es Nutzern, eigene &ouml;ffentliche oder private Repositories zu verwalten.<\/p><p>Beim Erstellen eines Containers werden ben&ouml;tigte Softwarepakete in Form von Images eingebunden. Docker Hub vereinfacht diesen Prozess, indem Images aus einem zentralen Repository heruntergeladen werden k&ouml;nnen.<\/p><p>Zur Versionsverwaltung verwendet Docker Hub sogenannte <strong>Tags<\/strong>, mit denen Images eindeutig gekennzeichnet werden, etwa <strong>latest<\/strong>. Dadurch wird sichergestellt, dass Container in verschiedenen Umgebungen konsistent und reproduzierbar ausgef&uuml;hrt werden.<\/p><p>Funktional l&auml;sst sich Docker Hub mit einer gemeinschaftlich genutzten Rezeptsammlung vergleichen: Vorgefertigte Vorlagen stehen zur Verf&uuml;gung und k&ouml;nnen direkt verwendet oder an eigene Anforderungen angepasst werden. Eigene Images lassen sich ebenfalls hochladen &ndash; entweder zur Weitergabe oder zur internen Nutzung.<\/p><p>Die Interaktion mit Docker Hub erfolgt &uuml;ber die Docker CLI. Um beispielsweise ein Image aus der Registry herunterzuladen, wird folgender Befehl verwendet:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker pull &lt;name&gt;:&lt;tag&gt;<\/pre><p>Um das neueste offizielle Ubuntu-Image herunterzuladen:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker pull ubuntu:latest<\/pre><h3 class=\"wp-block-heading\" id=\"h-docker-images\">Docker-Images<\/h3><p>Ein Docker-Image ist eine schreibgesch&uuml;tzte Vorlage, die alle Anweisungen und Dateien enth&auml;lt, die zur Erstellung eines Containers erforderlich sind. Dazu z&auml;hlen Anwendungscode, Konfigurationsdateien, Systembibliotheken sowie Bestandteile des Basisbetriebssystems.<\/p><p>Images werden mithilfe eines Dockerfiles erstellt. Jede Anweisung erzeugt dabei eine eigene, unver&auml;nderliche Schicht (Layer), die festlegt, welche Inhalte das Image enth&auml;lt und welche Aktionen ausgef&uuml;hrt werden.<\/p><p>Vereinfacht betrachtet dient ein Image als Bauplan f&uuml;r einen Container. Es definiert exakt, wie das sp&auml;tere Laufzeitsystem aufgebaut ist, kann nach der Erstellung jedoch nicht mehr ver&auml;ndert werden. Auf Basis dieses Bauplans wird anschlie&szlig;end ein Container instanziiert.<\/p><p>Um lokal verf&uuml;gbare Images aufzulisten, verwenden Sie folgenden Befehl:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker images<\/pre><p>Mit dem n&auml;chsten Befehl wird ein neues Image aus dem aktuellen Verzeichnis erstellt. Ist das verwendete Basis-Image noch nicht vorhanden, wird es automatisch aus der Registry heruntergeladen:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker build -t your-image-name:latest .<\/pre><p>Als bew&auml;hrte Vorgehensweise gilt die Verwendung m&ouml;glichst schlanker <a href=\"https:\/\/docs.docker.com\/build\/building\/base-images\/\" target=\"_blank\" rel=\"noopener\">Basis-Images<\/a>. Dies reduziert die Image-Gr&ouml;&szlig;e und minimiert die potenzielle Angriffsfl&auml;che, die h&auml;ufig durch unn&ouml;tige Pakete oder zus&auml;tzliche Komponenten entsteht.<\/p><h3 class=\"wp-block-heading\" id=\"h-docker-containers\">Docker-Container<\/h3><p>Ein Container ist eine lauff&auml;hige Instanz eines Docker-Images. Er stellt die isolierte Laufzeitumgebung dar, in der eine Anwendung gemeinsam mit ihrer Konfiguration, ihren Abh&auml;ngigkeiten und den erforderlichen Softwarepaketen ausgef&uuml;hrt wird.<\/p><p>Beim Erstellen eines Docker-Containers wird &uuml;ber den schreibgesch&uuml;tzten Ebenen des Images eine beschreibbare Schicht hinzugef&uuml;gt. Diese erm&ouml;glicht es, &Auml;nderungen am Dateisystem vorzunehmen, ohne das zugrunde liegende Image zu ver&auml;ndern.<\/p><p>Container sind darauf ausgelegt, kurzlebig und zustandslos zu sein. Das bedeutet, dass sie jederzeit gestoppt, entfernt, neu erstellt und mit minimalem Konfigurationsaufwand ersetzt werden k&ouml;nnen. Einzelne Container werden in der Regel direkt &uuml;ber die Docker CLI verwaltet, w&auml;hrend mehrere Container mithilfe von <strong>Docker Compose<\/strong> oder Orchestrierungswerkzeugen wie Kubernetes gesteuert werden.<\/p><p>In Anlehnung an die zuvor verwendete Analogie entspricht ein Container dem tats&auml;chlich laufenden System, das auf Basis eines Bauplans erstellt wurde. Beim Erstellen eines Docker-Containers wird dieses System instanziiert und gestartet, um die im Image definierten Prozesse auszuf&uuml;hren.<\/p><p>Um einen Docker-Container zu erstellen und einen Befehl darin auszuf&uuml;hren, verwenden Sie den Befehl run, zum Beispiel:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -it ubuntu \/bin\/bash<\/pre><p>Dieser Befehl startet einen interaktiven Container auf Basis des <strong>Ubuntu<\/strong>-Images und &ouml;ffnet eine <strong>\/bin\/bash<\/strong>-Shell innerhalb des Containers.<\/p><h3 class=\"wp-block-heading\" id=\"h-dockerfiles\">Dockerfiles<\/h3><p>Ein <strong>Dockerfile<\/strong> ist eine reine Textdatei, die eine Abfolge klar definierter Anweisungen zum Erstellen eines Docker-Images enth&auml;lt. Darin wird festgelegt, wie das Image aufgebaut ist &ndash; vom Basisbetriebssystem &uuml;ber Umgebungsvariablen bis hin zum Anwendungscode.<\/p><figure data-wp-context='{\"imageId\":\"69ecec879204e\"}' data-wp-interactive=\"core\/image\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" width=\"1024\" height=\"445\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2026\/01\/a-flow-of-building-a-container-from-a-dockerfile-2.png\/public\" alt=\"Ein Ablauf, der den Bauprozess eines Docker-Containers aus einer Docker-Datei anzeigt\" class=\"wp-image-8418\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2026\/01\/a-flow-of-building-a-container-from-a-dockerfile-2.png\/w=1024,fit=scale-down 1024w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2026\/01\/a-flow-of-building-a-container-from-a-dockerfile-2.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2026\/01\/a-flow-of-building-a-container-from-a-dockerfile-2.png\/w=768,fit=scale-down 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><button class=\"lightbox-trigger\" type=\"button\" aria-haspopup=\"dialog\" aria-label=\"Vergr&ouml;&szlig;ern\" data-wp-init=\"callbacks.initTriggerButton\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-style--right=\"state.imageButtonRight\" data-wp-style--top=\"state.imageButtonTop\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewbox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\"><\/path>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure><p>Zu den h&auml;ufigsten Anweisungen in einem Dockerfile geh&ouml;ren:<\/p><ul class=\"wp-block-list\">\n<li><strong>FROM<\/strong>: Gibt das Basis-Image f&uuml;r eine neue Build-Phase an.<\/li>\n\n\n\n<li><strong>RUN<\/strong>: F&uuml;hrt Befehle w&auml;hrend des Image-Erstellungsprozesses aus.<\/li>\n\n\n\n<li><strong>COPY<\/strong> oder <strong>ADD<\/strong>: Kopiert Dateien aus dem Build-Kontext in das Image.<\/li>\n\n\n\n<li><strong>CMD<\/strong> oder <strong>ENTRYPOINT<\/strong>: Definiert den Befehl, der beim Start des Containers ausgef&uuml;hrt wird.<\/li>\n\n\n\n<li><strong>ENV<\/strong>: Legt Umgebungsvariablen fest, die w&auml;hrend des Builds und zur Laufzeit verf&uuml;gbar sind.<\/li>\n\n\n\n<li><strong>WORKDIR<\/strong>: Definiert das Arbeitsverzeichnis f&uuml;r nachfolgende RUN-, CMD-, ENTRYPOINT-, COPY- und ADD-Anweisungen.<\/li>\n<\/ul><p>Bestimmte Dockerfile-Anweisungen erzeugen jeweils eine eigene Image-<strong>Schicht<\/strong> und stellen damit einen einzelnen Schritt im Build-Prozess dar. Anweisungen, die lediglich Konfigurations- oder Metadaten definieren, wie etwa <strong>WORKDIR<\/strong>, erzeugen hingegen keine zus&auml;tzliche Schicht.<\/p><p>Ein vereinfachtes Beispiel f&uuml;r ein Dockerfile sieht wie folgt aus:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">FROM python:3.9-slim\nWORKDIR \/app\nCOPY requirements.txt .\nRUN pip install -r requirements.txt\nCOPY . .\nCMD [\"python\", \"app.py\"]<\/pre><h3 class=\"wp-block-heading\" id=\"h-docker-compose\">Docker Compose<\/h3><p><strong>Docker Compose<\/strong> ist ein Tool zur Definition und Verwaltung von <strong>Multi-Container-Anwendungen<\/strong> mithilfe einer einzigen Konfigurationsdatei, in der Regel <strong>docker-compose.yml<\/strong>.<\/p><p>Innerhalb dieser Datei werden alle Container, Netzwerke und Volumes definiert, die f&uuml;r einen komplexen Anwendungsstack erforderlich sind. Diese Container werden im Kontext von Docker Compose als Services bezeichnet und lassen sich gemeinsam mit einem einzigen Befehl starten und verwalten.<\/p><p>Ohne Docker Compose m&uuml;ssten Container einzeln konfiguriert und separat &uuml;ber die Docker CLI verwaltet werden. Bei Anwendungen, die aus mehreren miteinander verbundenen Diensten bestehen, ist dieser Ansatz fehleranf&auml;llig und zeitaufwendig.<\/p><p>Bleibt man bei der Analogie einzelner Ger&auml;te, entspricht ein Container einer einzelnen Maschine, w&auml;hrend Docker Compose als Orchestrierungswerkzeug den Schaltplan f&uuml;r ein komplettes System vorgibt und das Zusammenspiel mehrerer Komponenten steuert.<\/p><p>Ein Beispiel f&uuml;r eine Docker-Compose-Datei:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n  web:\n    build: .\/web  # Build the image from Dockerfile in the .\/web directory\n    ports:\n      - \"8000:8000\"  # Map host port 8000 to container port 8000\n    depends_on:\n      - db     # Wait for the db service to be started\n      - redis  # Wait for the redis service to be started\n\n  db:\n    image: postgres:15  # Use the official PostgreSQL 15 image\n    environment:\n      POSTGRES_USER: myuser       # Set database username\n      POSTGRES_PASSWORD: mypassword  # Set database password\n      POSTGRES_DB: mydb           # Set initial database name\n    volumes:\n      - db-data:\/var\/lib\/postgresql\/data  # Persist database data using a named volume\n\n  redis:\n    image: redis:alpine  # Use a lightweight Redis image for caching\n\nvolumes:\n  db-data:  # Define a named volume to store database data<\/pre><p>Um alle in der Datei <strong>docker-compose.yml<\/strong> definierten Dienste im Hintergrund zu erstellen und zu starten, f&uuml;hren Sie folgenden Befehl mit dem <strong>-d<\/strong>-Flag (detached mode) aus:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker compose up -d<\/pre><p>Dar&uuml;ber hinaus stehen weitere <strong>Docker-Compose<\/strong>-Befehle zur Verf&uuml;gung, mit denen sich Container w&auml;hrend des gesamten Anwendungslebenszyklus zentral verwalten lassen.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-install-docker\">Installation von Docker<\/h2><p>Der Installationsprozess von Docker unterscheidet sich je nach verwendeter Variante. Bei der Nutzung von Docker Desktop kann das Installationspaket direkt von der offiziellen Docker-Website heruntergeladen und wie eine herk&ouml;mmliche Anwendung installiert werden.<\/p><p>Die Docker CLI hingegen wird in der Regel &uuml;ber den Paketmanager des jeweiligen Betriebssystems installiert, beispielsweise &uuml;ber APT unter Ubuntu oder Homebrew unter macOS. Detaillierte, distributionsabh&auml;ngige Installationsbefehle und Konfigurationshinweise finden Sie in der offiziellen <a href=\"https:\/\/docs.docker.com\/engine\/install\/\" target=\"_blank\" rel=\"noopener\">Docker-Dokumentation<\/a>.<\/p><p>Beachten Sie, dass die Docker CLI nicht automatisch den gesamten Funktionsumfang abdeckt. Komponenten wie Docker Compose m&uuml;ssen je nach Installation separat eingerichtet werden. Bei der Nutzung der <a href=\"\/de\/vps\/docker\">Docker-Hosting<\/a>-L&ouml;sung von Hostinger entf&auml;llt dieser Schritt, da Docker Compose bereits &uuml;ber die integrierte Docker-Manager-Funktion verf&uuml;gbar ist.<\/p><figure class=\"wp-block-image size-large\"><a href=\"\/de\/vps-server\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"300\" src=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2024\/02\/DE-VPS-hosting_in-text-banner.png\/public\" alt=\"\" class=\"wp-image-3556\" srcset=\"https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2024\/02\/DE-VPS-hosting_in-text-banner.png\/w=1024,fit=scale-down 1024w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2024\/02\/DE-VPS-hosting_in-text-banner.png\/w=300,fit=scale-down 300w, https:\/\/imagedelivery.net\/LqiWLm-3MGbYHtFuUbcBtA\/wp-content\/uploads\/sites\/29\/2024\/02\/DE-VPS-hosting_in-text-banner.png\/w=768,fit=scale-down 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><h3 class=\"wp-block-heading\" id=\"h-understanding-basic-docker-commands\">Grundlegende Docker-Befehle<\/h3><p>Die Docker CLI dient als prim&auml;re Schnittstelle zur Interaktion mit der Docker Engine und zur Verwaltung von Containern. Im Folgenden finden Sie einige der wichtigsten Docker-Befehle f&uuml;r h&auml;ufige Aufgaben:<\/p><ul class=\"wp-block-list\">\n<li><strong>docker ps -a.&nbsp;<\/strong>Listet <strong>alle<\/strong> Container auf, einschlie&szlig;lich gestoppter Container.<\/li>\n\n\n\n<li><strong>docker pull &lt;name&gt;:&lt;tag&gt;.&nbsp;<\/strong>L&auml;dt ein Image aus einer Registry auf das lokale System herunter.<\/li>\n\n\n\n<li><strong>docker rmi &lt;image&gt;.&nbsp;<\/strong>Entfernt ein lokales Image.<\/li>\n\n\n\n<li><strong>docker stop &lt;container&gt;.&nbsp;<\/strong>Beendet einen laufenden Container kontrolliert.<\/li>\n\n\n\n<li><strong>docker rm &lt;container&gt;.&nbsp;<\/strong>L&ouml;scht einen Container.<\/li>\n<\/ul><p>Eine umfassende &Uuml;bersicht &uuml;ber weitere h&auml;ufig verwendete Befehle f&uuml;r Images, Container, Volumes und Netzwerke finden Sie in unserem ausf&uuml;hrlichen Docker-Spickzettel.<\/p><h2 class=\"wp-block-heading\" id=\"h-how-to-manage-docker-volumes\">Verwaltung von Docker-Volumes<\/h2><p><strong>Volumes<\/strong> sind der empfohlene Mechanismus zur Persistenz von Daten in Docker. Sie stellen sicher, dass Daten auch dann erhalten bleiben, wenn ein Container gestoppt, neu erstellt oder entfernt wird.<\/p><p>Dies ist insbesondere wichtig, da Container w&auml;hrend ihres Lebenszyklus h&auml;ufig neu gestartet oder ersetzt werden, etwa im Rahmen von Updates oder Wartungsarbeiten. F&uuml;hrt ein Container zustandsbehaftete Anwendungen wie Datenbanken aus, bei denen die Datenintegrit&auml;t entscheidend ist, sind korrekt konfigurierte Volumes unerl&auml;sslich.<\/p><p>Docker unterst&uuml;tzt drei grundlegende Speichermechanismen:<\/p><ul class=\"wp-block-list\">\n<li><strong>Volumes<\/strong>: Persistente Daten werden im von Docker verwalteten Speicherbereich abgelegt, der sich standardm&auml;&szlig;ig unter <strong>\/var\/lib\/docker\/volumes\/<\/strong> auf dem Host befindet.<\/li>\n\n\n\n<li><strong>Bind Mounts<\/strong>: Dateien oder Verzeichnisse des Hostsystems werden direkt in den Container gemountet.<\/li>\n\n\n\n<li><strong>tmpfs-Mounts<\/strong>: Daten werden im Arbeitsspeicher des Hosts gespeichert und beim Stoppen des Containers verworfen.<\/li>\n<\/ul><p>Gehen Sie wie folgt vor, um ein Volume f&uuml;r persistente Daten zu erstellen und zu verwalten:<\/p><ol class=\"wp-block-list\">\n<li>Erstellen Sie ein benanntes Volume. Der folgende Befehl legt beispielsweise ein Volume mit dem Namen <strong>my-database-data<\/strong> an:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker volume create my-database-data<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Starten Sie den Datenbankcontainer und binden Sie das Volume mithilfe des <strong>-v<\/strong>-Flags in das interne Datenverzeichnis des Containers ein:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -d \\\n  --name my-database \\\n  -e MYSQL_ROOT_PASSWORD=securepassword \\\n  -v my-database-data:\/var\/lib\/mysql \\\n  mysql:latest<\/pre><ol start=\"3\" class=\"wp-block-list\">\n<li>&Uuml;berpr&uuml;fen Sie Details und Speicherort des Volumes auf dem Hostsystem mit folgendem Befehl:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker volume inspect my-database-data<\/pre><ol start=\"4\" class=\"wp-block-list\">\n<li>Um nicht verwendete Volumes zu entfernen und Speicherplatz freizugeben, k&ouml;nnen Sie folgenden Befehl ausf&uuml;hren:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker volume prune -a<\/pre><p>Alternativ zur Verwendung einzelner Befehle k&ouml;nnen Volumes direkt in einer Docker-Compose-Konfigurationsdatei deklariert und eingebunden werden. Dies erleichtert die &Uuml;bersicht und Verwaltung, insbesondere bei Anwendungen mit mehreren Diensten.<\/p><p>Die folgende YAML-Konfiguration zeigt ein Beispiel f&uuml;r die Definition eines Volumes und dessen Einbindung in einen Container:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n\n  my-database:\n\n    image: mysql:latest\n\n    container_name: my-database\n\n    environment:\n      MYSQL_ROOT_PASSWORD: securepassword\n\n    volumes:\n      - my-database-data:\/var\/lib\/mysql\n\nvolumes:\n  my-database-data:<\/pre><h2 class=\"wp-block-heading\" id=\"h-how-to-create-a-docker-network\">Erstellen eines Docker-Netzwerks<\/h2><p>Docker-Netzwerke sorgen f&uuml;r Isolation und erm&ouml;glichen gleichzeitig die Kommunikation zwischen Containern sowie mit externen Systemen. Standardm&auml;&szlig;ig werden Container mit einem <strong>Bridge-Netzwerk<\/strong> verbunden. F&uuml;r Multi-Service-Anwendungen empfiehlt es sich jedoch, ein benutzerdefiniertes Bridge-Netzwerk zu erstellen.<\/p><p>Docker-Netzwerke erm&ouml;glichen die Kommunikation zwischen Containern untereinander sowie mit externen Diensten und Systemen.<\/p><p>Standardm&auml;&szlig;ig verbindet Docker einen Container mit dem sogenannten <strong>Standard-Bridge-Netzwerk<\/strong>. Dieses erm&ouml;glicht die grundlegende Kommunikation mit dem Hostsystem, ist jedoch f&uuml;r komplexere Multi-Container-Setups nur eingeschr&auml;nkt geeignet, da es begrenzte Funktionen f&uuml;r die strukturierte Verbindung mehrerer Dienste bietet.<\/p><p>F&uuml;r Multi-Service-Anwendungen gilt es daher als Best Practice, ein benutzerdefiniertes Bridge-Netzwerk zu verwenden. In einem solchen Netzwerk k&ouml;nnen Container &uuml;ber ihre Dienstnamen miteinander kommunizieren. Dies vereinfacht die Serviceerkennung, verbessert die Kontrolle &uuml;ber die Interaktion zwischen Containern und verhindert ungewollte Wechselwirkungen zwischen einzelnen Diensten.<\/p><p>Container lassen sich mit einem benutzerdefinierten Bridge-Netzwerk verbinden, indem die Netzwerkkonfiguration in der Docker-Compose-YAML-Datei definiert wird. Ein Beispiel:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">services:\n\n  my-database:\n\n    image: mysql:latest\n\n    container_name: my-database\n\n    environment:\n      MYSQL_ROOT_PASSWORD: securepassword\n\n    volumes:\n      - my-database-data:\/var\/lib\/mysql\n\n    networks:\n      - my-app-network #create a network<\/pre><p>Alternativ kann ein benutzerdefiniertes Bridge-Netzwerk direkt &uuml;ber die Docker CLI erstellt werden. Dabei ist <strong>my-app-network<\/strong> der frei w&auml;hlbare Name des Netzwerks:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker network create my-app-network<\/pre><p>Anschlie&szlig;end kann ein Container mit dem entsprechenden Netzwerk verbunden werden. Mit dem Flag <strong>&ndash;name<\/strong> wird der Dienstname definiert, w&auml;hrend <strong>&ndash;network<\/strong> angibt, mit welchem Netzwerk der Container verbunden wird:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -d \\\n  --name my-database \\\n  --network my-app-network \\\n  -e MYSQL_ROOT_PASSWORD=securepassword \\\n  -v my-database-data:\/var\/lib\/mysql \\\n  mysql:latest<\/pre><p>Um einen weiteren Container mit demselben Netzwerk zu verbinden, wird der Befehl entsprechend angepasst. Im folgenden Beispiel wird zus&auml;tzlich das <strong>-p<\/strong>-Flag f&uuml;r das Port-Mapping verwendet, um den internen <strong>Port 80<\/strong> des Containers auf <strong>Port 8080<\/strong> des Hostsystems zu exponieren:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker run -d \\\n  --name my-webapp \\\n  --network my-app-network \\\n  -p 8080:80 \\\n  my-web-app-image:latest<\/pre><h2 class=\"wp-block-heading\" id=\"h-troubleshooting-common-docker-issues\">Fehlerbehebung bei h&auml;ufigen Docker-Problemen<\/h2><p>Bei der Arbeit mit Docker treten h&auml;ufig Fehler auf, die verschiedene Ebenen des Systems betreffen k&ouml;nnen, darunter Images, Container, Volumes und Netzwerke. Im Folgenden werden wiederkehrende Problemstellungen erl&auml;utert und geeignete L&ouml;sungsans&auml;tze aufgezeigt.<\/p><h3 class=\"wp-block-heading\" id=\"h-container-exits-immediately\">Container beendet sich unmittelbar nach dem Start<\/h3><p>Container k&ouml;nnen unmittelbar nach dem Start wieder beendet werden, wenn der Hauptprozess, der &uuml;ber <strong>CMD<\/strong> oder <strong>ENTRYPOINT<\/strong> im Dockerfile definiert ist, abgeschlossen wird oder abst&uuml;rzt. Eine h&auml;ufige Ursache ist, dass der im Container definierte Vordergrundprozess beendet wird oder kein dauerhaft laufender Prozess gestartet wird.<\/p><p>M&ouml;gliche L&ouml;sungsans&auml;tze:<\/p><ul class=\"wp-block-list\">\n<li><strong>&Uuml;berpr&uuml;fung der Logs<\/strong>. Verwenden Sie den folgenden Befehl, um die Standardausgabe (stdout) und Fehlerausgabe (stderr) des Containers einzusehen und die Ursache des Abbruchs zu identifizieren: <strong>docker logs &lt;container_name&gt;<\/strong>.<\/li>\n\n\n\n<li><strong>&Uuml;berpr&uuml;fung des Dockerfiles<\/strong>. Stellen Sie sicher, dass der Container einen langlebigen Prozess ausf&uuml;hrt. Pr&uuml;fen Sie, ob im Dockerfile ein geeigneter <strong>CMD<\/strong>&ndash; oder <strong>ENTRYPOINT<\/strong>-Befehl definiert ist. Ein Webserver muss beispielsweise dauerhaft laufen, um Anfragen verarbeiten zu k&ouml;nnen.<\/li>\n\n\n\n<li><strong>Ausf&uuml;hrung im Detached Mode<\/strong>. Handelt es sich um einen langfristig laufenden Dienst, der im Hintergrund betrieben werden soll, stellen Sie sicher, dass Sie beim Ausf&uuml;hren von <strong>docker run<\/strong> oder <strong>docker compose<\/strong> run das Flag <strong>-d<\/strong> bzw. <strong>&ndash;detach<\/strong> verwenden.<\/li>\n<\/ul><h3 class=\"wp-block-heading\" id=\"h-image-layer-caching-issues\">Probleme mit dem Layer-Caching von Images<\/h3><p>Wenn &Auml;nderungen am Dockerfile &ndash; etwa die Aktualisierung einer Paketversion &ndash; keine Wirkung zeigen, liegt dies h&auml;ufig am Layer-Caching von Docker. Dieser Mechanismus verwendet vorhandene Image-Schichten erneut, um den Build-Prozess zu beschleunigen, anstatt alle Schritte neu auszuf&uuml;hren.<\/p><p>Obwohl dies die Effizienz erh&ouml;ht, kann es zu unerwartetem Verhalten f&uuml;hren, wenn &Auml;nderungen an fr&uuml;hen Schichten vorgenommen werden, da nachfolgende Anweisungen weiterhin auf gecachten Layern basieren.<\/p><p>Die einfachste L&ouml;sung besteht darin, den Build-Cache zu umgehen und eine vollst&auml;ndige Neuerstellung zu erzwingen. F&uuml;gen Sie dazu beim Build-Vorgang die Option <strong>&ndash;no-cache<\/strong> hinzu, zum Beispiel:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker build --no-cache -t my-app:latest .<\/pre><p>Beim Installieren von Paketen &uuml;ber ein Dockerfile sollte au&szlig;erdem sichergestellt werden, dass keine veralteten Paketlisten aus dem Cache verwendet werden. In Debian-basierten Distributionen l&auml;sst sich dies erreichen, indem <strong>apt-get update<\/strong> und <strong>apt-get install<\/strong> in einer einzigen <strong>RUN<\/strong>-Instruktion kombiniert werden:<\/p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends<\/pre><h3 class=\"wp-block-heading\" id=\"h-registry-authentication-failure\">Fehler bei der Authentifizierung an einer Registry<\/h3><p>Wenn beim Pushen eines Images in eine Registry &ndash; etwa Docker Hub &ndash; eine Fehlermeldung wie &bdquo;<strong>denied: requested access to the resource is denied<\/strong>&ldquo; erscheint, ist der Docker-CLI-Client nicht korrekt bei der Registry authentifiziert.<\/p><p>Gehen Sie wie folgt vor, um das Problem zu beheben:<\/p><ol class=\"wp-block-list\">\n<li>Melden Sie sich bei der gew&uuml;nschten Registry an. Dabei steht <strong>my-registry.example.com<\/strong> f&uuml;r die Adresse der Registry. F&uuml;r Docker Hub kann dieser Parameter weggelassen werden:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker login my-registry.example.com<\/pre><ol start=\"2\" class=\"wp-block-list\">\n<li>Geben Sie Ihren Benutzernamen und Ihr Passwort ein, sobald Sie dazu aufgefordert werden.<\/li>\n\n\n\n<li>Taggen Sie das lokale Image vor dem Push mit dem korrekten Registry-Host, Repository und Tag:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker tag my-local-image:latest my-registry.example.com\/my-repo\/my-local-image:latest<\/pre><ol start=\"4\" class=\"wp-block-list\">\n<li>Pushen Sie das Image anschlie&szlig;end in die Registry:<\/li>\n<\/ol><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker push my-registry.example.com\/my-repo\/my-local-image:latest<\/pre><h2 class=\"wp-block-heading\" id=\"h-what-are-the-next-steps-to-master-docker\">N&auml;chste Schritte zur Vertiefung Ihrer Docker-Kenntnisse<\/h2><p>Um Docker sicher zu beherrschen und in realen Produktionsszenarien einzusetzen, reicht es nicht aus, lediglich einzelne Container zu starten oder grundlegende Befehle zu verwenden. Die n&auml;chsten Schritte umfassen das Verst&auml;ndnis fortgeschrittener Konzepte zur Bereitstellung, Verwaltung und Skalierung komplexer, hochverf&uuml;gbarer Anwendungen.<\/p><p>Neben Docker Compose ist es essenziell, sich mit leistungsf&auml;higeren Orchestrierungswerkzeugen wie <strong>Docker Swarm<\/strong> oder <strong>Kubernetes<\/strong> vertraut zu machen. Diese erm&ouml;glichen die zentrale Verwaltung, Skalierung und &Uuml;berwachung mehrerer Container innerhalb eines Clusters.<\/p><p>Dar&uuml;ber hinaus sollten Sie Ihr Wissen zu Docker-Netzwerktreibern vertiefen, insbesondere zum Overlay-Netzwerktreiber, der im Docker-Swarm-Modus zur Verbindung mehrerer Hosts innerhalb eines Clusters eingesetzt wird. W&auml;hrend die Vernetzung mehrerer Maschinen &uuml;ber das Standardnetzwerk von Docker komplex und manuell ist, erm&ouml;glichen Overlay-Netzwerke eine skalierbare, zuverl&auml;ssige und weitgehend automatisierte host&uuml;bergreifende Kommunikation.<\/p><p>Abschlie&szlig;end empfiehlt es sich, verschiedene Docker-Anwendungsf&auml;lle gezielt zu analysieren. Dadurch gewinnen Sie ein tieferes Verst&auml;ndnis daf&uuml;r, wie sich Docker in unterschiedlichen Phasen der Entwicklung, des Deployments und des Betriebs effektiv einsetzen l&auml;sst.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Docker ist eine offene Plattform, die entwickelt wurde, um die Entwicklung, Bereitstellung und Ausf&uuml;hrung von Anwendungen zu vereinfachen. Die Softwarebereitstellung wird dabei durch Containerisierung standardisiert &ndash; eine Technologie, bei der Anwendungen gemeinsam mit ihren Abh&auml;ngigkeiten in isolierte, lauff&auml;hige Einheiten, sogenannte Container, verpackt werden. Dadurch wird sichergestellt, dass Anwendungen unabh&auml;ngig von der zugrunde liegenden Umgebung konsistent [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"\/de\/tutorials\/docker-tutorial\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":190,"featured_media":8746,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Docker-Tutorial: Anleitung f\u00fcr Betrieb von Containern","rank_math_description":"Mit der Docker-Plattform k\u00f6nnen Sie Anwendungen mithilfe von Containern einfach entwickeln, ausliefern und ausf\u00fchren.  Hier erfahren Sie mehr \u00fcber Docker.","rank_math_focus_keyword":"docker-tutorial,docker anleitung","footnotes":""},"categories":[25],"tags":[],"class_list":["post-8747","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-vps"],"hreflangs":[],"_links":{"self":[{"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/posts\/8747","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/users\/190"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/comments?post=8747"}],"version-history":[{"count":19,"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/posts\/8747\/revisions"}],"predecessor-version":[{"id":8791,"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/posts\/8747\/revisions\/8791"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/media\/8746"}],"wp:attachment":[{"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/media?parent=8747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/categories?post=8747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hostinger.com\/de\/tutorials\/wp-json\/wp\/v2\/tags?post=8747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}