Docker convient-il à mon cas d'utilisation?


14

Mon entreprise a un système que nous vendons qui consiste essentiellement en un mini-ordinateur "Smartbox" qui exécute Ubuntu 12.04. Cette boîte exécute une application Django plus un certain nombre de processus différents qui lui sont associés. Pas grand chose d'autre. Nous avons des milliers de ces boîtes sur le terrain. Nous gérons les dépendances des packages, l'enregistrement des processus, etc. via un package deb avec différents degrés de succès.

Nous avons besoin d'un moyen de diffuser les mises à jour de manière efficace et robuste à nos utilisateurs sur le terrain. Nous avons également besoin de quelque chose qui, lorsque nous mettons à niveau le système d'exploitation (nous sommes en retard pour une mise à niveau d'Ubuntu, comme vous pouvez le voir), nous pouvons nous sentir relativement en sécurité à propos de nos packages "fonctionnant".

Je ne sais pas grand-chose sur Docker, mais quand j'ai entendu parler de notre problème pour la première fois (je suis une nouvelle recrue), Docker a été ma première pensée. Mais plus j'y pensais, plus je pensais que ce n'était peut-être pas le cas, car ces boîtes sont les nôtres, nous contrôlons le système d'exploitation, ce qui constitue une grande partie de la proposition de valeur de Docker, du moins je comprends. Donc, si nous SAVONS que nos boîtes seront toujours Ubuntu et que nous avons simplement une application Django et certains processus à exécuter, Docker est-il meilleur qu'un package deb?

TL; DR: packages Docker vs deb pour une appliance distribuée qui exécutera toujours Ubuntu, donc l'indépendance de la plate-forme n'est pas si importante.


3
Félicitations pour votre première question, bien écrite et avec un objectif pratique, un exemple :)
Tensibai

Réponses:


7

Je ne suis pas sûr à 100% de la question, mais il semble que la solution Docker consisterait à passer d'une application (physique?) Avec un système d'exploitation et votre application installée à celle-ci, à une application avec un système d'exploitation et Docker dessus, exécutant un seul conteneur avec votre application dedans. Cela n'empêche pas la nécessité de mettre à jour le système d'exploitation dans l'hôte, et cela ajoute une couche de complexité (et plus de mises à jour à gérer, car vous devrez maintenant garder Docker et le système d'exploitation corrigés) sans aucun avantage évident. en ce qui concerne les domaines spécifiques mentionnés dans la question.

Cependant, si vous parlez de passer d'une appliance virtuelle à un conteneur Docker, cela pourrait potentiellement vous faciliter la tâche, mais cela ajoute également Docker en tant que dépendance pour votre produit; vous excluez quiconque n'utilise pas Docker et ne souhaite pas l'ajouter à sa pile uniquement pour utiliser votre produit. Vous pouvez continuer à prendre en charge ceux qui n'utilisent pas / n'utiliseront pas Docker en continuant à expédier l'appliance virtuelle (désormais «héritée») comme auparavant, mais maintenant vous venez de doubler votre charge de travail car vous avez deux distributions à prendre en charge au lieu de un.


5

Je travaille avec Docker depuis longtemps. L'indépendance de la plate-forme est agréable, mais ce n'est pas ce que je considère le plus utile à propos de Docker.

D'abord et avant tout, vous obtenez la répétabilité. Vous pouvez créer un Dockerfile, déboguer dans un conteneur sur votre machine de développeur, exécuter des tests sur un serveur d'intégration continue, puis dans votre produit final, et vous savez qu'il se comportera de la même manière dans tous ces environnements. Sans oublier une dépendance qu'un développeur avait installée sur sa machine. De plus, vos développeurs n'ont pas à utiliser Ubuntu à leur bureau. Important de nous satisfaire les utilisateurs d'Arch Linux :-)

