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
execute
?
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
execute
?
Risposte:
Questa è una domanda molto importante e la risposta è molto semplice, ma fondamentale:
docker run IMAGE_ID
e non docker run CONTAINER_ID
docker stop CONTAINER_ID
, è possibile riavviare lo stesso contenitore con il comando docker start CONTAINER_ID
e i dati e le impostazioni saranno gli stessi.docker rm container_id
). D'altra parte, i dati sui volumi sopravvivono alla rimozione del contenitore a meno che l' -v
opzione non sia esplicitamente fornita sulla riga di comando. La posizione del volume sul sistema host può essere ispezionata direttamente. Vedi questo articolo
&
alla fine della run
riga di comando? Ne ho bisogno come servizio continuo (24 ore)
run
esegue un'immaginestart
avvia un contenitore .Il docker run
documento menziona:
Il
docker run
comando 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/create
allora/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 .
-i
ad docker run
un processo interattivo? Voglio dire, la docker run ha bisogno di un'immagine per eseguire un container.
Spiegazione con un esempio:
Considera di avere un'immagine di gioco (iso) nel tuo computer.
Quando si run
monta 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.
La risposta di daniele3004 è già abbastanza buona.
Solo una formula veloce e sporca per le persone come me che si confondono run
e start
di volta in volta:
docker run [...]
= docker pull [...]
+docker start [...]
"...docker run is equivalent to the API /containers/create then /containers/(id)/start.
(fonte: docs.docker.com/engine/reference/commandline/run )
run
comando crea un contenitore dall'immagine e quindi avvia il processo di root su questo contenitore. Eseguirlo con run --rm
flag ti risparmierebbe il problema di rimuovere in seguito l'inutile contenitore morto e ti permetterebbe di ignorare l'esistenza docker start
e il docker remove
tutto.
run
comando fa alcune cose diverse:
docker run --name dname image_name bash -c "whoami"
docker ps
bash -c "whoami"
. Se uno viene eseguito docker run --name dname image_name
senza un comando per eseguire il contenitore andrebbe immediatamente in stato di arresto.docker remove
prima di avviare il contenitore con lo stesso nome.Come rimuovere il contenitore una volta che è stato arrestato automaticamente? Aggiungi un--rm
flag alrun
comando:
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--detached
flag 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
.