Como inicio automaticamente os contêineres do docker na inicialização do sistema?

113

Qual é uma boa maneira de iniciar automaticamente os contêineres do docker quando o sistema é inicializado?

Existe uma maneira preferida de fazer isso no Ubuntu 14.04?

Eu usei supervisordno passado para iniciar automaticamente aplicativos da web. Mas isso não parece a coisa certa para o Docker.

Stefan Arentz
fonte

Respostas:

136

Aparentemente, o método atual para iniciar automaticamente os contêineres do Docker ( do Docker 1.2 ) é usar diretivas de reinicialização . Isso controlará como o Docker deve lidar com a inicialização do contêiner na inicialização e a reinicialização do contêiner quando ele sair. Até agora, usei a opção 'always' e posso confirmar que o Docker inicia automaticamente o contêiner na inicialização do sistema:

sudo docker run --restart=always -d myimage

Trecho da documentação

Políticas de reinicialização Usando o sinalizador --restart na execução do Docker, você pode especificar uma política de reinicialização sobre como um contêiner deve ou não ser reiniciado na saída.

não - Não reinicie o contêiner quando ele sair.

em falha - Reinicie o contêiner apenas se ele sair com um status de saída diferente de zero.

always - sempre reinicie o contêiner, independentemente do status de saída.

Você também pode especificar a quantidade máxima de vezes que o Docker tentará reiniciar o contêiner ao usar a política de falha. O padrão é que o Docker tentará para sempre reiniciar o contêiner.

$ sudo docker run --restart=always redis

Isso executará o contêiner redis com uma política de reinicialização sempre para que, se o contêiner sair, o Docker o reinicie.

$ sudo docker run --restart=on-failure:10 redis

Isso executará o contêiner redis com uma política de reinicialização em caso de falha e uma contagem máxima de reinicialização de 10. Se o contêiner redis sair com um status de saída diferente de zero mais de 10 vezes seguidas, o Docker interromperá a tentativa de reiniciar o contêiner. O fornecimento de um limite máximo de reinicialização é válido apenas para a política de falha.

aknuds1
fonte
12
"sempre - sempre reinicie o contêiner, independentemente do status de saída", é um pouco confuso. Ele não reiniciará o contêiner se você sair / parar manualmente, que é o comportamento que eu estava procurando.
W00t
12
Nota: outra política chamada unless-stoppedfoi adicionada. Ele age como alwaysmas Se o contêiner for parado e o sistema for reiniciado ou o daemon do docker for reiniciado, o contêiner não será reiniciado. Veja aqui para uma boa redação das 4 opções blog.codeship.com/…
David Morales
4
Obviamente, o dockerdaemon deve iniciar automaticamente para suportar isso.
precisa saber é o seguinte
Eu acho que a pergunta está perguntando "na inicialização do sistema", ou seja, após a reinicialização do servidor físico ou virtual, como os contêineres são reiniciados automaticamente, supondo que o mecanismo do estivador esteja em execução total após a reinicialização do servidor?
Root Loop
8

O Docker tem esta página que explica como fazer isso com o upstart e o systemd. Concordo que não parece a coisa certa para o Docker. A solução deles é executar docker start, o que pressupõe que você já criou seu contêiner. Eu pensaria que você faria docker run --rmno script inicial (tratando-o como um processo e contêiner novinho em folha de uma imagem) ou apenas deixaria o daemon do docker reiniciar os contêineres na inicialização (como será por padrão se você não fizer mais nada ) O Upstart tem a vantagem de permitir fácil início / parada de processos, mas você também obtém isso com o start / stop do docker!

Acho estranho forçar o usuário a criar manualmente um contêiner (com todas as ligações corretas de porta / volume) antes que o script inicial funcione.

Lawrence Kesteloot
fonte
O link está quebrado ... Isso parece ser uma possível substituição, mas certamente não mostra "como"
Gert van den Berg
Obrigado, corrigi o link para uma página semelhante, mas não posso ter certeza de que diz a mesma coisa que o original.
Lawrence Kesteloot 16/04
6

Mas isso não parece a coisa certa para o Docker.

Por que não?

Eu uso supervisord para isso com grande sucesso.

Use o que você sabe, use o que funciona, use algo que você possa facilmente manter e entender.

EEAA
fonte
Obrigado @EEAA .. isso significa que você os executa no modo não daemon? Isso não significa também que você precisa executá-los --rm?
Stefan Arentz
Eu corro os contêineres no modo de primeiro plano e deixo supervisord pegar stdout / stderr. Não sei por que --rmé relevante aqui.
EEAA
@EEAA: sobre sua pergunta: para algumas pessoas, dockeré um substituto para lxcou openvzque possui lxc.start.auto = 1e vzctl set --onboot yes. Além disso, o ESXi e outras soluções de virtualização possuem esse recurso incluído. Como Lawrence, também não acho que esse recurso de inicialização automática deva ser implementado de uma maneira específica da distribuição, porque um usuário do docker deve ser capaz de resolver o mesmo problema com o mesmo conhecimento em todas as plataformas.
Daniel Alder
11
Certo, o Docker é uma ótima maneira de separar o host da execução de contêineres, portanto, usar a configuração específica do host é um passo atrás.
Nijave