Deuxièmement, pour votre scénario de mise à niveau, vous pouvez avoir plusieurs versions tirées sur une machine à la fois. Si vous exécutez un docker pull myapp:2.0certain temps 1.0, vous pouvez passer à 2.0très rapidement. Cela prendrait beaucoup plus rapidement qu'une mise à niveau complète du système d'exploitation. Si vous utilisez un orchestrateur avec plusieurs instances de microservices, vous pouvez même effectuer des mises à niveau continues qui n'interrompent pas du tout le service.

Si vous utilisez un modèle de microservices, Docker fournit également des bacs à sable qui peuvent limiter la quantité de dégâts que les attaquants peuvent faire en cas d'exploitation. Au lieu de prendre le contrôle d'une machine entière, ils ne prennent le contrôle que sur un conteneur.

L'inconvénient principal est que vous avez besoin du système d'exploitation hôte et d'une sorte d'orchestration. Il y a beaucoup de choix pour cela, mais ne sous-estimez pas la quantité de travail qu'il faut pour en évaluer un, le mettre en place et le maintenir.


Qu'est-ce que cela a à voir avec ce que OP demandait?
Adrian

1
(Commentaire hors sujet.) Bonjour Karl, J'ai apprécié beaucoup de vos contributions aux programmeurs / génie logiciel, c'est un plaisir de vous voir ici aussi!
Michael Le Barbier Grünewald

1

Dans l'ensemble, le docker offre de nombreux avantages pour les développeurs et le personnel d'exploitation. J'utilise docker pour certaines de mes applications et je trouve que c'est une approche très fiable et robuste.

Mon problème avec votre adoption de Docker est que je ne vous entends pas poser les bonnes questions et vous pourriez potentiellement vous compliquer la vie sans répondre à vos exigences les plus importantes.

La première question que vous devriez poser (vous avez dit que vous étiez nouveau) est de savoir comment les mises à jour du système d'exploitation et de l'application sont-elles gérées maintenant? La méthodologie actuelle fonctionne-t-elle pour vous (votre entreprise)? Qu'est-ce qui fonctionne bien? Qu'est-ce qui pourrait être amélioré? Pouvez-vous effectuer un audit de configuration physique sur vos machines cibles sur le terrain pour vérifier qu'elles ont les correctifs du système d'exploitation, l'application et y a-t-il eu des modifications non autorisées?

J'adore le docker, mais je ne sauterais pas dans le train des dockers sans d'abord évaluer où vous en êtes en ce moment, y compris ce qui fonctionne bien et ce qui doit être amélioré.


1

Bien qu'il existe de minuscules régions qui se chevauchent, Docker et les systèmes de conditionnement Debian résolvent essentiellement deux problèmes très différents :

  • Le système d'empaquetage Debian est conçu pour installer le logiciel sur un hôte et le mettre à jour aussi facilement que possible. Il est capable de gérer des modèles de dépendance et de contraintes complexes entre les composants logiciels, comme «le logiciel X version A nécessite un logiciel Y avec la version B ou une version plus récente installée» ou «le logiciel X ne doit jamais être installé avec le logiciel Z version C».

  • Le système Docker est conçu pour décrire et déployer facilement des services, en particulier des micro-services, éventuellement sur plusieurs hôtes - par exemple un essaim Docker ou un cluster Kubernetes.

Ces deux problèmes sont essentiellement orthogonaux, ce qui signifie qu'étant donné le problème de déploiement à résoudre, on peut utiliser l'un d'eux, les deux, ou peut-être même aucun d'entre eux, dans le cadre de la solution. Lorsque vous les utilisez tous les deux, le paquet Debian est utilisé dans la production de l'image Docker, et votre Dockerfile (les recettes utilisées pour préparer l'image Docker décrivant le «système virtualisé» exécuté dans un conteneur) enregistrerait essentiellement votre référentiel Debian dans le sources du système de conditionnement Debian et installez votre paquet.

