Question Comment démarrer automatiquement les conteneurs de docker au démarrage du système?


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 utilisé supervisord dans le passé pour démarrer automatiquement les applications Web. Mais cela ne semble pas être la bonne chose pour Docker.


99
2017-10-02 14:25


origine




Réponses:


Apparemment, la méthode actuelle pour démarrer automatiquement les conteneurs Docker (de Docker 1.2) est d'utiliser politiques de redémarrage. Ceci 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émarrez les stratégies. Vous pouvez utiliser l’option --restart sur Docker   spécifier une politique de redémarrage indiquant comment un conteneur devrait ou ne devrait pas être   redémarré à la sortie.

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

on-failure - Ne redémarre le conteneur que s'il se ferme avec un numéro différent de zéro   état de sortie.

always - Redémarre toujours le conteneur, quel que soit l'état de sortie.

Vous pouvez également spécifier le nombre maximal de fois où Docker tentera de   redémarrez le conteneur lorsque vous utilisez la stratégie en cas d'échec. La valeur par défaut est   Docker essaiera pour toujours de redémarrer le conteneur.

$ sudo docker run --restart=always redis

Cela va exécuter le redis   conteneur avec une politique de redémarrage de toujours de sorte que si le conteneur   quitte, Docker va le redémarrer.

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

Cela lancera le   Redis conteneur avec une politique de redémarrage de sur-échec et un maximum   compte de redémarrage de 10. Si le conteneur redis se ferme avec une sortie non nulle   statut plus de 10 fois de suite, Docker va abandonner la tentative de redémarrage   le conteneur. Fournir une limite maximale de redémarrage n’est valable que pour le   politique en cas de défaillance.


120
2017-12-07 20:18



"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
impressionnant! merci, essayez-le maintenant. - zx1986
Note: une autre politique appelée unless-stopped était ajouté. Il agit comme always mais si le conteneur est arrêté et que le système est redémarré ou si le démon docker est redémarré, le conteneur ne redémarre pas. Voir ici pour une belle rédaction de toutes les 4 options blog.codeship.com/… - David Morales
Bien sûr, le docker le démon doit démarrer automatiquement pour supporter cela. - sherrellbc


Docker a cette page cela explique comment le faire avec upstart et systemd. Je conviens que cela ne semble pas être la bonne chose pour Docker. Leur solution est de courir docker start, ce qui suppose que vous avez déjà créé votre conteneur. Je penserais que tu le ferais docker run --rm dans le script de mise à jour (en le traitant comme un nouveau processus et un conteneur d'image) ou laissez simplement le démon docker redémarrer les conteneurs lui-même au démarrage (comme ce sera le cas 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.


7
2017-10-14 04:49





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.


4
2017-10-02 14:27



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 avec --rm ? - Stefan Arentz
Je lance les conteneurs en mode avant-plan et laisse supervisord capturer stdout / stderr. Je ne sais pas pourquoi --rm est pertinent ici. - EEAA
@EEAA: à propos de votre question: pour certaines personnes, docker est un remplacement pour lxc ou openvz qui ont lxc.start.auto = 1 et 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 menu fixe devrait être capable de résoudre le même problème avec les mêmes connaissances sur chaque plate-forme. - Daniel Alder
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 est donc un pas en arrière. - nijave