Découverte :
La magie de LXD

Écrire un pipeline en bioinformatique, c'est bien ! Le rendre portable c'est encore mieux ! Les bioinformaticiens oublient souvent ce dernier point et rare sont les pipelines qui marchent du premier coup. À vrai dire les circonstances ne sont pas en leur faveur. Un pipeline c'est plein de dépendances d'applications dans telle ou telle version, qu'il faut souvent compiler à la main. Sans oublier les différentes versions de langages comme Python 2 et Python 3. On aimerait bien une fois le pipeline construit, figer le système et le partager avec les utilisateurs, sans qu'ils aient à se soucier de l'installation. Eh bien c'est possible avec les environnements virtuels ! Et j'entends déjà au loin le débat sanglant entre ceux qui utilisent Docker et les autres avec leurs machines virtuelles. Dans cet article, on n'utilisera ni l'un ni l'autre. Mais la dernière née de Canonical : LXD .

 

logo lxd

logo lxd

LXD ou LXC ?

LXC est un système de virtualisation comme Docker qui contrairement à une machine virtuelle, simule l’environnement d’exécution au lieu d'une machine. L'avantage c'est que c'est vraiment light ! Vous pouvez lancer des milliers de machines containers sans consommer toutes vos ressources.
Le souci avec LXC, c'est qu'il n'est pas aussi facile à installer et manipuler que Docker. Suite à ça, les développeurs de Canonical ont décidé de faire encore plus simple en créant une surcouche appelée LXD. Il s'agit d'un daemon exposant une API REST qui permet de contrôler LXC. Et le client de cette API REST est la commande lxc.
Attention, pour éviter toutes confusions, les commandes LXC d'avant LXD sont de type lxc_create. Le client console communiquant avec LXD est la commande lxc.

 

Installation de LXD 

En supposant que vous êtes sous Ubuntu:

sudo apt install lxd
sudo lxd init

Les serveurs d'images

Les images sont les modèles sur lesquels vos containers vont être crées. En terme technique, un container est une instance d'image. Ces images sont stockées sur des serveurs distants ou locaux. Pour manipuler la liste de ces serveurs, utiliser la commande lxc remote. Par exemple pour lister les serveurs disponibles :

lxc remote list

Vous devriez alors voir le serveur d'image https://images.linuxcontainers.org appelé tout simplement "images". Il y egalement d'autres adresses de serveur, notamment celle de votre propre serveur. En effet vous pouvez stocker vos propres images et les distribuer sur les machines de votre réseau.

Les images

Pour manipuler les images, utilisez la commande lxc image. Par exemple, pour lister les images disponibles sur le serveur images: vu précédemment 

lxc image list images:

Repérer l'image de la dernière version d'Ubuntu (Ubuntu/Xenial)

Les containers

Vous avez repéré votre image ? Maintenant rien de plus simple. Pour lancer votre premier container , tapez la commande suivante :

lxc launch images:ubuntu/xenial myfirst

Cette commande va télécharger l'image et lancer votre container. Vous devriez voir votre container dans la liste des containers actifs en tapant la commande suivante:

lxc list

Exécuter une commande depuis le container

Pour entrer dans votre container et explorer son arborescence, il suffit d’exécuter la commande bash se trouvant dans le container. Tapez la commande suivante :

lxc exec myfirst /bin/bash

Voila, vous êtes dans votre container en root. Vous pouvez installer des paquets ou tout détruire. Peu importe ce que vous faite, vous êtes isolé dans votre container.
Vous pouvez par exemple écrire un pipeline bioinformatique et installer toutes ses dépendances. Lorsque vous voulez exécuter votre pipeline depuis l'hôte, il suffit de faire :

lxc exec myfirst /path/from/container/run/script

Faire un point de montage

Si vous avez besoin de partager un dossier entre l'hôte et le container, il faut faire un point de montage. La commande suivante, monte le dossier /tmp/ de l'hôte vers le dossier /host/tmp du container.

lxc config device add myfirst myfirstDevice disk source=/tmp/ path=/host/tmp

Exporter votre container comme image

Une fois votre container prêt, vous pouvez l'exporter en tant qu'image et le sauvegarder dans un fichier tar.gz. Tout d'abord publiez le container en tant qu'image myPipeline. L'image est sauvegardée avec toutes les autres images en local.

lxc publish myfirst --alias=myPipeline --force

Ensuite pour exporter une image dans un fichier, tapez :

lxc image export myPipeline

Vous vous retrouvez alors avec un fichier de ce genre 0bf450c17cb7034077c83487e0.tar.gz. Vous pouvez l'envoyer à votre copain, qui l'importera dans son propre LXD avec la commande suivante :

lxc image import 0bf450c17cb7034077c83487e0.tar.gz

Conclusion

Je pense qu'avec cet article, vous avez l'essentiel pour bien démarrer avec LXD et créer des pipelines portables. N’hésitez pas à vous balader dans la commande lxc, c'est du même style que git. Je n'ai pas parlé de tous les autres avantages de LXC. Mais rappelez-vous qu'il s'agit d'une API REST. Vous pouvez donc gérer vos containers et vos images sur plusieurs serveurs et clusters de calculs sans vous prendre la tête.
Sinon, il y a le projet Pirus en cours de développement qui vise à créer une application pour lancer des pipelines LXC de façon simple à travers une API REST et des websockets. C'est sous license AGPL et c'est ici https://github.com/REGOVAR/Pirus.

 

Merci aux relecteurs Kumquatum, Akira, Bebatut

  • À propos de
  • Interne en biologie moléculaire.
    Bioinformaticien , promotion BIG Rennes 2014-2015
    Mon blog dridk.me
    Suivez moi sur Twitter @dridk

2 commentaires sur “La magie de LXD

  1. Merci pour cet article, je ne connaissais pas du tout !

    Par contre je vais faire mon enquiquineuse, mais quels sont les avantages/différences par rapport à Docker ? Est-ce qu'il y a un équivalent à Docker Hub ?

    L'un des points forts de Docker me paraît être le fait qu'il y ait une communauté assez développée.

  2. Le but c'est d'enregistrer un container sous la forme d'un fichier...plus pratique à sauvegarder et surtout à partager !

    Pour faire ce genre de chose, j'utilise Singularity (http://singularity.lbl.gov/) ! C'est très simple, et il existe d'ailleurs un convertisseur de fichiers Dockerfile en images singularity !

    Combiné à NextFlow (qui gère nativement Singularity et ses points de montages), j'ai des images portables sur n'importe quel machine unix et un framework de workflow qui peut les exécuter (et compatible SLURM) !

    Parfait pour la traçabilité ! 😉

Laisser un commentaire