Unterschied zwischen Ausführen und Starten eines Docker-Containers


307

In der Praxis mache ich Folgendes, um einen Container zu starten :

docker run a8asd8f9asdf0

Wenn dies der Fall ist, was bewirkt:

docker start

machen?

Im Handbuch steht

Starten Sie einen oder mehrere gestoppte Container


101
run = create + start
Fumisky Wells

4
Ich wünschte, das OP hätte auch "Execute" enthalten
Monica Heddneck


@MonicaHeddneck Gibt es Docker execute?
Koray Tugay

Sie verwenden Start für einen Container, wenn Sie diesen Container zuvor gestoppt haben. Sie verwenden laufen auf ein Bild, wenn Sie ealier hatte entfernt einen Behälter dieses Bildes. Dies ist die grundlegende Verwendung, denke ich.
CodeSlave

Antworten:


350

Dies ist eine sehr wichtige Frage und die Antwort ist sehr einfach, aber grundlegend:

  1. Ausführen: Erstellen Sie einen neuen Container eines Bildes und führen Sie den Container aus. Sie können N Klone desselben Bildes erstellen. Der Befehl lautet: docker run IMAGE_ID und nicht docker run CONTAINER_ID

Geben Sie hier die Bildbeschreibung ein

  1. Start: Starten Sie einen zuvor gestoppten Container. Wenn Sie beispielsweise eine Datenbank mit dem Befehl gestoppt haben docker stop CONTAINER_ID, können Sie denselben Container mit dem Befehl neu starten docker start CONTAINER_ID, und die Daten und Einstellungen sind identisch.

Geben Sie hier die Bildbeschreibung ein


1
Muss für den gestoppten Container ein Volume erstellt werden, damit die Daten erhalten bleiben?
Logan Phillips

@LoganPhillips Der Lebenszyklusunterschied zwischen Dateien, die in die Standard- Union- Dateisystemschicht des Containers geschrieben wurden, und Dateien, die in Volumes geschrieben wurden, ist: Die Daten der Union-Dateisystemschicht des Containers gehen beim Entfernen des Containers ( docker rm container_id) immer verloren . Auf der anderen Seite überleben Volumendaten das Entfernen des Containers, sofern die -vOption nicht explizit in der Befehlszeile angegeben ist. Der Volume-Standort auf dem Host-System kann direkt überprüft werden. Siehe diesen Artikel
Stphane

Über den Prozess & am Ende der runKommandozeile benötigen ? Ich brauche es als Countinous (24 Stunden) Service
Peter Krauss

Was ist dann der Zweck von "Docker erstellen"? Wie / wann würde das verwendet werden?
Joseph Gagnon

100
  • runführt ein Bild aus
  • startstartet einen Container .

Der docker runArzt erwähnt:

Der docker runBefehl erstellt zuerst eine beschreibbare Containerebene über dem angegebenen Bild und startet sie dann mit dem angegebenen Befehl.

Das heißt, Andockfensters Lauf an die API entspricht /containers/createdann /containers/(id)/start.

Sie führen keinen vorhandenen Container aus, sondern führen Docker aus (seit Docker 1.3) .
Sie können einen verlassenen Container neu starten .


@Tarik nicht müssen Sie hinzufügen , -ium docker runeinen interaktiven Prozess? Ich meine, Docker Run benötigt ein Image, um einen Container auszuführen.
VonC

10
Jemand scheint einen Raum zu haben, um eine ausführlichere Antwort zu schreiben. Die Antwort sieht nicht sehr erklärend aus.
Qartal

4
Die nächste Frage für mich war, was der Unterschied zwischen einem Container und einem Bild ist. Stackoverflow.com/questions/21498832/…
Alex Punnen

18

Erklärung mit einem Beispiel:

Angenommen, Sie haben ein Spielbild (ISO) auf Ihrem Computer.

Wenn Sie run(Ihr Image als virtuelles Laufwerk bereitstellen), wird ein virtuelles Laufwerk mit allen Spielinhalten auf dem virtuellen Laufwerk erstellt und die Spielinstallationsdatei wird automatisch gestartet. [Ausführen Ihres Docker-Images - Erstellen eines Containers und anschließendes Starten.]

Wenn Sie es jedoch stop(ähnlich wie Docker) stoppen, ist das virtuelle Laufwerk weiterhin vorhanden, stoppt jedoch alle Prozesse. [Da der Container existiert, bis er nicht gelöscht wird]

Und wenn Sie dies tun start(ähnlich wie beim Docker-Start), starten die Spieledateien vom virtuellen Laufwerk aus ihre Ausführung. [Starten des vorhandenen Containers]

In diesem Beispiel - Das Spiel-Image ist Ihr Docker-Image und das virtuelle Laufwerk ist Ihr Container.


8

Die Antwort von daniele3004 ist schon ziemlich gut.

Nur eine schnelle und schmutzige Formel für Leute wie ich, mischt runund startvon Zeit zu Zeit:

docker run [...]= docker pull [...]+docker start [...]


2
Das ist nicht ganz richtig. Laut dem offiziellen Dokument "...docker run is equivalent to the API /containers/create then /containers/(id)/start.(Quelle: docs.docker.com/engine/reference/commandline/run )
sshh

2

runDer Befehl erstellt einen Container aus dem Image und startet dann den Root-Prozess für diesen Container. Wenn Sie es mit run --rmFlag ausführen, sparen Sie sich die Mühe, den nutzlosen toten Container anschließend zu entfernen, und können die Existenz von docker startund docker removeinsgesamt ignorieren .

Geben Sie hier die Bildbeschreibung ein

run Befehl macht ein paar verschiedene Dinge:

docker run --name dname image_name bash -c "whoami"
  1. Erstellt einen Container aus dem Bild. Zu diesem Zeitpunkt würde der Container eine ID haben, könnte einen Namen haben, wenn einer angegeben wird, wird in angezeigtdocker ps
  2. Startet / führt den Root-Prozess des Containers aus. Im obigen Code würde das ausgeführt werden bash -c "whoami". Wenn man docker run --name dname image_nameohne einen Befehl zum Ausführen des Containers läuft , wird der Container sofort gestoppt.
  3. Sobald der Root-Prozess abgeschlossen ist, wird der Container gestoppt. Zu diesem Zeitpunkt ist es so ziemlich nutzlos. Man kann nichts mehr ausführen oder den Container wiederbeleben. Grundsätzlich gibt es zwei Möglichkeiten, den gestoppten Container zu verlassen: Entfernen Sie den Container oder erstellen Sie einen Prüfpunkt (dh ein Bild) aus dem gestoppten Container, um etwas anderes auszuführen. Man muss laufen, docker removebevor man einen Container unter demselben Namen startet.

Wie entferne ich einen Behälter, wenn er automatisch gestoppt wird? Fügen Sie--rmdemrunBefehleinFlag hinzu:

docker run --rm --name dname image_name bash -c "whoami"

Wie führe ich mehrere Befehle in einem einzigen Container aus? Indem verhindert wird, dass dieser Wurzelprozess stirbt. Dies kann erreicht werden, indem ein nutzloser Befehl beim Start mit dem--detachedFlag ausgeführt wird und dann "Ausführen" verwendet wird, um die tatsächlichen Befehle auszuführen:

docker run --rm -d --name dname image_name tail -f /dev/null
docker exec dname bash -c "whoami"
docker exec dname bash -c "echo 'Nnice'"

Warum brauchen wir docker stopdann? Um diesen verweilenden Container zu stoppen, den wir im vorherigen Snippet mit dem Endlosbefehl gestartet habentail -f /dev/null.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.