Docker ejecutar vs crear

93

¿Cuál es la diferencia entre los comandos docker runy docker create?

Normalmente lo uso runpero a veces veo en la documentación create.

Docker --helpdice

create    Create a new container
run       Run a command in a new container

¿Significa que runse usa cuando necesitamos pasar un comando a un nuevo contenedor? ¿Cuál es el objetivo createentonces?

Fred Mériot
fuente

Respuestas:

105

De la documentación de Docker

El comando docker create crea una capa de contenedor en la que se puede escribir sobre la imagen especificada y la prepara para ejecutar el comando especificado. Luego, el ID del contenedor se imprime en STDOUT. Esto es similar a docker run -d, excepto que el contenedor nunca se inicia . Luego, puede usar el comando de inicio de la ventana acoplable para iniciar el contenedor en cualquier momento.

Esto es útil cuando se desea configurar un contenedor de configuración antes de tiempo por lo que está listo para empezar cuando lo necesite. Se crea el estado inicial del nuevo contenedor.

DAXaholic
fuente
2
Al enfatizar la similitud, --run acepta TODOS los mismos argumentos que --create (con la adición de solo --detach, --detach-keys y --sig-proxy), consulte docs.docker.com/v17.09 / engine / reference / commandline / run /…
Marvin
117

Técnicamente, docker run= docker create+ docker start.

sriram926
fuente
42
En realidad, y acabo de pasar un par de horas aprendiendo esto, docker run= docker create+ docker start+ docker attach. Sin attach, el contenedor iniciado se ejecuta en segundo plano
webbower
19

docker createcomando crea un contenedor de escritura a partir de la imagen y lo prepara para su ejecución .

docker runcomando crea el contenedor (igual que docker create) y lo inicia .

NetworkMeister
fuente
1
U escribió "Docker Run crea el contenedor (igual que Docker Create) y lo ejecuta". <--- definición circular, y no ha establecido la diferencia entre exec y start, y lo que denomina "ejecutarlo". (Y cuando dices "ejecutarlo" si miramos tu definición de ejecutar en la ventana acoplable ejecutar, significa crear y ejecutar, por lo que terminarías con un número infinito ... así que presumiblemente te refieres a algo menos que eso cuando dices "lo ejecuta" ... pero luego debe distinguir "ejecuta" de exec y start, ¿quiere decir start y exec o simplemente start). Quizás -d significa no iniciar ningún ejecutivo. y sin -d es start y exec
barlop
8

Las otras respuestas tienen esto cubierto, pero pensé que mostraría las líneas de comando de shell equivalentes porque lo deja muy claro:

$ docker run myimage

es lo mismo que

$ docker start -a $(docker create myimage)

Aquí, docker createse usa para crear un contenedor a partir de la imagen nombrada y genera la identificación del contenedor creada y docker startse usa para iniciar el contenedor con esa identificación. La -aopción hace que la terminal se conecte para que el contenedor se ejecute en primer plano, que es el comportamiento predeterminado de docker run.

Un contenedor que se ha creado pero nunca se inició tendrá un Createdestado; esto se puede ver con docker container ls -a.

Starfry
fuente
6

Soy nuevo en Docker y acabo de empezar a jugar con él;

Mi opinión es que docker run esencialmente hace lo siguiente: (en el orden de ..) docker create , docker start , docker attach , ya que se conecta inmediatamente al shell activo después de ejecutar el comando 'ejecutar' .

Aaronlhe
fuente
1
Acabo de publicar un comentario sobre esto antes de que me di cuenta de su respuesta. Ojalá hubiera visto esto hace aproximadamente una hora.
webbower
-3

La ejecución de Docker es básicamente para ejecutar comandos en el contenedor.

docker run -it <Container Name> /bin/bash

Lo anterior es para crear una terminal bash. Y haznos usar comandos bash en el contenedor.

Docker create consiste en crear un contenedor a partir de una imagen de Docker.

docker create -d /var/lib:/var/lib --name docker-ubuntu ubuntu

Lo anterior es para crear una ventana acoplable un contenedor con el nombre "docker-ubuntu" a partir de la imagen "ubuntu"

Venkat Sudharsanam
fuente
1
Puede docker run -it <Container name>prescindir de hacer / bin / bash. Por ejemplo, ruby ​​one ejecutará automáticamente un ejecutable llamado irb. Además, puede ejecutar -d, eso se hace con dockersamples / static-site que no inicia sesión. Así que creo que no funciona como ejecutivo, pero simplemente lo inicia.
barlop
con 'docker run' puede ejecutar si el contenedor ya está creado y crear, luego ejecutar si no
Sergii Getman