5 étapes pour migrer votre application vers des conteneurs

Généralement, vous considérez que c’est une bonne chose lorsque les gens veulent utiliser votre application. Cependant, lorsque l’application s’exécute sur un serveur, la popularité a un coût. Avec les utilisateurs, les demandes de ressources augmentent et, à un moment donné, vous constaterez peut-être que vous devez faire évoluer votre application. Une option consiste à lancer plus de serveurs sur le problème, à établir un équilibreur de charge comme Nginx et à laisser la demande se régler. Cette option peut cependant être coûteuse, car il n’y a pas d’économies lorsque la demande est faible et que vous exécutez des instances de votre application sur des serveurs dépourvus de trafic. Les conteneurs ont l’avantage d’être éphémères, de se lancer lorsque de nouvelles instances sont disponibles et de disparaître lorsque la demande diminue. Si cela ressemble à une fonctionnalité dont vous avez besoin, il est peut-être temps de migrer votre application vers des conteneurs.
La migration d’une application vers un conteneur peut rapidement devenir désorientante. Bien que l’environnement d’un conteneur puisse sembler familier, de nombreuses images de conteneur sont minimes et conçues pour être sans état. D’une certaine manière, cependant, c’est l’un des points forts des conteneurs. Comme un environnement virtuel Python, c’est une page blanche qui vous permet de créer (ou de reconstruire) votre application sans les défauts invisibles fournis par de nombreux autres environnements.
Chaque migration est unique, mais voici quelques principes importants que vous devez respecter avant de porter votre application vers des conteneurs.
Contents
1. Comprendre vos dépendances
Le portage de votre application dans un conteneur est une excellente occasion de savoir de quoi dépend réellement votre application. Avec très peu d’installations par défaut de tous les composants système sauf les plus essentiels, il est peu probable que votre application s’exécute dans un conteneur au début.
Avant de refactoriser, identifiez vos dépendances. Commencez par un grep
via votre code source pour include
ou import
ou require
ou use
ou n’importe quel mot-clé que votre langue de choix utilise pour déclarer des dépendances.
$ find ~/Code/myproject -type f \
-iname ".java" \
-exec grep import {} \;
Cependant, il peut ne pas suffire d’identifier uniquement les bibliothèques spécifiques à un langage que vous utilisez. Auditez les dépendances, afin que vous sachiez s’il existe des bibliothèques de bas niveau requises pour que le langage lui-même s’exécute ou qu’un module spécifique fonctionne comme prévu.
2. Évaluez votre stockage de données
Les conteneurs sont sans état, et lorsqu’un plantage ou cesse de fonctionner, cette instance du conteneur disparaît à jamais. Si vous deviez enregistrer des données dans ce conteneur, les données disparaîtraient également. Si votre application stocke des données utilisateur, tout le stockage doit avoir lieu en dehors du conteneur, dans un emplacement accessible à une instance de votre application.
Vous pouvez utiliser le stockage local mappé à un emplacement dans votre conteneur pour des fichiers de configuration d’application simples. Il s’agit d’une technique courante pour les applications Web qui nécessitent que l’administrateur fournisse des valeurs de configuration simples, telles qu’une adresse e-mail d’administrateur, un titre de site Web, etc. Par example:
$ podman run \
--volume /local/data:/storage:Z \
mycontainer
Cependant, vous pouvez configurer une base de données comme MariaDB ou PostgreSQL comme stockage partagé sur plusieurs conteneurs pour de grandes quantités de données. Pour les informations privées, telles que les mots de passe, vous pouvez configurer un secret
.
[ Download our MariaDB cheat sheet ]
En ce qui concerne la manière dont vous devez refactoriser votre code, vous devez adapter les emplacements de stockage en conséquence. Cela peut signifier modifier les chemins vers de nouveaux mappages de stockage de conteneurs, des ports vers différentes destinations de base de données ou même incorporer des modules spécifiques au conteneur.
3. Préparez votre dépôt Git
Les conteneurs extraient généralement le code source d’un référentiel Git au fur et à mesure de leur création. Vous devez avoir un plan pour gérer votre référentiel Git une fois qu’il devient la source canonique de code prêt pour la production pour votre application. Avoir une branche de publication ou de production, et envisager d’utiliser Crochets Git pour rejeter les commits accidentels non approuvés.
4. Connaissez votre système de construction
Les applications conteneurisées n’ont probablement pas de cycles de publication traditionnels. Ils sont extraits de Git lorsqu’un conteneur est construit. Vous pouvez initier n’importe quel nombre de systèmes de construction dans le cadre de la construction de votre conteneur, mais cela peut signifier ajuster votre système de construction pour qu’il soit plus automatisé qu’auparavant. Vous devez refactoriser votre processus de construction de manière à avoir une confiance totale dans le fait qu’il fonctionne complètement sans surveillance.
5. Construire une image
Construire une image ne doit pas être une tâche complexe. Vous pouvez utiliser images de conteneurs existantes comme base, en les adaptant avec un simple Dockerfile. Alternativement, vous pouvez créer le vôtre à partir de zéro en utilisant Buildah.
Le processus de création d’un conteneur fait, d’une certaine manière, autant partie du développement que la refactorisation de votre code. C’est la construction du conteneur qui obtient, assemble et exécute votre application. Le processus doit donc être automatisé et robuste. Construisez une bonne image et vous construisez une base solide et fiable pour votre application.
Conteneurisez-le
Si vous débutez avec les conteneurs, ne vous laissez pas intimider par la terminologie. Un conteneur n’est qu’un autre environnement. Les contraintes perçues du développement conteneurisé peuvent en fait vous aider à cibler votre application et à mieux comprendre comment elle s’exécute, ce dont elle a besoin pour fonctionner de manière fiable et les risques potentiels en cas de problème. À l’inverse, cela entraîne beaucoup moins de contraintes pour les administrateurs système qui installent et exécutent votre application, car les conteneurs sont, par nature, un environnement contrôlé. Examinez attentivement votre code, comprenez ce dont votre application a besoin et refactorisez-le en conséquence.