Différence entre l'exécution et le démarrage d'un conteneur Docker

307

En pratique, pour démarrer un conteneur, je fais:

docker run a8asd8f9asdf0

Si tel est le cas, que signifie:

docker start

faire?

Dans le manuel, il est dit

Démarrer un ou plusieurs conteneurs arrêtés

mskw
la source
101
run = create + start
Fumisky Wells
4
Je souhaite que l'OP ait également inclus «exécuter» également
Monica Heddneck
Pourrait
Shubham
@MonicaHeddneck Il y a docker execute?
Koray Tugay
Vous utilisez démarrer vers un conteneur, si vous aviez précédemment arrêté ce conteneur. Vous utilisez exécuter sur une image, si vous avez déjà retiré un conteneur de cette image. C'est l'usage de base je pense.
CodeSlave

Réponses:

351

C'est une question très importante et la réponse est très simple, mais fondamentale:

  1. Exécuter: créez un nouveau conteneur d'une image et exécutez le conteneur. Vous pouvez créer N clones de la même image. La commande est: docker run IMAGE_ID et non docker run CONTAINER_ID

entrez la description de l'image ici

  1. Démarrer: lancer un conteneur précédemment arrêté. Par exemple, si vous avez arrêté une base de données avec la commande docker stop CONTAINER_ID, vous pouvez relancer le même conteneur avec la commande docker start CONTAINER_ID, et les données et les paramètres seront les mêmes.

entrez la description de l'image ici

daniele3004
la source
1
Un volume doit-il être créé pour le conteneur arrêté pour que les données persistent?
Logan Phillips
@LoganPhillips La différence de cycle de vie entre les fichiers écrits dans la couche de système de fichiers union par défaut du conteneur et les fichiers écrits dans les volumes est la suivante: les données de la couche de système de fichiers union du conteneur sont toujours perdues lors de la suppression du conteneur ( docker rm container_id). D'autre part, les données de volumes survivent à la suppression du conteneur, sauf si l' -voption est explicitement fournie sur la ligne de commande. L'emplacement du volume sur le système hôte peut être directement inspecté. Voir cet article
Stéphane
A propos du processus, besoin & à la fin de la runligne de commande? J'en ai besoin en tant que service permanent (24 heures)
Peter Krauss
Alors, quel est le but de "docker créer"? Comment / quand cela serait-il utilisé?
Joseph Gagnon
100
  • runexécute une image
  • startdémarre un conteneur .

Le docker rundoc mentionne:

La docker runcommande crée d' abord une couche conteneur inscriptible sur l'image spécifiée, puis la démarre à l'aide de la commande spécifiée.

C'est, docker terme est équivalent à l'API /containers/createalors /containers/(id)/start.

Vous n'exécutez pas un conteneur existant, vous l'exécutez avec docker (depuis docker 1.3) .
Vous pouvez redémarrer un conteneur quitté .

VonC
la source
@Tarik n'avez-vous pas à ajouter -ià docker runun processus interactif? Je veux dire, docker run a besoin d'une image pour exécuter un conteneur.
VonC
10
Il semble que quelqu'un puisse écrire une réponse plus élaborée. La réponse ne semble pas très explicative.
qartal
4
La prochaine question pour moi était quelle est la différence entre un conteneur et une image stackoverflow.com/questions/21498832/…
Alex Punnen
18

Explication avec un exemple:

Considérez que vous avez une image de jeu (iso) sur votre ordinateur.

Lorsque vous run(montez votre image en tant que lecteur virtuel), un lecteur virtuel est créé avec tout le contenu du jeu dans le lecteur virtuel et le fichier d'installation du jeu est automatiquement lancé. [Exécution de votre image Docker - création d'un conteneur, puis démarrage.]

Mais lorsque vous stop(semblable à l'arrêt Docker), le lecteur virtuel existe toujours mais arrête tous les processus. [Comme le conteneur existe jusqu'à ce qu'il ne soit pas supprimé]

Et lorsque vous le faites start(similaire à Docker Start), à partir du lecteur virtuel, les fichiers de jeux commencent son exécution. [démarrage du conteneur existant]

Dans cet exemple - L'image du jeu est votre image Docker et le lecteur virtuel est votre conteneur.

Apb
la source
8

La réponse de daniele3004 est déjà assez bonne.

Juste une formule rapide et sale pour des gens comme moi qui se mélangent runet startde temps en temps:

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

Bowen
la source
2
Ce n'est pas tout à fait vrai. Selon le doc officiel, "...docker run is equivalent to the API /containers/create then /containers/(id)/start.(source: docs.docker.com/engine/reference/commandline/run )
sshh
2

runcrée un conteneur à partir de l'image, puis démarre le processus racine sur ce conteneur. L'exécuter avec un run --rmdrapeau vous éviterait de retirer le conteneur mort inutile par la suite et vous permettrait d'ignorer l'existence de docker startet docker removetout à fait.

entrez la description de l'image ici

run commande fait quelques choses différentes:

docker run --name dname image_name bash -c "whoami"
  1. Crée un conteneur à partir de l'image. À ce stade, le conteneur aurait un identifiant, pourrait avoir un nom s'il est donné, apparaîtra dansdocker ps
  2. Démarre / exécute le processus racine du conteneur. Dans le code ci-dessus, cela s'exécuterait bash -c "whoami". Si l'on s'exécute docker run --name dname image_namesans commande pour exécuter le conteneur, il se mettra immédiatement à l'arrêt.
  3. Une fois le processus racine terminé, le conteneur est arrêté. À ce stade, c'est à peu près inutile. On ne peut plus rien exécuter ou ressusciter le conteneur. Il existe essentiellement 2 façons de sortir de l'état arrêté: supprimer le conteneur ou créer un point de contrôle (c'est-à-dire une image) à partir du conteneur arrêté pour exécuter autre chose. Il faut exécuter docker removeavant de lancer le conteneur sous le même nom.

Comment retirer le conteneur une fois qu'il est arrêté automatiquement?Ajoutez un --rmindicateur à la runcommande:

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

Comment exécuter plusieurs commandes dans un seul conteneur?En empêchant ce processus racine de mourir. Cela peut être fait en exécutant une commande inutile au début avec --detachedflag puis en utilisant "execute" pour exécuter des commandes réelles:

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

Pourquoi avons-nous besoin docker stopalors? Pour arrêter ce conteneur persistant que nous avons lancé dans l'extrait précédent avec la commande sans fintail -f /dev/null.

y.selivonchyk
la source