Apprendre à utiliser LXC

LXC (LinuX Containers) est une technologie isolant un ou plusieurs processus sur un système. Ainsi on isole et limite les effets de bords. Par exemple, on peut limiter un process à n'utiliser qu'un certain pourcentage du processus ou de mémoire.

Ci-dessous je présente deux versions qui sont un peu différentes de part leur conception mais aussi via leurs commande.

Ressources :

Installation

Verson 1.x

apt install lxc bridge-utils debootstrap

C'est la version encore bien présente sur les système Debian. Elles à l’inconvénient de ne pas embarqué les connecteurs réseau par défaut. Ainsi sa configuration est un peu plus compliqué mais ça marche tout aussi bien.

Version 2.x

Pour cela on a besoin de renseigner les backports :

echo "deb http://ftp.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/backports.list
apt-get update && apt-get -t jessie-backports install lxc

Lors de la création des conteneurs, ils seront tous enregistré à l'emplacement /var/lib/lxc.

Joindre le conteneur au réseau

Version 1.x

On édite le fichier de configuration où l'on déclare les cartes réseaux :

nano /etc/network/interfaces

On créé notre bridge :

auto br0
iface br0 inet static
        address 192.168.1.254
        netmask 255.255.255.0
        pre-up brctl addbr br0
        post-down brctl delbr br0
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
        post-down echo 0 > /proc/sys/net/ipv4/ip_forward
        post-up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
        post-down iptables -F POSTROUTING -t nat

Un fois fait, on peut lancer la commande suivante pour monter l'interface:

ifup br0

En fait, celle-ci aura pour rôle de “routeur” virtuel.

A son lancement (lors d'un ifup br0 ) :

  1. Il créer une nouvelle interface
  2. Il lui attribue une IP
  3. On indique au kernel que l'on veut faire du routage
  4. On applique un réseau NAT pour que le conteneur se comporte comme un serveur dans un réseau privé.

A son arrêt (lors d'un ifdown br0 ) :

  1. Il supprime l'interface
  2. Il enlève le routage
  3. Il supprime la règle NAT

Pour savoir quel interface sélectionner, il faut appliquer cette règle sur l'interface par défaut. Ici j'ai pris l'exemple de eth0.

Concernant le conteneur, on ajoutera ces directives dans le fichier suivants :

nano /var/lib/lxc/container/config
lxc.network.type = veth
lxc.network.link = br0
lxc.network.ipv4 = 192.168.1.110/24
lxc.network.ipv4.gateway = 192.168.1.254
lxc.network.name = eth0
lxc.network.flags = up

Au démarrage du container, il aura l'IP ci-dessus et depuis la machine hôte, on verra une nouvelle interface de type veth.

Version 2.x

a vérifier

Avant de démarrer le conteneur, on défini le réseau avec l'IP statique :

lxc network create lxdbr0 ipv6.address=none ipv4.address=192.168.2.1/24 ipv4.nat=true
lxc network attach lxdbr0 vm-name eth0
lxc config device set vm-name eth0 ipv4.address 192.168.2.2

Puis on peut lancer le conteneur :

lxc start vm-name

Commandes disponible

  • Voir la configuration utilisé par LXC :
lxc-checkconfig
  • Créer un conteneur Debian :
lxc-create -n mon-conteneur -t debian
  • Démarrer un conteneur et le placer en arrière plan :
lxc-start -n mon-conteneur -d
  • Se connecter au container :
lxc-attach -n mon-container
  • Démarrer un conteneur au boot de l'OS :
lxc config set mon-container boot.autostart true
  • Arréter un conteneur :
lxc-stop -n mon-container
  • Se connecter à la console du conteneur :
lxc-console -n mon-conteneur
  • Pour se détacher de la console :
Taper sur <Ctrl>+<a> puis indépendamment la touche <q>
  • Copier un conteneur :
lxc-copy -n $mon-container -N $mon-nouveau-container

Configuration disponible

Dans le fichier suivant on peut ajouter ces directives :

nano /var/lib/lxc/$CONTAINER/config
  • Limiter la taille mémoire :
lxc.cgroup.memory.limit_in_bytes = 100M
  • Déployer un conteneur opensuse, ubuntu ou une version précise de Debian:
lxc-create -n monContainer -t opensuse
lxc-create -n monContainer -t ubuntu
lxc-create -n monContainer -t debian -- -r stretch --arch amd64

Ces version sont présenté sous forme de template qui se situent dans ce dossier : /usr/share/lxc/templates/

Bugs

Il se peut que l'on rencontre quelques bugs pas compréhensible mais voici quelque solutions.

  • mktemp: impossible de créer le fichier à partir du modèle « /tmp/user/0/tmp.XXXXXXXXXX

A faire dans le container :

mkdir -p /tmp/user/0/ && chmod 711 /tmp/user/ && chmod 700 /tmp/user/0/