meta données pour cette page
Ceci est une ancienne révision du document !
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 ) :
- Il créer une nouvelle interface
- Il lui attribue une IP
- On indique au kernel que l'on veut faire du routage
- 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 ) :
- Il supprime l'interface
- Il enlève le routage
- 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/