Création et configuration de conteneurs LXC
Attention: Cette doc est conservée pour information uniquement, et ne correspond pas à l'infra mise en place chez Hadoly, qui utilise finalement LXD !
Préparation
Le système hôte fonctionne sous Jessie. Il suffit d'installer les outils LXC :
apt install lxc
Par défaut, la création de conteneur Debian utilisera le template /usr/share/lxc/templates/lxc-debian
. Ce template fonctionne pour créer des conteneurs jessie, mais ne semble pas très à jour (beaucoup de warnings à la création), et on peut avoir envie de customiser les paramètres d'installation.
À terme, il semble donc intéressant d'avoir notre propre template Debian pour LXC. Cela permettra d'avoir une configuration de base (miroir APT, ensemble de paquets de base, configuration du résolveur DNS, clés SSH, etc).
Préparation du réseau
Pour la configuration réseau de l'hôte (routage des IP d'un conteneur quand il démarre), copier ce script dans /etc/lxc/net-up.sh
:
#!/bin/sh # This script setups routing entries to reach a container. It assumes a pure L3 mode, # i.e. each container has a veth pair that is not part of any bridge. # # To use it, add this *at the end* of a container configuration: # lxc.network.script.up = /etc/lxc/net-up.sh # # Note : we assume that each container has a single interface, and is # configured with a /32 IPv4 address and /64 IPv6 prefix. interface="$5" [ -z "$interface" ] && exit 0 # We would like to use lxc-info, but it seems to deadlock if called when # a container is starting. Too bad. ipv4=$(grep 'lxc.network.ipv4 =' "$LXC_CONFIG_FILE" | cut -d '=' -f 2 | tr -d ' ') ipv6=$(grep 'lxc.network.ipv6 =' "$LXC_CONFIG_FILE" | cut -d '=' -f 2 | tr -d ' ') if [ -n "$ipv4" ] then ip route add "$ipv4" dev "$interface" || exit 1 fi if [ -n "$ipv6" ] then ip -6 route add "$ipv6" dev "$interface" || exit 1 fi
Création d'un conteneur
Pour créer un conteneur nom_du_conteneur
sous Jessie, il suffit de lancer :
export MIRROR=http://ftp.rezopole.net/debian lxc-create -n nom_du_conteneur -t debian -- -r jessie
Lorsque la création est finie, l'installeur affiche le mot de passe root du conteneur, à utiliser en console ou en SSH (et à changer, évidemment).
Avec la configuration par défaut, le système du conteneur sera installé à l'emplacement /var/lib/lxc/nom_du_conteneur/rootfs/
, et la configuration est dans /var/lib/lxc/nom_du_conteneur/config
. À noter qu'il est aussi possible de mettre le stockage du conteneur dans un volume LVM (cf. man lxc-create
).
Réseau
Architecture réseau
Pour le réseau, chaque conteneur a une interface virtuelle sur l'ĥôte.
Nous n'utilisons pas de bridge, pour avoir plus de contrôle sur les échanges réseau. L'hôte sert de routeur entre les différents conteneurs, et entre les conteneurs et Internet. Si du contrôle d'accès est nécessaire, iptables
et ip6tables
peuvent être utilisés sur l'ĥôte.
Le routage des IP des conteneurs est fait de manière statique (pas de DHCP).
On suppose que les IP des conteneurs sont déjà routées vers l'ĥôte (c'est à faire côté Grenode).
Configuration du réseau du conteneur
Résolveur DNS :
echo 'nameserver 91.216.110.110' > /var/lib/lxc/nom_du_conteneur/rootfs/etc/resolv.conf
Désactivation du DHCP sur eth0 :
echo 'auto lo' > /var/lib/lxc/nom_du_conteneur/rootfs/etc/network/interfaces echo 'iface lo inet loopback' >> /var/lib/lxc/nom_du_conteneur/rootfs/etc/network/interfaces
Ces modifications pourraient être intégrées directement dans le template LXC.
Configuration du réseau du conteneur, dans /var/lib/lxc/nom_du_conteneur/config
:
# Network configuration lxc.network.type = veth # Name of interface on host lxc.network.veth.pair = nom_du_conteneur # Name of interface inside container lxc.network.name = eth0 lxc.network.flags = up # IPv4 of the container lxc.network.ipv4 = 172.23.184.128/32 # IPv4 of the host lxc.network.ipv4.gateway = 172.23.184.123 # IPv6 of the container lxc.network.ipv6 = 2001:db8:42:128::1/64 # Link-local IPv6 of the host lxc.network.ipv6.gateway = fe80::1 lxc.network.script.up = /etc/lxc/net-up.sh
Démarrage du conteneur
Pour lancer un conteneur :
lxc-start -n nom_du_conteneur
Pour avoir une console :
lxc-console -n nom_du_conteneur
Pour lancer automatiquement un conteneur au boot :
echo "lxc.start.auto = 1" >> /var/lib/lxc/nom_du_conteneur/config
Références
man lxc
(le début n'est pas intéressant, mais la suite donne des exemples de commandes)man lxc.container.conf
pour la configuration des conteneurs- https://wiki.debian.org/LXC (attention, beaucoup d'informations sont vieilles et concernent squeeze et wheezy, pas jessie)
- https://www.stgraber.org/2013/12/20/lxc-1-0-blog-post-series/ (LXC 1.0 est la version de jessie)