De Dockerfile à Ansible Containers

Présentation de Tomas Tomecek, membre de l’équipe containerization de Red Hat.

Cette présentation était une introduction au format Dockerfile et à l’outil Ansible Containers puis une comparaison des deux produits.

Le Dockerfile

Il s’agit d’un fichier sans spécifications formelle 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 clos le fichier et défini l’instruction shell à exécuter pour lancer l’application.

Les bonnes pratiques encouragent à définir le plus tard possible dans le fichiers 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 accessible 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 intéragissent à 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 un é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érénité de votre travail et la technologie Dockerfile est spécifique aux containers Docker et aux podes Kubernetes.

Ansible

Ansible est une plateforme d’automatisation OpenSource 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’instructions écris 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ébarassant 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 :

et propose cinq actions de base :

  • ansible-container init pour initialiser un projet container
  • ansible-container installs  pour télécharger et installer les roles Ansible indiqués en dépendances
  • ansible-container build  pour créer l’image Docker à partir de votre playbook
  • ansible-container run  pour exécuter le container
  • ansible-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 du docker-compose.yml, qui définiit 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 ccontainer

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 <directory>. L’outil va parser la configuratiton 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 utilsez, 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 simple 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à une 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 existant, il est probablement plus intéressant de les garder tels quels plutôt que de migrer. Vous devriez utiliser l’outil qui vous convient le mieux.

Par |2018-06-05T22:36:51+00:00October 25th, 2017|Open Source Summit Europe 2017|0 commentaire

À propos de l'auteur :

Consultant Big Data @ Adaltas depuis 2015, j'aime découvrir de nouvelles choses et expérimenter avec les nouvelles technologies en plus de mon métier de tous les jours

Laisser un commentaire