Docker
From silico.biotoul.fr
Motivation : problèmes de dépendances logicielles et de reproductibilités des résultats obtenus (avec un certain environnement, librairies, ...).
Solution (partielle) : mettre dans un container tout ce qu'il faut pour réaliser le même traitement.
Remarque : cela permet aussi de distribuer l'exécution de programme sur une grille de calculs ou un cloud.
Nous allons utiliser podman qui est l'équivalent de docker mais présente certains avantages :
- docker nécessite un service (qui tourne donc en permanence) alors que podman non
- il faut des permissions élevées (root) pour docker et pas toujours pour podman
Contents |
Test : Hello world
Pour vérifier que cela fonctionne :
podman run hello-world
podman devrait récupérer l'image du container sur docker.io puis l'exécuter sans trop de soucis.
Images présentes sur le compte :
podman images
Container en cours d'utilisation :
podman ps
Container en cours ou ayant terminé :
podman ps -a
On observe qu'il reste hello-word, on peut accéder aux logs avec son identifiant ou son nom (utile pour le débogage en cas de crash du container) :
podman logs CONTAINER_ID
Nettoyage : suppression de ce qu'il reste de l'exécution précédente
podman rm CONTAINER_ID
Nettoyage : suppression de l'image récupérée de docker.io
porman rmi IMAGE_ID
Utilisation d'un programme : exemple prokka
Prokka: rapid prokaryotic genome annotation, Bioinformatics 2014, Torsten Seemann article github réalise l'annotation de génomes procaryotes. Ce programme fait appel à un certain nombre d'autres programmes, librairies et bases de données (BLAST+, HMMER3, BioPerl, ...) ce qui peut rendre son installation et sa configuration fastidieuses et/ou laborieuses.
Pour illustrer la simplicité de son utilisation (avec les paramètres par défaut même si, en général, il est recommandé d'adapter les paramètres à l'étude réalisée) sur un petit génome.
Récupération de l'image sur docker.io :
podman pull staphb/prokka:latest
Ou bien à partir d'une recherche sur https://hub.docker.com : https://hub.docker.com/r/staphb/prokka
Il est parfois nécessaire de rester sur une version plutôt que de choisir latest :
podman pull staphb/prokka:1.14.5 podman images
REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/staphb/prokka latest 7e63ea9aea78 20 months ago 1.79 GB docker.io/staphb/prokka 1.14.5 814ee67a9e22 20 months ago 1.79 GB
Utilisation :
podman run staphb/prokka:1.14.5 prokka -h podman run staphb/prokka:1.14.5 prokka --listdb
Remarque : à chaque exécution d'un container, l'image est gardée. Il faudra donc faire le ménage dans les sorties des containers. Il peut aussi être judicieux d'ajouter l'option --rm qui supprime la sortie du container et nous évite d'avoir à faire le ménage :
podman ps -a
Nous allons l'appliquer à un génome du covid :
mkdir data cd data curl http://silico.biotoul.fr/enseignement/m2bbs/fedora/NC_045512.2.fasta > NC_045512.2.fasta
Il faut rendre accessible le fichier à l'intérieur du container avec l'option --volume ou -v → cela correspond à un montage
podman run --rm -v ./data:/data staphb/prokka:1.14.5 prokka --kingdom Viruses --outdir results NC_045512.2.fasta
Résultats :
ls -lh data/results
total 284K -rw-r--r-- 1 guest guest 5.1K Aug 30 18:00 PROKKA_08302022.err -rw-r--r-- 1 guest guest 9.8K Aug 30 18:00 PROKKA_08302022.faa -rw-r--r-- 1 guest guest 29K Aug 30 18:00 PROKKA_08302022.ffn -rw-r--r-- 1 guest guest 30K Aug 30 18:00 PROKKA_08302022.fna -rw-r--r-- 1 guest guest 30K Aug 30 18:00 PROKKA_08302022.fsa -rw-r--r-- 1 guest guest 54K Aug 30 18:00 PROKKA_08302022.gbk -rw-r--r-- 1 guest guest 32K Aug 30 18:00 PROKKA_08302022.gff -rw-r--r-- 1 guest guest 7.0K Aug 30 18:00 PROKKA_08302022.log -rw-r--r-- 1 guest guest 58K Aug 30 18:00 PROKKA_08302022.sqn -rw-r--r-- 1 guest guest 1.6K Aug 30 18:00 PROKKA_08302022.tbl -rw-r--r-- 1 guest guest 469 Aug 30 18:00 PROKKA_08302022.tsv -rw-r--r-- 1 guest guest 63 Aug 30 18:00 PROKKA_08302022.txt
Combien de protéines sont annotées ?
Est-ce que la protéine spike utilisée pour produire certains vaccins est identifiée ?
Mise en place d'un service
Pour cet exemple, nous allons utiliser trilium qui est un outil pour gérer des notes (post-it virtuels améliorés) de manière hiérarchisée. Il utilise une base de données et peut-être utilisé sous la forme de site Web. L'accès se fait donc par un l'intermédiaire d'un serveur web. Tout ceci sera encapsulé dans un container. Pour y accéder, if faudra donc avoir le nom du site web ou bien son adresse IP ainsi que le port pour accéder au service.
La manière de l'installer comme serveur conseillée est à l'aide d'un container (https://github.com/zadam/trilium/wiki/Docker-server-installation) disponible sur docker hub : https://hub.docker.com/r/zadam/trilium/
Mise en oeuvre avec la dernière version au 31/08/2022 :
podman pull zadam/trilium:0.54.3
Remarque : il est conseillé sur le site de ne pas utiliser latest qui risque de faire une mise à jour qui pourrait endommager les processus de synchronisation avec des applications clientes mis en place (aucun pour nous, donc pas de soucis).
Lors de l'exécution du container, il faut donc qu'un port de la machine hôte soit relié au port d'écoute du serveur web qui s'exécute dans le container. Certaines plages de ports sont réservées pour des raisons de sécurité (n'importe quel utilisateur ne peut pas utiliser/s'approprier n'importe quel port). Un port utilisable est souvent le port 8080. Nous allons utiliser celui-ci.
Les paramètres que nous allons spécifier pour le container :
- -t ou --tty : allocation d'un terminal/console (tty)
- -i ou --interactive : exécution en premier plan
- -p : associe un port du container à un port de la machine hôte, syntaxe -p n°_port_host:n°_port_container
- --rm : pour supprimer le container quand il termine (et ne pas avoir à faire le ménage)
podman run -t -i --rm --name trilium -p 8080:8080 zadam/trilium:0.54.3
Pour accéder au serveur sur sa machine : http://localhost:8080
Pour accéder au serveur sur une autre machine de la salle, il faudra que le firewall de cette machine autorise la connexion sur le port 8080, ce qui n'est pas le cas par défaut. Ce devrait être le cas http://pc2:8080
Pour arrêter le container, il faut faire Ctrl-C dans le terminal où on l'a démarré s'il est au premier plan, ou bien
podman stop CONTAINER_ID
D'où l'avantage de donner un nom (--name) au container :
podman stop trilium
Si vous avez ajouté une note et que vous relancez le container, la note aura disparu. Il n'y a pas de stockage persistant en dehors du container sauf si on lui fournit l'accès. En effet, le container est isolé de la machine hôte. Si l'on veut garder les modifications effectuées à l'intérieur du container, il faut donc lui fournir des répertoires ou fichier de la machine hôte pour que les modifications faites à l'intérieur du container soient visibles (et persistantes) à l'extérieur.
Nouveau paramètre ajouté :
- -v ou --volume : permet de monter un répertoire (ou fichier) de la machine hôte dans le container, syntaxe -v host_path:container_path
cd mkdir trilium-data podman run -t -i --rm --name trilium -p 8080:8080 -v ./trilium-data:/home/node/trilium-data zadam/trilium:0.54.3
Pour finir, pour lancer le container, il faudra utiliser le paramètre -d ou --detach (au lieu de --interactive):
podman run -t -d --rm --name trilium -p 8080:8080 -v ./trilium-data:/home/node/trilium-data zadam/trilium:0.54.3