Des machines virtuelles facilement avec LXC

Tout le monde a entendu parler de Docker, une technologie « superstar » de ces dernières années. Le type de technologie tellement hype qu'on a envie de s'en servir, même quand on ne comprends pas bien ce que ça fait et que ça n'est pas vraiment adapté à ses besoins. Et LXC, vous connaissez ?

Docker par ci… Docker par là… Docker est certes une technologie impressionnante et je ne nie pas qu'elle soit très utile dans certains cas d'utilisations, mais pour beaucoup, utiliser Docker revient à sortir le paquebot de croisière quand on veut aller faire un tour en barque.

Et LXC ? Personne n'en cause jamais ! Pourtant, c'est une techno extraordinairement utile, facile à utiliser, et qui se substituera très bien à Docker pour des besoins simples.

Je ne suis pas devops, ni expert de Docker ou LXC. Mon but est simplement de présenter un outil que j'utilise tous les jours et que je trouve trop peu connu.

LXC vs. Docker

Dans ce billet, je considère que vous savez déjà à peu près à quoi sert Docker. Dans le cas contraire, lisez la doc. Je ne suis pas votre mère.

LXC et Docker ne sont pas des technos concurrentes. On peut considérer que Docker est une extension de LXC qui rajoute de nombreuses fonctionnalités, mais également de la complexité. Exemple : Docker est prévu pour faire tourner un seul processus ou service (pas obligé, mais c'est une bonne pratique). Si vous bâtissez une application Web avec un framework Python, une base de donnée, un serveur Redis, et peut-être encore d'autres trucs, il faudra autant de machines Docker qui devront être orchestrées et connectées entre elles. Un rêve pour un hébergeur, mais inutilement complexe pour un développeur seul qui veut simplement isoler ses environnements de développement.

Là ou Docker se situe au niveau du processus, LXC se situe au niveau de la machine. LXC vous permet de créer et d'isoler autant de machines virtuelles (linux) que vous le souhaitez.

Pour être très précis, il s'agit plutôt d'environnements virtuels plutôt que de machines virtuelles, puisqu'on n'émule pas la couche physique de la machine (comme le ferait VirtualBox, par exemple). LXC ne permet donc que de créer des machines linux, mais l'impact sur les perfs est négligeable.

Exemples de cas d'utilisations :

Je commence à travailler sur un nouveau projet Django pour un client. Même si Python permet facilement de créer des environnements virtuels, je préfère créer une machine virtuelle Debian équivalente au futur serveur de prod et installer à l'intérieur les versions de Python, Django, Elasticsearch, Postgresql, etc. qui vont bien.

Un client emploie au sein d'un projet une librairie métier très spécifique qui n'existe qu'en version 32 bits (oui, ça existe). Pas de problèmes, lxc permet de créer une machine avec la bonne architecture sans me prendre la tête.

Pour mes besoins personnels et professionnels, je loue un serveur physique que j'administre moi même. Dessus, j'ai créé plusieurs machines virtuelles, isolées et disposant chacune d'une adresse ip spécifique, dans lesquelles je répartis mes divers projets pro et perso. En utilisant des ip failovers, il me devient très facile de migrer d'un serveur à l'autre : il suffit d'arrêter la machine, la compresser, transférer, décompresser, et basta !

Je veux faire tourner un client bittorrent et passer par un vpn, mais ne souhaite faire passer dans le tunnel que les données bittorrent ? Facile, une machine lxc avec un transmission-daemon et c'est réglé.

Je veux tester une application en laquelle je n'ai pas vraiment confiance à base de « curl | sh » ? Je créé une machine, installe le machin, teste, et détruit la machine quand j'ai terminé.

Avantages de LXC

LXC est simple. Une commande me permet de créer une machine avec l'OS et l'architecture que je veux. Une autre commande me permet de la démarrer, une troisième de m'y connecter.

LXC est pratique. Pouvoir créer, modifier, supprimer une machine virtuelle isolée de votre machine physique en un clin d'œil, c'est quasiment un super-pouvoir.

LXC est rapide. Mon projet actuel tourne dans une machine LXC. Le client fournissait une machine VirtualBox, qui mangeait toute ma RAM et nécessitait un temps interminable avant de se lancer. Aujourd'hui, il s'écoule moins d'une seconde entre le moment ou je lance la machine et celui ou le serveur de dev Django ne soit paré.

Installer LXC

LXC se trouve dans les dépôts de toute distribution linux qui se respecte. Pour installer, rien de plus facile.

sudo apt install lxc

Créer une machine debian

La commande suivante permet de créer une machine Debian Jessie.

sudo lxc-create -n ma_machine -t download -- -d debian -r jessie -a amd64

Lister les machines existantes

sudo lxc-ls -f

NAME        STATE   AUTOSTART GROUPS IPV4      IPV6
machine1    RUNNING 0         -      10.0.3.36 -
machine2    STOPPED 1         -      -         -

Démarrer une machine

sudo lxc-start -n machine1

Obtenir un shell sur une machine

sudo lxc-attach -n machine1

Configuration de la machine

Par défaut, le fichier de configuration d'une machine lxc se trouve dans /var/lib/lxc/nom_de_la_machine/config.

Créer un répertoire partagé entre la machine physique et une machine LXC

Dans le fichier susmentionné, ajouter une ligne qui ressemble à ça :

lxc.mount.entry = /chemin/sur/la/machine/physique chemin/sur/la/machine/lxc none rw,bind 0.0

Notez que le deuxième chemin doit être un chemin relatif (sans « / » au début).

Configuration du réseau

Il existe plusieurs façons de connecter la machine au réseau. En lui donnant une ip spécifique et un accès direct au réseau, via du nat, etc.

Ici, il y aura probablement quelques spécificités en fonction de votre OS de base. Le mieux est de vous référer à la doc.

Supprimer une machine existante

sudo lxc-destroy -n machine

C'est tout

LXC permet de faire bien plus, mais pour mes besoins très simples, ce sont à peu près les seules commandes que j'utilise.

Je n'avais pas envie de trop me fouler, mais LXC gagnerait à être mieux connu. Pensez y la prochaine fois que vous voulez utiliser Docker alors qu'une simple et bête machine virtuelle vous suffirait.

Cough Cough

Apparemment, la mi-saison est propice aux rhume des foins, pas mal d'entre vous ont l'air enrhumés.

Lien envoyé par Bruno Bord : lxcited, a bash-based remote control for LXC containers.

Précision envoyée par les tatillons @clementd, @LouisBilliet et @JoelWurtz : le terme « machine virtuelle » veut dire quelque chose de spécifique, on devrait plutôt parler de containers si on voulait être rigoureux, ce que j'essaye d'être d'habitude.