Docker run vs create

92

Qual é a diferença entre os comandos docker rune docker create?

Eu costumo usar, runmas às vezes na documentação que vejo create.

Docker de --helpconta

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

Isso significa que runé usado quando precisamos passar um comando para um novo contêiner? Qual é o objetivo createentão?

Fred Mériot
fonte

Respostas:

104

Da documentação do docker

O comando docker create cria uma camada de contêiner gravável sobre a imagem especificada e a prepara para executar o comando especificado. A ID do contêiner é então impressa em STDOUT. Isso é semelhante a docker run -d, exceto que o contêiner nunca é iniciado . Você pode então usar o comando docker start para iniciar o contêiner a qualquer momento.

Isto é útil quando você quer criar um recipiente de configuração à frente de tempo para que ele está pronto para começar quando você precisar dele. O status inicial do novo contêiner é criado.

DAXaholic
fonte
2
Enfatizando a semelhança, --run aceita TODOS os mesmos argumentos que --create (com a adição de apenas --detach, --detach-keys e --sig-proxy), consulte docs.docker.com/v17.09 / engine / reference / commandline / run /…
Marvin
113

Tecnicamente, docker run= docker create+ docker start.

sriram926
fonte
40
Na verdade, passei algumas horas aprendendo isso, docker run= docker create+ docker start+ docker attach. Sem attach, o contêiner iniciado é executado em segundo plano
webbower
19

docker createO comando cria um contêiner gravável a partir da imagem e o prepara para execução .

docker runcomando cria o contêiner (o mesmo que docker create) e o inicia .

NetworkMeister
fonte
1
U escreveu "docker run cria o contêiner (o mesmo que docker create) e o executa." <--- definição circular, e você não estabeleceu a diferença entre exec e start, e o que você chama de "executa". (E quando você diz "executa" se olharmos para a sua definição de executar no docker run, isso significa criar e executar, então você acabaria com um número infinito .. então, presumivelmente, você quer dizer algo menos do que isso quando diz "executa" .. mas então você deve distinguir "executa" de exec e iniciar, você quer dizer iniciar e executar ou apenas iniciar). Talvez -d signifique não iniciar nenhum exec. e sem -d é start e exec
barlop
8

As outras respostas têm isso coberto, mas pensei em mostrar as linhas de comando shell equivalentes porque isso deixa muito claro:

$ docker run myimage

é o mesmo que

$ docker start -a $(docker create myimage)

Aqui, docker createé usado para criar um contêiner a partir da imagem nomeada e produz o id do contêiner criado e docker starté usado para iniciar o contêiner com esse id. A -aopção faz com que o terminal seja conectado de forma que o contêiner seja executado em primeiro plano, o que é o comportamento padrão do docker run.

Um contêiner que foi criado, mas nunca iniciado terá um Createdstatus; isso pode ser visto com docker container ls -a.

starfry
fonte
6

Sou novo no docker e comecei a brincar com ele;

Minha opinião é que docker run essencialmente faz o seguinte: (na ordem de ..) docker create , docker start , docker attach , uma vez que ele se conecta imediatamente ao shell ativo depois que você executa o comando 'run' .

Aaronlhe
fonte
1
Acabei de postar um comentário acima sobre isso antes de perceber sua resposta. Eu gostaria de ter visto isso há uma hora ou mais.
webbower
-3

A execução do Docker é basicamente para executar comandos no contêiner.

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

A descrição acima é para a criação de um terminal bash. E nos faça usar comandos bash no contêiner.

Docker create é criar um contêiner a partir de uma imagem Docker.

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

O acima é para criar um docker um contêiner de nome "docker-ubuntu" a partir da imagem "ubuntu"

Venkat Sudharsanam
fonte
1
Você pode fazer isso docker run -it <Container name>sem fazer / bin / bash. Por exemplo, o Ruby executará automaticamente um executável chamado irb. Além disso, você pode executar run -d, que é feito com dockersamples / static-site que não faz logon. Então eu acho que não faz exec, mas apenas começa.
Barlop
com 'docker run', você pode executar se o contêiner já estiver criado e criar, em seguida, executar se não
Sergii Getman