Parlons de certaines des meilleures pratiques à suivre lors de l'utilisation de conteneurs.
La conteneurisation est largement utilisée dans plusieurs organisations pour déployer des applications à l'intérieur d'un conteneur. Ces conteneurs sont populaires car ils sont très légers. Pour tirer le meilleur parti de conteneurs, vous devez suivre certaines des meilleures pratiques pendant que vous travaillez avec eux.
Use Stable Base Image
Merci à Docker, création de conteneur les images n'a jamais été aussi simple.
Spécifiez votre image de base, ajoutez vos modifications et créez votre conteneur. Bien que cela soit idéal pour commencer, l'utilisation des images de base par défaut peut conduire à de grandes images pleines de vulnérabilités de sécurité. De plus, évitez d'utiliser l'image du menu fixe de balise «Latest» car il y a un risque énorme qu'un bogue y soit présent.
Debian ou Ubuntu sont utilisés comme image de base par la plupart des images Docker. Ils sont très utiles en termes de compatibilité et d'intégration facile, mais ces images de base peuvent ajouter des centaines de mégaoctets de frais généraux supplémentaires à votre conteneur.
Par exemple, les applications simples Node.js et Go, «bonjour le monde» font environ 700 mégaoctets. Votre application ne fait probablement que quelques mégaoctets. Donc, tous ces frais généraux supplémentaires sont de l'espace gaspillé et une excellente cachette pour les vulnérabilités et les bogues de sécurité.
Si votre langage de programmation ou votre pile n'a pas d'option pour une petite image de base, vous pouvez créer votre conteneur en utilisant raw Alpine Linux comme point de départ. Cela vous donne également un contrôle complet sur ce qui se passe à l'intérieur de vos conteneurs.
Keep Container Images Smaller
L'utilisation d'images de base plus petites est probablement le moyen le plus simple de réduire la taille de votre conteneur.
Il est fort probable que votre langue ou votre pile que vous utilisez fournisse une image officielle beaucoup plus petite que l'image par défaut. Par exemple, jetons un œil au conteneur Node.js. Passer du nœud par défaut: dernier au nœud: 14-alpine réduit la taille de notre image de base de près de dix fois.
contre.….
Dans le nouveau Fichier Docker, le conteneur commence par le nœud: image alpine, crée un répertoire pour le code, installe les dépendances avec NPM, et enfin, démarre le serveur Node.js. Avec cette mise à jour, le conteneur résultant est presque dix fois plus petit.
Vous créez le conteneur encore plus léger en utilisant le modèle de générateur. Avec les langages d'interprétation, le code source est envoyé à un interprète, puis il est exécuté directement. Mais avec un langage compilé, le code source est préalablement transformé en code compilé.
Désormais, avec les langages de compilation, l'étape de compilation nécessite souvent des outils qui ne sont pas nécessaires pour exécuter le code. Cela signifie donc que vous pouvez supprimer complètement ces outils du conteneur final. Pour ce faire, vous pouvez utiliser le modèle de générateur. Le premier conteneur génère le code, puis le code compilé est empaqueté dans le conteneur final sans tous les compilateurs et outils nécessaires pour créer le code compilé.
L'utilisation de petites images de base et le modèle de générateur sont d'excellents moyens de créer des conteneurs beaucoup plus petits sans beaucoup de travail.
Tag your Container Images
Le balisage Docker est un outil exceptionnellement puissant pour nous lorsqu'il s'agit de gérer nos images. Il aide à gérer différentes versions d'une image docker. Voici un exemple de création d'une image docker avec le nom de balise v1.0.1
docker build -t geekflare/ubuntu:v1.0.1
Maintenant, il existe deux types de balises utilisées: Stable étiquettes Unique Mots clés.
Utilisez des balises stables pour conserver l'image de base du conteneur. Évitez d'utiliser ces balises pour les conteneurs de déploiement, car ces balises recevront fréquemment des mises à jour et cela peut entraîner des incohérences dans l'environnement de production.
Utilisez des balises uniques pour les déploiements. À l'aide de balises uniques, vous pouvez facilement faire évoluer votre cluster de production vers de nombreux nœuds. Cela évite les incohérences et les hôtes ne tireront aucune autre version d'image du docker.
De plus, comme bonne pratique, vous devez verrouiller les balises d'image déployées en définissant la fonction write-enable sur false. Cela permet de ne pas supprimer l'image déployée du registre par erreur.
Container Security
Voici les points fondamentaux pour vous assurer que le conteneur est sécurisé.
- Vérifiez l'authenticité de tout logiciel que vous installez dans votre conteneur
- Utilisez des images Docker signées ou des images avec une somme de contrôle valide.
- Assurez-vous que l'URL utilise HTTPS si vous utilisez un référentiel tiers.
- Incluez les bonnes clés GPG avant d'utiliser votre gestionnaire de packages pour mettre à jour les packages
- N'exécutez jamais vos applications en tant que root. Vous devez toujours utiliser la directive user à l'intérieur du fichier docker pour vous assurer que vous supprimez les privilèges de votre utilisateur.
- N'exécutez pas SSH à l'intérieur de votre conteneur.
- Rendre le système de fichiers en lecture seule.
- Utilisez les espaces de noms pour diviser votre cluster.
Le benchmark Docker a été fourni par le Center for Internet Security (CIS) pour évaluer la sécurité d'un conteneur Docker. Ils ont fourni un script open-source appelé Docker Bench pour la sécurité, que vous pouvez exécuter pour vérifier la sécurité d'un conteneur Docker.
One Application Per Container
Les machines virtuelles sont assez bonnes pour exécuter plusieurs choses en parallèle, mais en ce qui concerne les conteneurs, vous devez exécuter une seule application dans un conteneur. Par exemple, si vous exécutez une application MEAN dans un environnement conteneurisé, elle doit avoir un conteneur pour MongoDB, un conteneur pour Express.js, un conteneur pour Angular et un conteneur pour Node.js.
Même les conteneurs peuvent y exécuter plusieurs applications en parallèle, mais vous pouvez ensuite tirer parti du modèle de conteneur. Vous trouverez ci-dessous une représentation correcte et erronée des applications en cours d'exécution dans un conteneur.
Les conteneurs sont conçus pour avoir un cycle de vie similaire à celui de l'application qu'ils exécutent. Lorsque le conteneur démarre, l'application démarre. Lorsqu'un conteneur s'arrête, l'application s'arrête également.
Run Stateless Containers
Les conteneurs sont fondamentalement conçus pour être apatrides. Dans ce cas, les données persistantes qui contiennent des informations sur l'état du conteneur sont stockées à l'extérieur du conteneur. Les fichiers peuvent être stockés dans un magasin d'objets tel que stockage cloud, pour stocker les informations de session utilisateur, vous pouvez utiliser une base de données à faible latence telle que Redis et vous pouvez également attacher un disque externe pour le stockage au niveau des blocs.
En gardant le stockage à l'extérieur du conteneur, vous pouvez facilement arrêter ou détruire un conteneur sans craindre de perdre des données.
Si vous utilisez des conteneurs sans état, il est très facile de migrer ou d'évoluer selon les besoins de l'entreprise.
Conclusion
Ce qui précède est quelques-unes des pratiques les plus importantes à suivre lorsque vous travaillez avec des conteneurs si vous créez un environnement de production Docker, puis consultez comment sécuriser le