Vous vous êtes donc finalement rendus aux conteneurs et vous avez découvert qu'ils résolvent beaucoup de problèmes et présentent de nombreux avantages:
- Premièrement : les conteneurs sont immuables - Le système d'exploitation, les versions de bibliothèque, les configurations, les dossiers et les applications sont tous intégrés dans le conteneur. Vous garantissez que la même image testée dans le contrôle qualité atteindra l'environnement de production avec le même comportement.
- Deuxièmement : les conteneurs sont légers - L'empreinte mémoire d'un conteneur est réduite. Au lieu de centaines ou de milliers de Mo, le conteneur n'allouera que la mémoire pour le processus principal.
- Troisièmement : les conteneurs sont rapides - Vous pouvez démarrer un conteneur aussi rapidement qu'un processus typique de Linux. Au lieu de quelques minutes, vous pouvez démarrer un nouveau conteneur en quelques secondes.
Cependant, de nombreux utilisateurs traitent toujours les conteneurs comme des machines virtuelles classiques et oublient que les conteneurs ont une caractéristique importante: les conteneurs sont à usage unique.
Le mantra autour des conteneurs :
“Les conteneurs sont éphémères”
Cette caractéristique oblige les utilisateurs à changer leur manière de penser lorsque l'on manipule et gère des conteneurs; Nous verrons CE QUE VOUS NE DEVEZ PAS FAIRE pour continuer à extraire les meilleurs avantages des conteneurs:
1. Ne stockez pas de données dans des conteneurs : Un conteneur peut être arrêté, détruit ou remplacé. Une version d'application 1.0 fonctionnant dans un conteneur doit être facilement remplacée par la version 1.1 sans aucun impact ni perte de données. Pour cette raison, si vous devez stocker des données, faites-le dans un volume. Dans ce cas, vous devez également faire attention si deux conteneurs écrivent des données sur le même volume, car cela pourrait provoquer une corruption. Assurez-vous que vos applications sont conçues pour écrire dans un volume de données partagé.
2. N'expédiez pas votre application en deux parties : Certaines personnes voient les conteneurs comme une machine virtuelle, mais la plupart d'entre elles ont tendance à penser qu'elles doivent déployer leur application dans des conteneurs en cours d'exécution existants. Cela peut être vrai pendant la phase de développement où vous devez déployer et déboguer en continu; mais pour un pipeline de distribution continue (CD) vers le contrôle qualité et la production, votre application doit faire partie de l'image. Rappelez-vous : les conteneurs sont immuables.
3. Ne créez pas de grandes images : Une grande image sera plus difficile à distribuer. Assurez-vous de ne disposer que des fichiers et des bibliothèques nécessaires pour exécuter votre application / processus. N'installez pas de packages inutiles ou exécutez des «mises à jour» qui téléchargent de nombreux fichiers sur une nouvelle couche d'image.
4. N'utilisez pas une seule couche (layer) : Pour utiliser efficacement le système de fichiers en couches, créez toujours votre propre couche d'image de base pour votre système d'exploitation, une autre couche pour la définition du nom d'utilisateur, une autre couche pour l'installation à l'exécution, une autre couche pour la configuration et enfin une autre couche pour votre application. Il sera plus facile de recréer, gérer et distribuer votre image.
exemple :
FROM debian:jessie RUN apt-get update RUN apt-get install -y curl
FROM debian:jessie RUN apt-get update \ && apt-get install -y curl \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*
5. Ne créez pas d’images à partir de conteneurs en cours d’exécution : En d’autres termes, n’utilisez pas «docker commit» pour créer une image. Cette méthode pour créer une image n'est pas reproductible et doit être complètement évitée. Utilisez toujours un fichier Dockerfile ou toute autre approche S2I (source to image) totalement reproductible. Vous pouvez également suivre les modifications apportées au fichier Dockerfile si vous le stockez dans un référentiel de contrôle de source (git).
6. Ne pas utiliser uniquement la dernière version “latest” : La balise la plus récente est semblable au «SNAPSHOT» pour les utilisateurs de Maven. Les Tags sont encouragées en raison de la nature des fichiers en couches des conteneurs. Vous ne voulez pas de surprises lorsque vous construisez votre image quelques mois plus tard et que votre application ne peut pas s'exécuter car un calque parent (FROM dans Dockerfile) a été remplacé par une nouvelle version non compatible avec les versions antérieures. La balise “Latest” doit également être évitée lors du déploiement de conteneurs en production, car vous ne pouvez pas savoir quelle version de l'image est en cours d'exécution.
7. N'exécutez pas plus d'un processus dans un même conteneur : Les conteneurs sont parfaits pour exécuter un seul processus (démon http, serveur d'applications, base de données), mais si vous avez plus d'un processus, vous aurez peut-être plus de difficultés à gérer, récupérer les journaux et mettre à jour les processus individuellement.
8. Ne stockez pas les informations d'identification dans l'image : Utiliser des variables d’environnement - Vous ne souhaitez coder en dur aucun nom d’utilisateur / mot de passe dans votre image. Utilisez les variables d'environnement pour extraire ces informations de l'extérieur du conteneur. L'image de Postgres est un bon exemple de ce principe.
9. Ne pas exécuter les processus en tant qu’utilisateur root : « Par défaut, les conteneurs Docker s’exécutent en tant que root (…) À mesure que Docker mûrisse, des options par défaut plus sécurisées sont disponibles. Pour le moment, utiliser root est dangereux et peut ne pas être disponible dans tous les environnements. Votre image doit utiliser l'instruction USER pour spécifier un utilisateur non root pour s'exécuter ».
10. Ne comptez pas sur les adresses IP : Chaque conteneur a sa propre adresse IP interne et peut changer si vous démarrez et arrêtez le conteneur. Si votre application ou votre microservice doit communiquer avec un autre conteneur, utilisez des variables d'environnement pour transmettre le nom d'hôte et le port appropriés d'un conteneur à un autre.