Dans cet esprit, il me semble que ce que vous cherchez vraiment, c'est d'implémenter le modèle de serveur immuable. Le développement récent des technologies cloud a permis de mettre à niveau le logiciel non pas en utilisant le système de mise à niveau de logiciel classique à partir d'un système de progiciel (comme le système de conditionnement Debian) mais plutôt en remplaçant simplement le serveur complet à la fois. (Certaines personnes l'ont fait avant ce développement en disposant de trois OS sur un serveur, deux utilisés en alternance pour exécuter l'appliance et un mini-OS dédié au remplacement de l'appliance. Bien qu'il ne soit pas trop complexe, cela semble être toujours resté un niche.) Cette technique peut vous intéresser car si vous êtes habitué à mettre à niveau le logiciel sur votre serveur à l'aide du gestionnaire de packages, l'état final du serveur dépend de l '«historique de mise à niveau» du serveur - surtout si des erreurs se produisent dans le processus de mise à niveau. Cette hétérogénéité est mauvaise,

Nous avons des milliers de ces boîtes sur le terrain. Nous gérons les dépendances des packages, l'enregistrement des processus, etc. via un package deb avec différents degrés de succès.

pourrait se rapporter à cela. Le modèle de serveur immuable efface cette source d'erreurs en détruisant essentiellement la notion d '«historique de mise à niveau» du problème.

Il existe maintenant différentes options pour implémenter le modèle de serveur immuable, deux choix populaires consistent à utiliser des images Docker, des images ou à utiliser des «images d'instance principale» de votre fournisseur de cloud (elles sont appelées AMI dans AWS et juste des images personnalisées dans Google Compute Engine) . Votre cas d'utilisation interdit l'utilisation de techniques basées sur le cloud, je suppose donc que les images Docker sont le seul choix éligible. (Dans un souci d'achèvement, il est certainement possible d'utiliser d'autres approches, par exemple en utilisant Virtual Box ou une solution de virtualisation similaire, comme alternative à Docker.)

Lorsque vous utilisez la technique de modèle de serveur immuable, vous introduisez un nouvel artefact (l'image Docker) représentant votre serveur et cet artefact peut également être testé, et il est très facile d'obtenir une configuration reproduisant fidèlement vos paramètres de production - en dehors de la charge de service.

Maintenant, pour considérer le problème concret que vous avez décrit, supposons que l'implémentation du modèle de serveur immuable avec Docker soit réellement ce que vous voulez. Étant donné que le système Docker et le système d'empaquetage Debian sont complémentaires plutôt que mutuellement exclusifs (cf. intro), nous devons encore répondre à la question de savoir si vous devez préparer un paquet Debian pour votre logiciel.

La pertinence d'utiliser un paquet Debian pour installer votre logiciel (dans l'image Docker ou sur un hôte) réside dans la complexité du problème de versioning que vous devez résoudre. Si vous exécutez en même temps plusieurs versions de votre logiciel, avez parfois besoin de rétrograder et avez des exigences de version complexes que vous devez documenter soigneusement, avoir un paquet Debian est un must. Sinon, cette étape peut être ignorée - mais comme vous avez déjà fait un effort pour produire et déployer ces packages, il n'y a pas vraiment de valeur à abandonner votre travail. Je suggère donc de continuer à produire vos paquets Debian.


@Tensibai Vous avez raison, j'ai retravaillé la réponse en fonction de cela.
Michael Le Barbier Grünewald

1
Je suis peut-être pédant, mais qu'en est-il des divers processus parvenus mentionnés dans la question? À mon avis, l'introduction de docker dans la pile décrite ne fait qu'introduire une dépendance de plus, vous devez toujours maintenir l'hôte sous-jacent, et vous devez maintenant gérer la complexité du partage des systèmes de fichiers entre les conteneurs et potentiellement le problème de la communication inter-processus maintenant qu'ils sont dans des espaces de noms séparés. De plus, il y a probablement une base de données quelque part derrière l'application Django (au moins pour Django lui-même) qui est généralement un mauvais candidat pour un modèle de serveur immuable pour les nouveaux arrivants.
Tensibai

