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.