Comment démarrer automatiquement les conteneurs de menu fixe au démarrage du système?

113

Quel est un bon moyen de démarrer automatiquement les conteneurs Docker lorsque le système démarre?

Y a-t-il un moyen préféré de faire cela sur Ubuntu 14.04?

J'ai déjà utilisé supervisordpour lancer automatiquement des applications Web. Mais cela ne semble pas être la bonne chose pour Docker.

Stefan Arentz
la source

Réponses:

136

Apparemment, la méthode actuelle pour démarrer automatiquement les conteneurs Docker (à partir de Docker 1.2 ) consiste à utiliser des stratégies de redémarrage . Cela contrôlera la manière dont Docker doit gérer le démarrage du conteneur lors du démarrage et le redémarrage du conteneur lors de sa sortie. Jusqu'ici, j'ai utilisé l'option 'toujours' et peux confirmer que Docker lance automatiquement le conteneur au démarrage du système:

sudo docker run --restart=always -d myimage

Extrait de documentation

Redémarrer les stratégies À l'aide de l'indicateur --restart sur l'exécution de Docker, vous pouvez spécifier une stratégie de redémarrage indiquant comment un conteneur doit ou non être redémarré à la sortie.

non - Ne redémarre pas le conteneur à sa sortie.

on-failure - Redémarrez le conteneur uniquement s'il se ferme avec un statut de sortie non nul.

always - Toujours redémarrer le conteneur, quel que soit le statut de sortie.

Vous pouvez également spécifier le nombre maximal de fois où Docker tentera de redémarrer le conteneur lors de l'utilisation de la stratégie en cas d'échec. La valeur par défaut est que Docker essaiera définitivement de redémarrer le conteneur.

$ sudo docker run --restart=always redis

Cela va exécuter le conteneur redis avec une politique de redémarrage de toujours afin que, si le conteneur se ferme, Docker le redémarre.

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

Le conteneur redis sera exécuté avec une stratégie de redémarrage après échec et un nombre de redémarrages maximal de 10. Si le conteneur redis se ferme avec un statut de sortie non nul plus de 10 fois de suite, Docker abandonnera en essayant de le redémarrer. La fourniture d'une limite de redémarrage maximale n'est valide que pour la stratégie en cas d'échec.

aknuds1
la source
12
"Toujours - Toujours redémarrer le conteneur, quel que soit l'état de sortie" est un peu déroutant. Il ne redémarrera pas le conteneur si vous quittez / arrêtez-le manuellement, ce qui est le comportement que je recherchais.
w00t
12
Remarque: une autre politique appelée a unless-stoppedété ajoutée. Il agit comme alwaysmais si le conteneur est arrêté et le système est redémarré ou le démon docker est redémarré, le conteneur ne redémarre pas. Voir ici pour une bonne rédaction de toutes les 4 options blog.codeship.com/…
David Morales
4
Bien entendu, le dockerdémon doit démarrer automatiquement pour prendre en charge cette opération.
sherrellbc
Je pense que la question demande "au démarrage du système", ce qui signifie qu'après le redémarrage du serveur physique ou virtuel, comment les conteneurs redémarrent-ils automatiquement, en supposant que le moteur Docker est complètement en cours d'exécution après le redémarrage du serveur?
Root Loop
8

Docker a cette page qui explique comment procéder avec upstart et systemd. Je conviens que cela ne semble pas être la bonne chose pour Docker. Leur solution consiste à exécuter docker start, ce qui suppose que vous avez déjà créé votre conteneur. Je penserais que vous feriez soit docker run --rmdans le script upstart (en le traitant comme un tout nouveau processus et conteneur à partir d'une image) ou tout simplement en laissant le démon docker redémarrer les conteneurs lui-même au démarrage (comme par défaut si vous ne faites rien d'autre ) Upstart a l'avantage de permettre un démarrage / un arrêt facile des processus, mais vous obtenez cela aussi avec le démarrage / arrêt de docker!

Je pense que c'est bizarre de forcer l'utilisateur à créer manuellement un conteneur (avec toutes les liaisons port / volume correctes) avant que le script de mise à jour ne fonctionne.

Lawrence Kesteloot
la source
Le lien est brisé ... Cela semble être un remplacement possible, mais cela ne montre certainement pas le "comment"
Gert van den Berg
Merci, j'ai corrigé le lien vers une page similaire, mais je ne peux pas être sûr qu'il indique la même chose que l'original.
Lawrence Kesteloot le
6

Mais cela ne semble pas être la bonne chose pour Docker.

Pourquoi pas?

J'utilise supervisord pour cela avec un grand succès.

Utilisez ce que vous savez, utilisez ce qui fonctionne, utilisez quelque chose que vous pouvez facilement maintenir et comprendre.

EEAA
la source
Merci @EEAA .. cela signifie-t-il que vous les exécutez en mode non démon? Cela ne signifie-t-il pas également que vous devez les exécuter --rm?
Stefan Arentz
Je lance les conteneurs en mode avant-plan et laisse supervisord capturer stdout / stderr. Je ne suis pas sûr de savoir pourquoi --rmest pertinent ici.
EEAA
@EEAA: à propos de votre question: Pour certaines personnes, dockerest un remplacement pour lxcou openvzqui ont lxc.start.auto = 1et vzctl set --onboot yes. ESXi et d'autres solutions de virtualisation incluent également une telle fonctionnalité. Comme Lawrence, je ne pense pas non plus qu'une telle fonctionnalité de démarrage automatique devrait être mise en œuvre de manière spécifique à la distribution, car un utilisateur de docker devrait pouvoir résoudre le même problème avec les mêmes connaissances sur chaque plate-forme.
Daniel Alder
1
Bien sûr, Docker est un excellent moyen de dissocier l’hôte de l’exécution des conteneurs. La configuration spécifique à l’hôte représente donc un pas en arrière.
Nijave