==== 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)