1
@Tensibai Encore une fois, un point très valable :)
Michael Le Barbier Grünewald

0

Je pense que cela pourrait être une bonne option (des tests supplémentaires sont nécessaires)

Vous pouvez fournir une URL avec toutes les balises / version du conteneur que vous avez créé et les clients liront cette URL pour voir s'il existe une nouvelle version du conteneur.

Vous pouvez stocker des fichiers / paramètres personnels sur local et vous ne perdrez jamais ces informations dans les mises à niveau et vous vous assurerez que ce que vous avez créé et testé fonctionnera pour tout le monde de la même manière.

Même vous pourriez donner aux utilisateurs la possibilité de choisir la version parmi les disponibles qu'ils veulent utiliser (si vous voulez donner cette possibilité).

Ce sera comme "" seulement mettre à jour un paquet "", en parlant de récupérer seulement une nouvelle version du conteneur, bien mieux que de traiter avec les paquets debian;)


Comment pouvez-vous vous assurer qu'il fonctionnera de la même manière pour tout le monde? un appareil qui s'est assis pendant 3 ans a de bonnes chances d'avoir un ancien hôte docker et en tant que tel ne pourra pas exécuter la dernière image docker construite. Lisez à nouveau la question, OP fournit le système d'hébergement ...
Tensibai

Une image docker testée devrait fonctionner pour toutes les boîtes dont vous savez que docker fonctionne correctement. si vous contrôlez de SO, vous pouvez répondre à toutes les exigences pour les packages nécessaires et les fichiers de configuration qui prendront en charge Docker. Vous devriez tester si votre image fonctionnera sur les boîtes les plus anciennes, peut-être devriez-vous mettre à niveau de SO ou certains packages. Désolé mais je ne sais pas ce que tu veux dire par "OP"
RuBiCK

OP = affiche originale (l'auteur de la question si vous préférez). Donc, ce que vous dites, c'est que vous devez tester le package docker de la même manière que vous devez tester un package debian, je ne vois pas dans votre réponse une valeur ajoutée par rapport au simple test d'un package debian et répondre à toutes les exigences également, je voyez juste une complexité supplémentaire par l'ajout de la couche docker. (et nous ne parlons toujours que d'une partie de la question, sans aborder les multiples processus de
démarrage

Vous devez tester quelle que soit la solution que vous choisissez. À mon humble avis, il est plus facile d'échouer un processus de mise à niveau effectué par des packages plutôt que d'exécuter un nouveau docker.
RuBiCK

Nous recherchons davantage des faits et / ou une expérience vérifiables qu'une opinion sur les sites Stack Exchange. Les opinions sauvegardées sont correctes, mais pour l'instant je ne vois pas comment votre réponse répond exactement à la question. N'oubliez pas que les sites SE ne sont pas des forums de discussion, le format ne convient pas et n'est pas fait pour cela.
Tensibai

-1

Docker me semble raisonnable, car vous pouvez apporter et tester des modifications au conteneur en interne, puis en fonction de votre processus de publication, redémarrez toujours les conteneurs en tirant: dernier ou quelque chose de similaire qui fournirait une mise à niveau testée.

Les considérations auxquelles vous devez faire face incluent le stockage des données car les conteneurs ne conservent pas les modifications au redémarrage, vous souhaiterez donc un volume de données. Il y a probablement beaucoup plus de considérations que vous auriez également une fois que vous y aurez creusé. Le système avec lequel je travaille actuellement (tous basés sur des dockers) est en développement depuis plus d'un an et nous trouvons toujours des domaines dans lesquels nous devons apporter des modifications au conteneur, aux configurations, etc.


3
Cela ne répond pas vraiment à la façon dont Docker est meilleur que les packages .deb.
AlexD
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.