Une présentation proposée par le réseau Bioinfo Nantais
Slides de la présentation du coin geek docker
Docker est un excellent outil pour aider au déploiement d'une application. La philosophie de docker est de mettre tout le code dans des boîtes hermétiques qui contiennent un système d'exploitation et le code de l'application. Cette architecture permet à la fois de diviser son code en plusieurs parties indépendantes mais surtout permet aussi de rendre son application déployable sur n'importe quelle machine virtuelle (VM) quel que soit son système d'application !
C'est donc un outil très interessant à utiliser quand il s'agit de rendre vos recherche reproductibles !
Note
Juste envie de se rappeller des commandes qu'on a utiliser ? Jette un coup d'oeil à la (cheatsheet)[]
Docker est un outil très puissant qui peut sembler difficile à comprendre à première vue. Mais il n'y a besoin de comprendre qu'une petite dizaine de commandes pour avoir accès à la majorité des fonctionalités qu'offre Docker !
Pour ce coin geek je vous propose de nous focaliser sur l'aspect reproductibilité d'un code. L'objectif va être de vous montrer que n'importe quel code que ce soit (un workflow, une application ou des scripts d'analyse) peuvent être conteneurisé et utilisé partout grâce à Docker.
- Analyse avec R
- Script d'analyse Python
- Combiner un script d'analyse avec une interface web -> visualisation des résultats
A la fin du coin geek vous saurez maîtriser les commandes de bases de docker, vous comprendrez les concepts les plus importants et vous saurez comment conteneuriser vos propres outils et comment utiliser un outil déjà conteneurisé.
"Docker c'est un programme qui crée des boites... Plein de boîtes hermétiques avec leur propre écosystème"
Le concept principal de docker permet de créer des boîtes hermétiques qui contiennent tout ce dont vous avez besoin pour executez votre code, y compris un système d'exploitation, un système de fichier etc... Le container et complètement indépendant de la machine hôte donc ça permet de juste donner le container à quelqu'un autre et le programme que vous avez développé fonctionnera exactement de la même façon que sur votre ordinateur. Plus jamais de "Ca marche sur ma machine".
Regardons comment ça fonctionne !
Les images sont comme des patrons de couture, c'est une version toute compacte du container, mais qui peut être utilisée pour créer un container. Une image Docker contient toujours un système d'exploitation. Il existe des images basées sur Debian, Ubuntu et beaucoup d'autre distributions linux. Il exsite aussi des version Windows pour les plus valeureux d'entre vous. Certaines images contiennent déjà des programmes ou des outils dedans tandis que d'autres sont minimalistes comme Alpine, une image linux de seulement 5mb.
Avec une image on peut créer d'autres images. Bien sur, il existe un réseau de développeur qui partagent leur prores images sur des répertoires d'images comme dockerhub. Si il n'existe pas d'images correspondant exactement à l'outils que vous voulez sur les registres d'images, c'est tout à fait possible de créer vos propres images en écrivant un fichier spécial: le Dockerfile
Note
Le saviez vous ? Le gitlab de Nantes université héberge aussi un répertoire d'image ! Très pratique pour partager son outil à ses collègues sans se prendre la tête !
Le fichier Dockerfile est un fichier dans lequel on précise exactement tout ce que l'on veut dans une image. Ensuite avec une commande docker il est possible de créer l'image à partir du Dockerfile.
Un Dockerfile a toujours une structure similaire:
Dockerfile
FROM alpine:3.14 ## Indique que l'on crée une image en partant d'un linux minimaliste
RUN apk add git ## Indique que l'on veut que git soit installé dans le container
COPY script.sh script.sh ## Copie le fichier script.sh depuis la machine hôte vers le container
ENTRYPOINT script.sh ## execute le fichier script.sh. Quand il aura fini de s'executer le container s'arrêtera aussi
Pour créer une image avec un Dockerfile il suffit d'executer:
bash
docker build -t ma-petite-image . ## permet de créer une image avec un tag
L'image alpine utilisée en tant que base va être téléchargée depuis dockerhub puis l'image va être créé en suivant les instructions écrites dans le Dockerfile.
Si l'image à été crée correctement elle devrait être présente dans la liste qui s'affiche lorsque l'on execute la commande:
bash
docker images
Les conteneurs sont des instances d'images Docker. Si l'image Docker est comme un patron de couture, le conteneur est le vetement fini. A partir d'un seul modèle on peut créer plusieurs copies du même vetement. Pour les conteneur c'est pareil: avec une image on peut créer plein de conteneur de la même image. Le conteneur est la boite finie où du code s'execute.
Pour lancer le conteneur de l'image Docker que l'on avait crée tout à l'heure il suffit de faire la commande:
bash
docker run --name test-pt-image ma-petite-image -d
On peut regarder si l'image est bien lancée avec la commande docker ps -a
Si le container ne fonctionne bien la commande de prédilection est docker logs <container-hash>. La commande nous permet de savoir pour quelle raison le conteneur n'a pas le comportement que l'on veut.
Le soucis les plus problématique de docker c'est que la commande docker logs <container-hash> ne retourne les logs que d'un container lancé (marqué Running). Sauf que la majorité des conteneurs s'arrêtent quand il y a un soucis ce qui nous empèche d'avoir les logs, on doit donc débugger à l'aveugle..
Heureusement il exsite une technique pour faire persister des informations sur l'execution du container sur la machine hôte: Les volumes !
Pour prendre en main Docker, le plus simple est de maniper l'outil. Pour ce coin geek, nous vous proposons un exercice tutoriel: Dockeriser l'application streamlit que l'on a crée lors d'un précédant coin geek. Pour suivre l'exercice pratique il faut cloner la repo des bioinfo nantais.
bash
git clone git@gitlab.univ-nantes.fr:BiRD/reseau_bn.git
Ensuite, allez dans la directory du coin geek docker
bash
cd reseau_bn/coins-geek/docker
Puis suivez les instructions de la présentation à partir de la slide numéro 19. Cela vous permettra de mieux suivre les étapes à réaliser lors de l'exercice pratique. La présentation vous guidera tout au long de l'exercice.
Lorsque l'on veut publier son image, on rencontre plusieurs possibilité : Soit la déposer sur un répertoire d'images (dockerhub, ou le répertoire de l'université) ou bien on dépose la recette de l'image sur un répertoire git. Dans le premier cas, l'utilisateur récupèrera l'image seule, il pourra la lancer directement mais il ne pourra pas la modifier très facilement parce qu'il faut se logger sur au container pour ajouter des choses dedans et on a aucune garantie sur le contenu de l'image si on a pas son Dockerfile, il s'agit d'une méthode simple mais dangeureuse. Déposer son dockerfile dans un repo git est un bon compromis entre vitesse d'utilisation et sécurité parce que l'on construit l'image à partir d'un Dockerfile qu'on a récupéré, on a donc la visibilité sur le contenu de l'image qui sera crée.
Note
ATTENTION à ne jamais lancer une image douteuse avec Docker. En effet, même si le code s'exécute dans une boîte hermétique qui n'a pas accès au système hôte, si le dockerfile contient un volume, le code peut modifier des fichier du système hôte et donc potentiellement exposer des fichiers à un code malveillant !!
Docker est vraiment très pratique mais ça demande de réfléchir à la façon dont le code est structuré.
Si tu as besoin d'aide pour utiliser Docker dans ton projet, n'hésite pas à faire appel à la plateforme Bird sur mattermost ou envoie un email directement à brieuc.quemeneur@univ-nantes.fr
Pour les membres du réseau Bioinfo Nantais (BN), vous pouvez poser vos questions sur ce tutoriel dans le canal dédié sur mattermost
Pour les personnes non membre du réseau vous pouvez poser vos question en ouvrant une issue avec le label "question" directement dans ce répertoire Github
Brieuc Quemeneur pour le réseau Bioinfo Nantais