Table des matières

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