Lxc

De Wiki doc

Installation et utilisation de LXC (au plus simple)

Installation

Installation du paquet

# apt install lxc

Configuration du réseau

Réseau par pont

Ce mode est le plus adapté pour un usage "machine virtuelle" du conteneur (et donc mieux pour héberger sur un serveur). En effet, avec le pont réseau, le conteneur aura accès, tant en entrée que en sortie au même réseau que votre machine hôte (un par-feux sera peut être judicieux en fonction du cas). Le réseau n'est donc pas limité.

Installation du paquet

# apt install bridge-utils

Création d'une interface pour le mode bridge

# vim /etc/network/interfaces

<source lang="bash">

auto br0
iface br0 inet static
       address 192.168.1.161
       netmask 255.255.255.0
       network 192.168.1.0
       broadcast 192.168.1.255
       gateway 192.168.1.1
       bridge_ports eth0       
       bridge_stp off
       bridge_maxwait 5
       bridge_fd 0

</source>

Réseau privé

Depuis la version 2.0 de LXC, le service lxc-net permet de créer automatiquement une interface bridge <source lang="bash" inline>lxcbr0</source> qui servira à privatiser l'interface réseau du conteneur. On utilisera des redirections de ports iptables pour accéder à nos services ou ont routera les paquets provenant du réseau privé. L'intérêt principal du réseau privé face au mode bridge est qu'il est plus adapté à un usage sur machine bureautique. En effet, la création d'un bridge via le fichier interfaces fout la merde avec network-manager et ajoute une certaine lourdeur à l'usage quotidien (surtout avec un PC portable). De plus, aucun autre paquet que lxc n'est nécessaire. En outre, on peut également dire que l'accès au conteneur est plus limité (donc plus sécurisant) de par les la portée limité du réseau privé entre l'hôte et le conteneur (pas besoin de par-feux).

Création du fichier <source lang="bash" inline>/etc/default/lxc-net</source> avec le paramètre suivant

# echo "USE_LXC_BRIDGE="true"" >> /etc/default/lxc-net

Relancer le service pour montée automatiquement l'interface <source lang="bash" inline>lxcbr0</source>.

# service lxc-net restart

Création d'un conteneur et configuration

Création d'un conteneur sous Debian 8

# lxc-create -n <NOM_CONTENEUR> -t debian -- -r jessie

Ajout de la configuration réseau. Attention, la directive <source lang="bash" inline>lxc.network.ipv4</source> donne une IP au conteneur mais le fichier interfaces du Debian est réglé sur DHCP par défaut. Le conteneur récupère donc 2 IP. Soit on désactive cette directive, soit on vire le DHCP (je pense que mettre une IP fixe au conteneur est plus simple).

# vim /var/lib/lxc/<NOM_CONTENEUR>/config

Pour un bridge : <source lang="bash"> lxc.network.type = veth lxc.network.hwaddr = 00:16:3e:62:91:94 lxc.network.name = eth0

  1. lxc.network.ipv4 = 192.168.1.163

lxc.network.link = br0 lxc.network.flags = up </source> Pour un réseau privé : <source lang="bash">

lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 44:8a:5b:80:b8:3a

</source>

Commandes de gestion des conteneurs

Démarrage

Démarrage du conteneur en tache de fond

# lxc-start -n <NOM_CONTENEUR> -d

Démarrage du conteneur dans le terminal courant

# lxc-start -n <NOM_CONTENEUR> -F

ASTUCE

Pour changer le mot de passe root, on utilisera la commande suivante :
# lxc-attach -n <NOM_CONTENEUR> passwd

Console

Entrer dans la console du conteur (attach). Pour sortir, tapez <source lang="bash" inline>ctrl+a q</source>

# lxc-console -n <NOM_CONTENEUR>

Arrêter

Arrêter le conteneur (-k pour forcer)

# lxc-stop -n <NOM_CONTENEUR> [-k]

Supprimer

Supprimer un conteneur (-f pour forcer)

# lxc-destroy -n <NOM_CONTENEUR> [-f]

À noter qu'il est préférable d'utiliser la commande suivante pour supprimer un conteneur (j'ai déjà eu des mauvaises surprises avec l'autre commandes)

# rm -rf /var/lib/lxc/<NOM_CONTENEUR>

Lister

Lister les conteurs démarrés ou arrétés

# lxc-ls [--active | --stopped]

Lister les conteneur dans un tableau

# lxc-ls --fancy

Info

Savoir si un conteneur est allumé ou éteint

# lxc-info -n <NOM_CONTENEUR>

Sauvegarder et restaurer un conteneur

Sauvegarde

Sauvegarde (conserve automatiquement les permissions)

# ls /var/lib/lxc/
# tar czvf Nom_Conteneur_Date.tar.gz Nom_Conteneur

Restauration

Restaurer le conteneur (par défaut, l'option -p est activé et permet de conserver les permissions. Verifiez si c'est le cas le première fois)

# ls /var/lib/lxc/
# tar xzvf[p| --preserve-permissions] Nom_Conteneur_Date.tar.gz

Bonus

Script de génération d'adresse MAC

Voici un script de génération d'adresse MAC en fonction du nom du conteneur : <source lang="bash">

  1. !/bin/bash
if [ -n "$1" ]
    then
        OID="44:8a:5b"
        RAND=$(echo $1 | md5sum | sed 's/\(..\)\(..\)\(..\).*/\1:\2:\3/')
        echo "$OID:$RAND"
    else
        echo "ERREUR: Merci de soumettre un nom pour générer l'adresse MAC :"
        echo "       $FUNCNAME myhost"
fi

</source>

Activer la couleur dans le shell du conteneur

Par défaut, le shell Bash des conteneurs n'affichent pas de couleurs. Pour corriger ça il faut définir la variable <source lang="bash" inline>TERM</source> à <source lang="bash" inline>xterm-256color</source>

On peut mettre cette linge dans <source lang="bash" inline>/etc/environment</source>

TERM=xterm-256color

Informations utiles

  • Les conteneurs sont situés dans <source lang="bash" inline>/var/lib/lxc</source>
  • Les conteneurs étalons téléchargés sont stockés dans <source lang="bash" inline>/var/cache/lxc</source>
  • Le paquet contenant l'outil ping est <source lang="bash" inline>iputils-ping</source>
  • Pour fixer le DNS (qui est automatiquement récupéré par le DHCP) il faut installer le paquet <source lang="bash" inline>resolconf</source> et mettre une section dns-namerver <IP_DNS> dans le fichier <source lang="bash" inline>/etc/network/interfaces</source>
  • Détails des arguments <source lang="bash" inline>lxc.network</source> du fichier de config : https://linuxcontainers.org/fr/lxc/manpages/man5/lxc.container.conf.5.html

Sources