Lernpfad
Wenn du dich fragst, wie du ein Docker-Imageausführen kannst, bist du nicht allein. Egal, ob du ein Image aus Docker Hub gezogen oder selbst eines erstellt hast, die Ausführung ist der entscheidende Schritt, um deine Anwendung zum Leben zu erwecken.
Dieses Tutorial ist dein einsteigerfreundlicher Leitfaden für den Befehl docker run
und darüber hinaus. Du wirst es lernen:
- Was Docker-Images und Container eigentlich sind.
- Wie man ein Bild mit verschiedenen Optionen ausführt.
- Und wie du Container stoppst, entfernst und Fehler behebst wie ein Profi.
Am Ende wirst du sicher sein, dass du deine eigenen Container starten kannst und genau weißt, was unter der Haube passiert.
Docker Images und Container verstehen
Bevor wir uns mit den Befehlsbeispielen beschäftigen, wollen wir Docker-Images und Container in einfachen Worten verstehen.
Wenn du mit diesen Begriffen bereits vertraut bist, kannst du den nächsten Abschnitt überspringen!
Was ist ein Docker-Image?
Ein Docker-Image ist eine unveränderliche Blaupause für deine Anwendung. Sie definiert alles, was dein Container braucht: den Code, die Bibliotheken, die Umgebung und die Konfigurationen. Sobald du ein Image hast, kannst du es verwenden, um einen oder hundert Container zu starten. Es bleibt jedes Mal gleich.
Woher kommen also die Bilder? Dockerfile baut sie auf. In einem Dockerfile legst du fest, welches Basis-Image du verwendest, welche Abhängigkeiten du installierst und wie deine App laufen soll.
Sobald dein Dockerfile fertig ist, führst du den Befehl docker build
aus. Dieser Befehl folgt den Schritten in der Datei und verwandelt sie in ein wiederverwendbares Bild.
Was ist ein Docker-Container?
Ein Docker-Container ist die aktive Version eines Docker-Images. So kann deine Anwendung in ihrer eigenen isolierten Umgebung laufen und unabhängig vom Hostsystem ein einheitliches Verhalten gewährleisten.
Es folgt dem Ansatz "einmal bauen, überall ausführen", sodass du die Umgebung nicht jedes Mal manuell einrichten musst.
Bild vs. Container
Die folgende Tabelle vergleicht ein Bild und einen Container nebeneinander:
Bild |
Container |
Ein Image ist ein standardisiertes Paket, das alle Dateien, Binärdateien, Bibliotheken und Konfigurationen enthält, um einen Container auszuführen. |
Eine Laufzeitinstanz eines Bildes. |
Ein Bild ist unveränderlich. Das bedeutet, dass sie sich nicht ändern kann, bis sie wieder aufgebaut wird. |
Der Container ist veränderbar. Du kannst es im laufenden Betrieb bearbeiten, neue Pakete installieren oder Konfigurationsdateien ändern. |
Ein Dockerfile (eine Reihe von Anweisungen, um ein Image zu erstellen) erstellt ein Image. |
Ein Image erstellt einen Container. |
Dein Computer speichert Bilddateien. |
Ein Container läuft in deinem Speicher. |
Wenn du ganz neu in der Containerisierung bist, führt dich unser Kurs Einführung in Docker mit praktischen Beispielen durch die wichtigsten Konzepte.
Der Befehl docker run
Wenn du den Befehl docker run
ausführst, weist du Docker an, einen neuen Container auf Basis eines Images zu erstellen.
Im Klartext heißt das, dass du ein Programm in einer isolierten Umgebung startest. Das Programm kann alles Mögliche sein, eine einfache Webanwendung oder ein ausgewachsener Dienst mit mehreren Prozessen.
Grundlegende Syntax
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
[OPTIONS]
- Zusätzliche Flags, um die Ausführung des Containers anzupassenIMAGE
- Der Name des Docker-Images[COMMAND]
- (Optional) Setzt den Standardbefehl im Bild außer Kraft.[ARG...]
- (Optional) Argumente.
Gemeinsame Flaggen und Optionen
-d
: Getrennter Modus: führt Container im Hintergrund aus-p
: Port Mapping: Um von deinem Browser aus auf einen Dienst (z. B. eine API oder eine Web-App) zuzugreifen, musst du einen Port freigeben. Beispiel:-p 3000:3000
ordnet den Port 3000 deines Computers dem Port 3000 des Containers zu.--name
: Docker gibt dem Container einen Standardnamen, aber du kannst ihm mit diesem Flag einen neuen Namen geben.-v
: Damit hältst du alle Daten getrennt vom Container selbst und stellst sicher, dass sie auch dann erhalten bleiben, wenn der Container angehalten oder gelöscht wird.--rm
: Wenn der Container anhält, wird er mit diesem Flag automatisch gelöscht.-e
: Nutze sie, um Datenbankpasswörter oder API-Schlüssel zu übergeben, ohne sie in deiner App zu kodieren.
Interaktiver Betrieb vs. losgelöste Container
Docker führt Container auf zwei Arten aus: im interaktiven Modus (-it
) und im Detach-Modus (-d
). Jeder Modus hat spezifische Anwendungsfälle, die von deinen Zielen abhängen.
-it
: Interaktiver Modus: Wenn du mit dem Terminal direkt in einem Container arbeiten willst, kannst du das-it
Flag verwenden. Er versetzt den Container in den interaktiven Modus, sodass du Befehle eingeben, die Ausgabe sehen und in Echtzeit arbeiten kannst.-i
: Hält die Eingabe offen, damit du Befehle in den Container eingeben kannst-t
: Bietet dir eine terminalähnliche Oberfläche innerhalb des Containers-d
: Getrennter Modus: Er führt den Container im Hintergrund aus, sodass dein Terminal für andere Aufgaben frei ist.
Mit unserem Docker for Data Science Cheat Sheet hast du die wichtigsten Befehle und Best Practices immer griffbereit.
Docker-Images abrufen und ausführen
Da du nun die Syntax des Befehls docker run
kennst, zeige ich dir in diesem Abschnitt, wie du benutzerdefinierte Bilder erstellst und sie ausführst.
Images von Docker Hub verwenden
Docker Hub ist wie eine Online-Bibliothek für Container-Images. Du kannst vorgefertigte erstellen oder deine hochladen, um sie mit anderen zu teilen. Es unterstützt sowohl öffentliche als auch private Repositories, sodass du Bilder offen mit der Community teilen oder Zugangskontrollen für deine internen Teams einrichten kannst.
Benutzerdefinierte Bilder ausführen
Um ein Docker-Image auszuführen, musst du es zunächst mit einer Dockerdatei erstellen. Dann kannst du sie lokal ausführen oder sie im Docker Hub freigeben.
Lass uns also zuerst ein Dockerfile erstellen. Hier ist ein Beispiel:
# Use official Python base image
FROM python:3.11-slim
# Set working directory in the container
WORKDIR /app
# Copy requirements file and install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the rest of the app code
COPY . .
EXPOSE 5000
# Set default command
CMD ["python", "app.py"]
Was bedeutet das obige Dockerfile?
FROM python:3.11-slim
: Basis-Image mit Python 3.11 VersionWORKDIR /app
: Legt/app
als Arbeitsverzeichnis innerhalb des Containers fest.COPY requirements.txt .
: Verschiebt alle Abhängigkeiten vom lokalen Rechner in das App-Verzeichnis des Containers.RUN pip install --no-cache-dir -r requirements.txt
: Installiert die Abhängigkeiten in der requirements.txt.COPY . .
: Kopiert den Code des aktuellen Arbeitsverzeichnisses (Apps, Konfigurationsdateien und andere) in das App-Verzeichnis des Containers.- CMD ["Python", "app.py"]: führt app.py aus, wenn ein Container von diesem Image gestartet wird.
Schritt 1. Dockerfile erstellen
Schauen wir mal, was passiert, wenn du dieses Dockerfile baust.
- Führe den folgenden Befehl aus:
docker build -t my-python-app .
Hinweis: Damit dieser Befehl funktioniert, solltest du zuerst Docker in deinem System einrichten; dieser Leitfaden hilft dir dabei.
Hier siehst du, was hinter den Kulissen passiert, wenn du den Build-Befehl ausführst:
- Docker liest die Dockerdatei
- Das Python-Basis-Image wird von Docker Hub bezogen
- Das Arbeitsverzeichnis ist auf
/app
eingestellt. - Die
requirements.txt
wird in den Container kopiert. - Abhängigkeiten werden mit
pip install
installiert. - Der Rest deines Codes wird in
/app
kopiert. - Das endgültige Bild ist als
my-python-app
gekennzeichnet.
Schritt 2: Dockerfile ausführen
Sobald dein Bild erstellt ist, kannst du es ausführen:
docker run -p 5000:5000 my-python-app
Hier ist, was passiert, wenn du es ausführst:
- Ein neuer Container aus deinem benutzerdefinierten Image,
my-python-app
, wird erstellt. - Port 5000 auf deinem Rechner wird auf Port 5000 im Container abgebildet (
-p 5000:5000
). - Die
CMD ["python", "
app.py"] wird ausgeführt und führt die App aus. - Der Container läuft aufgrund der Option
-d
im Hintergrund (detached mode).
Jetzt kannst du http://localhost:5000
in deinem Browser besuchen und du wirst etwas wie das Folgende sehen, was bedeutet, dass deine Anwendung läuft:
Wenn du im Bereich des maschinellen Lernens arbeitest,können diese Top-Docker-Images für ML und KIdie Einrichtung deiner Umgebung beschleunigen.
Laufende Bilder mit Konfiguration
Für einige Anwendungen musst du möglicherweise Images mit einer bestimmten Konfiguration ausführen. Hier sind zwei gängige Beispiele.
Persistierende Daten
In Containern werden Daten vorübergehend gespeichert. Sobald du sie löschst, sind die Daten weg. Ein Volume ist eine Möglichkeit, Daten außerhalb des Containers zu speichern, damit sie auch dann erhalten bleiben, wenn der Container entfernt oder neu gestartet wird.
Um ein Volume zu mounten, musst du einen Befehl wie den folgenden ausführen:
docker run -v my-volume:/app/data my-image
Die Daten, die auf /app/data
geschrieben werden, bleiben im Volume gespeichert, auch wenn der Container entfernt wird.
Übergabe von Umgebungsvariablen
Umgebungsvariablen übergeben Konfigurationseinstellungen zur Laufzeit an einen Docker-Container. So kannst du deine Docker-Container anpassen, ohne deine Docker-Images zu verändern.
Du hast zwei Möglichkeiten, Umgebungsvariablen zu übergeben:
- Du kannst Umgebungsvariablen mit dem Parameter
-e
übergeben. Hier ist ein Beispielbefehl:
docker run -e ENV=production -e DEBUG=False my-image
- Du kannst eine
.env
Datei mit allen Umgebungsvariablen erstellen und sie an den Befehl übergeben. Hier ist ein Beispiel:
docker run --env-file .env my-image
Beispielhafte .env
Datei:
ENV=staging
DEBUG=True
SECRET_KEY=mysecret
Verwaltung von laufenden Containern
Sobald ein Container läuft, kannst du ihn ansehen, anhalten und darauf zugreifen. Schauen wir uns an, wie das geht.
Aktive Container anzeigen
Um alle aktiven Docker-Container aufzulisten, die auf deinem System laufen, führe den Befehl docker ps
oder docker container ls
aus. Dieser Befehl zeigt die Container-ID, das Bild, den Befehl, den Port, den Status und andere Details an.
docker ps
# or
docker container ls
Um alle Container einzuschließen - nicht nur die laufenden -, z. B. solche, die beendet oder erstellt, aber nicht gestartet wurden, verwende das Flag -a
:
docker ps -a
Um nur den zuletzt erstellten Container anzuzeigen, verwende das Flag -l
(last):
docker ps -l
Wenn du alle Container nach Erstellungszeitpunkt sortiert sehen willst, wobei die neuesten zuerst aufgelistet werden, führe aus:
docker ps -a --sort=created
Anhalten und Entfernen von Containern
Um einen bestimmten laufenden Container anzuhalten, verwendest du den Befehl docker stop
, gefolgt von der Container-ID oder dem Namen:
docker stop <container_id_or_name>
Um alle laufenden Container zu stoppen, verwende:
docker stop $(docker ps -q)
$(docker ps -q)
gibt eine Liste mit allen laufenden Container-IDs zurück.
Sobald ein Container gestoppt ist, kannst du ihn wieder entfernen:
docker rm <container_id_or_name>
Um alle gestoppten Container zu entfernen, führst du aus:
docker container prune
Wenn du noch weiter gehen und ungenutzte Container, Volumes, Netzwerke und Images entfernen willst, schau dir den Docker prune Guide an.
Zugriff auf Containerprotokolle und test-shell
- docker logs - Der Befehl
docker logs
ruft im Stapelverfahren Logs ab, die zum Zeitpunkt der Ausführung vorhanden sind. - docker exec -
docker exec
ermöglicht es dir, einen neuen Befehl innerhalb eines laufenden Containers auszuführen, ohne ihn anzuhalten oder neu zu starten. Stell dir vor, du öffnest ein neues Terminal innerhalb deines Containers, in dem du herumstöbern, Skripte ausführen, Logs prüfen oder Fehler beheben kannst. - docker attach -
docker attach
verbindet dein Terminal direkt mit dem Hauptprozess eines laufenden Containers. Das bedeutet, dass du die Live-Ausgaben des Containers (Logs, Prompts usw.) sehen und sogar mit ihm interagieren kannst, wenn der Prozess Eingaben annimmt.
Fehlersuche bei allgemeinen Problemen
Einfache Lösungen für häufige Probleme. Hier sind einige häufige Fehler beim Ausführen von Docker-Images und wie du sie angehen kannst.
Fehler 1: "Fehlerantwort vom Daemon: pull access denied for alpine-python, repository does not exist or may require 'docker login': denied: requested access to the resource is denied."
- Was das bedeutet: Docker hat versucht, ein Image zu ziehen, in diesem Fall das
alpine-python
Image von Docker Hub, aber das Image existiert entweder nicht oder ist privat, und du bist nicht authentifiziert. - Wie man das behebt:
- Überprüfe den Image-Namen und das Tag auf Docker Hub.
- Wenn es sich um ein privates Image handelt, führe
docker login
aus, um dich zu authentifizieren. - Vergewissere dich, dass das Bild vorhanden ist, wenn du es aus einer benutzerdefinierten Registry ziehst.
Fehler 2: "No such image found: <image-name>:<tag>"
- Was das bedeutet: Du hast versucht, ein Bild lokal auszuführen oder zu markieren, aber das Bild (oder die angegebene Markierung) ist auf deinem System nicht verfügbar.
- Wie man das behebt:
- Verwende
docker images
, umdie verfügbaren Bilder zu prüfen. - Ziehe das Bild explizit:
- Verwende
docker pull <image-name>:<tag>
Fehler 3: "manifest for <image>:<tag> not found: manifest unknown: Das genannte Manifest ist der Registratur nicht bekannt."
- Was das bedeutet: Dieser Fehler tritt wahrscheinlich auf, wenn das angegebene Bild oder Tag nicht existiert.
- Mögliche Abhilfe: Diese Tipps sollten die meisten Fehler beheben:
- Überprüfe das richtige Bild und den richtigen Tag-Namen.
- Beziehe dich auf die Tags des Images auf Docker Hub oder deiner eigenen Registry.
- Verwende
docker pull
, um eine gültige Version zu erhalten.:
- Wenn du lokal baust, verwende eine korrekte
Dockerfile
und baue das Image mit:
docker build -t <image>:<tag> .
Portkonflikte und Bindungsausfälle
Portkonflikte entstehen, wenn mehrere Container oder ein Container und eine andere Anwendung versuchen, auf denselben Port zuzugreifen.
- Wie man das behebt:
- Verwende einen anderen Host-Port, wenn du deinen Container ausführst:
docker run -p 8081:80 <image>
- Beende den Dienst, der derzeit den Port benutzt.
- Identifiziere, was einen Port (z.B. 8080) mit benutzt:
lsof -i :8080
Fazit
Das Ausführen eines Docker-Images ist einer der wichtigsten Schritte bei der Verwendung von Containern, egal ob du einen einfachen Webserver oder eine komplexe Anwendung bereitstellst. Mit nur wenigen Befehlen wie docker run
, docker ps
und docker stop
bist du jetzt in der Lage, Container zu starten, zu verwalten und Fehler zu beheben.
Wenn du bereit bist, weiter zu gehen, kannst du dein eigenes Image mit einem Dockerfile erstellen, fortgeschrittene docker run
Flags erkunden oder lernen, wie du mehrere Container mit Docker Compose verwaltest.
Schau dir diese Kurse an, um deine Docker-Reise fortzusetzen:
- Docker für Fortgeschrittene: Lerne fortgeschrittene Bildverwaltung, Volumes und Multi-Container-Anwendungen.
- Konzepte zur Containerisierung und Virtualisierung: Verstehe die Theorie hinter Containern und wie sie sich von virtuellen Maschinen unterscheiden.
- Containerisierung und Virtualisierung mit Docker und Kubernetes: Ein kompletter Lernpfad, um Docker zu meistern und mit Kubernetes zu beginnen.
Docker und Kubernetes beherrschen
FAQs
Kann ich mehrere Container mit demselben Docker-Image ausführen?
Ja, du kannst mehrere Container mit demselben Image betreiben. Jeder Container ist isoliert und kann seine eigenen Einstellungen, Ports und Umgebungsvariablen haben.
Wie kann ich Geheimnisse oder API-Schlüssel sicher an einen Docker-Container weitergeben?
Verwende das -e
Flag, um Umgebungsvariablen zu setzen oder verwende eine .env
Datei und --env-file
, um Geheimnisse zur Laufzeit zu übergeben, ohne sie fest zu codieren.
Wie kann ich ein Docker-Image im Hintergrund ausführen?
Verwende das -d
Flag mit docker run
, um den Container im losgelösten Modus zu starten, damit das Terminal für andere Befehle verfügbar bleibt.
Was ist der Unterschied zwischen Docker exec und Docker attach?
docker exec
öffnet eine neue Shell-Sitzung innerhalb des Containers, während docker attach
sich mit dem Hauptprozess des Containers und dessen Live-Ausgabe verbindet.
Warum erhalte ich "pull access denied", wenn ich ein Image ausführe?
Das bedeutet normalerweise, dass das Bild privat oder falsch geschrieben ist. Überprüfe den Namen, das Tag und stelle sicher, dass du mit docker login
in Docker Hub eingeloggt bist.
Wie halte ich Daten in einem Container fest, nachdem er angehalten wurde?
Verwende das -v
Flag, um ein Volume zu mounten. Dadurch wird sichergestellt, dass die Daten außerhalb des Containers gespeichert werden und auch nach dem Entfernen des Containers intakt bleiben.
Wie kann ich einen Container für Entwicklungszwecke am besten betreiben?
Verwende die -it
Flags für den interaktiven Modus, zusammen mit Volume Mounting und Umgebungsvariablen, um eine lokale Entwicklungsumgebung zu simulieren.
Wie kann ich herausfinden, welche Ports auf meinem Rechner in Konflikt stehen?
Verwende lsof -i :
, um herauszufinden, welcher Prozess einen bestimmten Port verwendet, und halte ihn dann entweder an oder verwende einen anderen Host-Port für deinen Container.
Wie kann ich die Logs eines laufenden Docker-Containers einsehen?
Mit dem Befehl docker logs
kannst du die Logs der Standardausgabe und der Fehlerströme des Containers abrufen und überprüfen.
Srujana ist freiberufliche Tech-Autorin und hat einen vierjährigen Abschluss in Informatik. Das Schreiben über verschiedene Themen wie Data Science, Cloud Computing, Entwicklung, Programmierung, Sicherheit und viele andere ist für sie selbstverständlich. Sie liebt klassische Literatur und erkundet gerne neue Reiseziele.