Come posso avviare automaticamente i contenitori della finestra mobile all'avvio del sistema?


113

Qual è un buon modo per avviare automaticamente i contenitori docker all'avvio del sistema?

C'è un modo preferito per farlo su Ubuntu 14.04?

Ho usato supervisordin passato per avviare automaticamente le app Web. Ma questa non sembra la cosa giusta per Docker.

Risposte:


136

Apparentemente, l'attuale metodo per avviare automaticamente i contenitori Docker ( da Docker 1.2 ) è utilizzare i criteri di riavvio . Questo controllerà come Docker dovrebbe gestire l'avvio del contenitore all'avvio e al riavvio del contenitore quando esce. Finora ho usato l'opzione "sempre" e posso confermare che rende Docker l'avvio automatico del contenitore all'avvio del sistema:

sudo docker run --restart=always -d myimage

Estratto dalla documentazione

Politiche di riavvio Usando il flag --restart durante l'esecuzione Docker è possibile specificare una politica di riavvio per come un container dovrebbe o non debba essere riavviato all'uscita.

no - Non riavviare il contenitore quando esce.

on-failure: riavviare il contenitore solo se esce con uno stato di uscita diverso da zero.

sempre - Riavvia sempre il contenitore indipendentemente dallo stato di uscita.

È inoltre possibile specificare il numero massimo di volte in cui Docker tenterà di riavviare il contenitore quando si utilizza il criterio di errore. L'impostazione predefinita è che Docker proverà per sempre a riavviare il contenitore.

$ sudo docker run --restart=always redis

Questo eseguirà il contenitore redis con una politica di riavvio sempre in modo tale che se il contenitore esce, Docker lo riavvierà.

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

Questo eseguirà il contenitore redis con una politica di riavvio in caso di errore e un conteggio di riavvio massimo di 10. Se il contenitore redis esce con uno stato di uscita diverso da zero più di 10 volte di seguito, Docker interromperà il tentativo di riavviare il contenitore. Fornire un limite massimo di riavvio è valido solo per la politica in caso di errore.


12
"sempre - riavvia sempre il contenitore indipendentemente dallo stato di uscita" è un po 'confuso. Non riavvierà il contenitore se si esce / arresta manualmente il contenitore, che è il comportamento che stavo cercando.
w00t,

12
Nota: è unless-stoppedstata aggiunta un'altra politica chiamata . Funziona come alwaysma Se il contenitore viene arrestato e il sistema viene riavviato o il daemon docker viene riavviato, il contenitore non verrà riavviato. Vedi qui per una bella recensione di tutte e 4 le opzioni blog.codeship.com/…
David Morales,

4
Ovviamente, il dockerdemone deve avviarsi automaticamente per supportare questo.
Sherrellbc,

Penso che la domanda sia "all'avvio del sistema", vale a dire dopo il riavvio del server fisico o virtuale, come si riavvia automaticamente il contenitore, supponendo che il motore docker sia completamente in esecuzione dopo il riavvio del server?
Root Loop

8

Docker ha questa pagina che spiega come farlo con upstart e systemd. Sono d'accordo che non sembra la cosa giusta per Docker. La loro soluzione è eseguire docker start, il che presuppone che tu abbia già creato il tuo contenitore. Penserei che lo faresti docker run --rmnello script upstart (trattandolo come un processo nuovo e contenitore da un'immagine) o semplicemente lasceresti che il demone docker riavvii i contenitori all'avvio (come farebbe di default se non fai nient'altro ). Upstart ha il vantaggio di consentire un facile avvio / arresto dei processi, ma lo si ottiene anche con l'avvio / arresto della finestra mobile!

Penso che sia strano forzare l'utente a creare manualmente un contenitore (con tutti i collegamenti porta / volume corretti) prima che lo script upstart funzioni.


Il legame è rotto ... Questa sembra una possibile sostituzione, ma di certo non mostra "come"
Gert van den Berg

Grazie, ho corretto il link a una pagina simile, ma non posso essere sicuro che dica la stessa cosa dell'originale.
Lawrence Kesteloot,

6

Ma questa non sembra la cosa giusta per Docker.

Perchè no?

Uso supervisord per questo con grande successo.

Usa ciò che sai, usa ciò che funziona, usa qualcosa che puoi facilmente mantenere e capire.


Grazie @EEAA .. significa che li esegui in modalità non demone? Questo non significa anche che è necessario eseguirli con --rm?
Stefan Arentz,

Eseguo i contenitori in modalità primo piano e lascio che supervisord catturi stdout / stderr. Non sono sicuro del perché --rmsia rilevante qui.
SEE

@EEAA: sulla tua domanda: per alcune persone, dockerè un sostituto per lxco openvzche hanno lxc.start.auto = 1e vzctl set --onboot yes. Anche ESXi e altre soluzioni di virtualizzazione includono tale funzionalità. Come Lawrence, anche io non penso che una tale funzione di avvio automatico debba essere implementata in un modo specifico per la distribuzione perché un utente docker dovrebbe essere in grado di risolvere lo stesso problema con la stessa conoscenza su ogni piattaforma.
Daniel Alder,

1
Bene, Docker è un ottimo modo per disaccoppiare l'host dai container in esecuzione, quindi l'utilizzo della configurazione specifica dell'host è un po 'indietro.
nijave,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.