Diferença entre executar e iniciar um contêiner do Docker

307

Na prática, para iniciar um contêiner, eu faço:

docker run a8asd8f9asdf0

Se for esse o caso, o que faz:

docker start

Faz?

No manual diz

Iniciar um ou mais contêineres parados

mskw
fonte
101
executar = criar + começar
Fumisky Wells
4
Eu gostaria que o OP também incluísse 'execute' também
Monica Heddneck 15/11/19
Pode ser útil: chat.stackoverflow.com/transcript/76919
Shubham
@MonicaHeddneck Existe janela de encaixe execute?
Koray Tugay
Você usa start to a container, se você já havia parado esse container. Você usa run para uma imagem, se tiver removido um contêiner dessa imagem. Este é o uso básico, eu acho.
CodeSlave 2/19/19

Respostas:

350

Esta é uma pergunta muito importante e a resposta é muito simples, mas fundamental:

  1. Executar: crie um novo contêiner de uma imagem e execute o contêiner. Você pode criar N clones da mesma imagem. O comando é: docker run IMAGE_ID e não docker run CONTAINER_ID

enter image description here

  1. Início: inicie um contêiner parado anteriormente. Por exemplo, se você parou um banco de dados com o comando docker stop CONTAINER_ID, é possível reiniciar o mesmo contêiner com o comando docker start CONTAINER_IDe os dados e configurações serão os mesmos.

enter image description here

daniele3004
fonte
1
É necessário criar um volume para o contêiner parado para os dados persistirem?
Logan Phillips
A diferença do ciclo de vida do @LoganPhillips entre arquivos gravados na camada de sistema de arquivos de união padrão do contêiner e arquivos gravados em volumes é: os dados da camada de sistema de arquivos de união do contêiner são sempre perdidos ao remover o contêiner ( docker rm container_id). Por outro lado, os dados de volumes sobrevivem à remoção do contêiner, a menos que a -vopção seja explicitamente fornecida na linha de comando. O local do volume no sistema host pode ser inspecionado diretamente. Veja este artigo
Stphane 11/05/19
Sobre o processo, precisa & no final da runlinha de comando? Eu preciso dele como um serviço countinous (24 horas)
Peter Krauss
Então, qual é o propósito de "docker create"? Como / quando isso seria usado?
Joseph Gagnon
100
  • runexecuta uma imagem
  • startinicia um contêiner .

O docker rundocumento menciona:

O docker runcomando primeiro cria uma camada de contêiner gravável sobre a imagem especificada e, em seguida, inicia -a usando o comando especificado.

Ou seja, a execução do docker é equivalente à API /containers/createentão /containers/(id)/start.

Você não executa um contêiner existente, executa o docker nele (desde o docker 1.3) .
Você pode reiniciar um contêiner encerrado .

VonC
fonte
@Tarik não você tem que adicionar -ia docker runpara um processo interativo? Quero dizer, o docker run precisa de uma imagem para executar um contêiner.
VonC
10
Parece haver espaço para alguém escrever uma resposta mais elaborada. A resposta não parece muito explicativa.
Qartal
4
Próxima pergunta para mim foi o que está-a-diferença entre-as-a-container e-um-imagem stackoverflow.com/questions/21498832/...
Alex Punnen
18

Explicação com um exemplo:

Considere que você possui uma imagem de jogo (iso) no seu computador.

Quando você run (monta sua imagem como uma unidade virtual), uma unidade virtual é criada com todo o conteúdo do jogo na unidade virtual e o arquivo de instalação do jogo é iniciado automaticamente. [Executando sua imagem do Docker - criando um contêiner e iniciando-o.]

Mas quando você stop (semelhante ao docker para), a unidade virtual ainda existe, mas interrompe todos os processos. [Como o contêiner existe até que não seja excluído]

E quando você faz start(semelhante ao docker start), a partir da unidade virtual, os arquivos dos jogos iniciam sua execução. [iniciando o contêiner existente]

Neste exemplo - A imagem do jogo é sua imagem do Docker e a unidade virtual é seu contêiner.

Apb
fonte
8

A resposta de daniele3004 já é muito boa.

Apenas uma rápida e suja fórmula para pessoas como eu que se mistura rune startde vez em quando:

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

Bowen
fonte
2
Isso não é bem verdade. De acordo com o documento oficial, "...docker run is equivalent to the API /containers/create then /containers/(id)/start.(fonte: docs.docker.com/engine/reference/commandline/run )
sshh
2

runO comando cria um contêiner a partir da imagem e inicia o processo raiz nesse contêiner. Executá-lo com run --rmbandeira iria salvar-lhe a dificuldade de remover o recipiente morto inútil depois e lhe permitiria ignorar a existência de docker starte docker removecompletamente.

insira a descrição da imagem aqui

run O comando faz algumas coisas diferentes:

docker run --name dname image_name bash -c "whoami"
  1. Cria um contêiner a partir da imagem. Nesse ponto, o contêiner teria um ID, pode ter um nome, se for dado, aparecerá emdocker ps
  2. Inicia / executa o processo raiz do contêiner. No código acima, isso seria executado bash -c "whoami". Se alguém correrdocker run --name dname image_name sem um comando para executar o contêiner, entrará no estado parado imediatamente.
  3. Depois que o processo raiz é concluído, o contêiner é parado. Neste ponto, é praticamente inútil. Não se pode mais executar nada ou ressuscitar o contêiner. Existem basicamente duas maneiras de sair do estado parado: remova o contêiner ou crie um ponto de verificação (ou seja, uma imagem) do contêiner parado para executar outra coisa. É preciso executar docker removeantes de iniciar o contêiner com o mesmo nome.

Como remover o recipiente depois que ele é parado automaticamente? Adicione um--rmsinalizador aoruncomando:

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

Como executar vários comandos em um único contêiner? Impedindo que esse processo raiz morra. Isso pode ser feito executando algum comando inútil no início com--detachedflag e, em seguida, usando "execute" para executar comandos reais:

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

Por que precisamos docker stopentão? Para parar esse contêiner remanescente que lançamos no snippet anterior com o comando infinitotail -f /dev/null.

y.selivonchyk
fonte