De Dockerfile à Ansible Containers
25 oct. 2017
- Catégories
- Orchestration de conteneurs
- DevOps & SRE
- Open Source Summit Europe 2017
- Tags
- Shell
- Ansible
- Docker
- Docker Compose
- YAML [plus][moins]
Ne ratez pas nos articles sur l'open source, le big data et les systèmes distribués, fréquence faible d’un email tous les deux mois.
Cette présentation était une introduction au format Dockerfile et à l’outil Ansible Containers puis une comparaison des deux produits. Elle fut réalisée par Tomas Tomecek, membre de l’équipe containerization de Red Hat.
Le Dockerfile
Il s’agit d’un fichier sans spécifications formelles qui permet de décrire les étapes de créations d’une image Docker en utilisant une séquence d’instructions.
Le fichier commence par une instruction FROM
qui définit l’image de base à utiliser pour créer votre image, puis on prépare le container et l’application qui va y tourner et enfin l’instruction CMD
clôt le fichier et définit l’instruction shell à exécuter pour lancer l’application.
Les bonnes pratiques encouragent à définir le plus tard possible dans le fichier les arguments et instructions susceptibles de changer, comme par exemple un dossier de configuration à monter dans le container, afin que Docker ne reconstruise pas l’intégralité de l’image à chaque fois qu’il y a une modification, mais seulement les étapes modifiées.
Écosystème
Le Docker Hub est un registre publique listant des images accessibles par tous, cependant 60% de ces images ne sont pas maintenues ou plus à jour, il faut donc faire attention à l’image sur laquelle on se base et par exemple aller regarder si le dépôt Github lié est toujours actif.
Docker Compose permet d’orchestrer des services ou applications lancées dans différents containers afin qu’elles interagissent à l’aide d’un fichier de configuration écrit en YAML.
Avantages et inconvénients
Étant le fichier de spécification par défaut pour créer des images Docker, le dockerfile est très largement utilisé et possède une bonne documentation, et le Docker Hub est une plateforme très bien fournie. Il s’agit également d’une technologie relativement facile à prendre en main et soutenue par une équipe active.
Cependant le Dockerfile n’est pas un format facile à parser car il ne bénéficie pas de spécifications formelles, et les instructions peuvent rapidement devenir très complexes (dockerfile de Go en est un très bon exemple) bien qu’il ne s’agisse finalement que d’un script shell avec des métadonnées. Également, les images sur lesquelles on se base du Docker Hub doivent provenir de sources sûres pour assurer la pérennité de votre travail et la technologie Dockerfile est spécifique aux containers Docker et aux podes Kubernetes.
Ansible
Ansible est une plateforme d’automatisation Open Source acquise en 2015 par Red Hat qui la package dans ses releases depuis. Ansible tourne sur un serveur Linux sans service actif et permet de gérer des serveurs à l’aide de fichiers d’instruction écrits en YAML et parsé avec Python. Le projet profite également d’un écosystème riche de centaines de modules à utiliser.
Glossaire
Les termes techniques de l’environnement Ansible :
- Task : une commande à exécuter
- Playbook : une suite de tâches
- Play : l’exécution d’un Playbook
- Role : un moyen d’exporter des playbooks et de les réutiliser (comme un module Node.js)
Containers
L’outil Ansible Container permet de décrire et créer des images Docker en utilisant des Playbooks Ansible en se débarrassant du format Dockerfile. C’est un projet lancé il y a un an et demi sur Github avec un petit peu moins de 1000 commits à l’écriture de ces lignes et une petite équipe de développeurs principaux.
L’outil s’installe avec pip :
sudo pip install ansible-container
et propose cinq actions de base :
ansible-container init
pour initialiser un projet containeransible-container installs
pour télécharger et installer les roles Ansible indiqués en dépendancesansible-container build
pour créer l’image Docker à partir de votre playbookansible-container run
pour exécuter le containeransible-container deploy
pour pousser l’image dans un registre et générer les playbooks permettant de déployer le projet
Vous trouverez dans un projet container :
- un fichier
container.yml
, équivalent dudocker-compose.yml
, qui définit les services de votre application, les roles à exécuter pour ce service et les paramètres d’intercommunication (ports à exposer, …) - des rôles Ansible contenant :
- les playbooks de préparation des containers
- les métadonnées indiquant l’image de base du container, les variables d’environnement et la commande à lancer au démarrage du container
Et si vous avez un projet Docker existant avec un Docker compose ou un simple Dockerfile, vous pouvez l’importer et le convertir avec la commande ansible-container import
. L’outil va parser la configuration existante et générer un projet Ansible correspondant avec les rôles et le container.yml
.
Vous trouverez sur Github une démo très complète de l’outil.
Avantages et inconvénients
L’utilisation de l’outil container d’ Ansible permet d’inclure dans une architecture Ansible existante les containers que vous utilIsez, tout en bénéficiant d’un énorme écosystème de rôles très fourni.
Cependant, le format descriptif des tâches Ansible peut rendre très complexe la mise en place d’instructions simples d’un Dockerfile. Il faut également prendre en compte la courbe d’apprentissage de la technologie.
Conclusion
Avec un module container proche de la release 1.0, Ansible offre une réelle alternative au format Dockerfile et sa complexité, et retire un outil dont on peut se passer si vous avez déjà un setup Ansible pour gérer votre architecture.
Cependant, si vous n’utilisez pas encore Ansible et que vous avez des connaissances Dockerfile ou des projets existants, il est probablement plus intéressant de les garder tel quel plutôt que de migrer. Vous devriez utiliser l’outil qui vous convient le mieux.