Differenza tra esecuzione e avvio di un contenitore Docker


307

In pratica per avviare un container faccio:

docker run a8asd8f9asdf0

In tal caso, cosa fa:

docker start

fare?

Nel manuale dice

Avviare uno o più contenitori arrestati


101
run = create + start
Fumisky Wells,

4
Vorrei che anche l'OP avesse incluso "esegui"
Monica Heddneck,


@MonicaHeddneck C'è una finestra mobile execute?
Koray Tugay,

Si utilizza start to a container, se in precedenza lo si era arrestato . Si utilizza run to a image, se prima si era rimosso un contenitore di questa immagine. Questo è l'uso di base penso.
CodeSlave

Risposte:


351

Questa è una domanda molto importante e la risposta è molto semplice, ma fondamentale:

  1. Esegui: crea un nuovo contenitore di un'immagine ed esegue il contenitore. È possibile creare N cloni della stessa immagine. Il comando è: docker run IMAGE_ID e non docker run CONTAINER_ID

inserisci qui la descrizione dell'immagine

  1. Avvia: avvia un contenitore precedentemente arrestato. Ad esempio, se si fosse arrestato un database con il comando docker stop CONTAINER_ID, è possibile riavviare lo stesso contenitore con il comando docker start CONTAINER_IDe i dati e le impostazioni saranno gli stessi.

inserisci qui la descrizione dell'immagine


1
È necessario creare un volume per il contenitore arrestato affinché i dati persistano?
Logan Phillips,

@LoganPhillips La differenza del ciclo di vita tra i file scritti nel livello del file system unione predefinito del contenitore e i file scritti nei volumi è: i dati del livello del file system unione del contenitore vengono sempre persi quando si rimuove il contenitore ( docker rm container_id). D'altra parte, i dati sui volumi sopravvivono alla rimozione del contenitore a meno che l' -vopzione non sia esplicitamente fornita sulla riga di comando. La posizione del volume sul sistema host può essere ispezionata direttamente. Vedi questo articolo
Stphane,

A proposito del processo, è necessario & alla fine della runriga di comando? Ne ho bisogno come servizio continuo (24 ore)
Peter Krauss,

Allora, qual è lo scopo di "docker create"? Come / quando sarebbe usato?
Joseph Gagnon,

100
  • runesegue un'immagine
  • startavvia un contenitore .

Il docker rundocumento menziona:

Il docker runcomando crea prima un livello contenitore scrivibile sull'immagine specificata, quindi lo avvia utilizzando il comando specificato.

Cioè, l' esecuzione della finestra mobile è equivalente all'API /containers/createallora /containers/(id)/start.

Non si esegue un contenitore esistente, si esegue la finestra mobile ad esso (dalla finestra mobile 1.3) .
È possibile riavviare un contenitore uscito .


Non @Tarik avete aggiungere -iad docker runun processo interattivo? Voglio dire, la docker run ha bisogno di un'immagine per eseguire un container.
VonC,

10
Sembra che ci sia spazio per qualcuno per scrivere una risposta più elaborata. La risposta non sembra molto esplicativa.
qartal

4
La prossima domanda per me era che cosa è-the-differenze-tra-un-contenitore e-un-immagine stackoverflow.com/questions/21498832/...
Alex Punnen

18

Spiegazione con un esempio:

Considera di avere un'immagine di gioco (iso) nel tuo computer.

Quando si runmonta l'immagine come unità virtuale, viene creata un'unità virtuale con tutti i contenuti del gioco nell'unità virtuale e il file di installazione del gioco viene avviato automaticamente. [Esecuzione dell'immagine docker: creazione di un contenitore e avvio.]

Ma quando tu stop(simile a docker stop), l'unità virtuale esiste ancora ma interrompe tutti i processi. [Poiché il contenitore esiste fino a quando non viene eliminato]

E quando lo fai start(simile all'avvio della finestra mobile), dall'unità virtuale i file dei giochi iniziano la sua esecuzione. [avvio del contenitore esistente]

In questo esempio - L'immagine del gioco è l'immagine Docker e l'unità virtuale è il tuo contenitore.


8

La risposta di daniele3004 è già abbastanza buona.

Solo una formula veloce e sporca per le persone come me che si confondono rune startdi volta in volta:

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


2
Questo non è del tutto vero. Secondo il documento ufficiale, "...docker run is equivalent to the API /containers/create then /containers/(id)/start.(fonte: docs.docker.com/engine/reference/commandline/run )
sshh

2

runcomando crea un contenitore dall'immagine e quindi avvia il processo di root su questo contenitore. Eseguirlo con run --rmflag ti risparmierebbe il problema di rimuovere in seguito l'inutile contenitore morto e ti permetterebbe di ignorare l'esistenza docker starte il docker removetutto.

inserisci qui la descrizione dell'immagine

run comando fa alcune cose diverse:

docker run --name dname image_name bash -c "whoami"
  1. Crea un contenitore dall'immagine. A questo punto il contenitore avrebbe un ID, potrebbe avere un nome se ne viene fornito uno, verrà visualizzato indocker ps
  2. Avvia / esegue il processo di root del contenitore. Nel codice sopra che verrebbe eseguito bash -c "whoami". Se uno viene eseguito docker run --name dname image_namesenza un comando per eseguire il contenitore andrebbe immediatamente in stato di arresto.
  3. Una volta terminato il processo di root, il contenitore viene arrestato. A questo punto, è praticamente inutile. Non si può più eseguire nulla o resuscitare il contenitore. Esistono fondamentalmente 2 modi per uscire dallo stato di arresto: rimuovere il contenitore o creare un checkpoint (ad esempio un'immagine) dal contenitore di arresto per eseguire qualcos'altro. È necessario eseguire docker removeprima di avviare il contenitore con lo stesso nome.

Come rimuovere il contenitore una volta che è stato arrestato automaticamente? Aggiungi un--rmflag alruncomando:

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

Come eseguire più comandi in un singolo contenitore? Impedendo la morte del processo di root. Questo può essere fatto eseguendo alcuni comandi inutili all'inizio con--detachedflag e quindi usando "esegui" per eseguire i comandi effettivi:

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'"

Perché allora abbiamo bisogno docker stop? Per fermare questo contenitore persistente che abbiamo lanciato nello snippet precedente con il comando infinitotail -f /dev/null.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.