Introduction

  • LXD est une amélioration de LXC réalisé par Canonical.
  • LXD est un cousin de Docker, les deux logiciels reposent sur LXC, l'utilisation est toutefois totalement différente.
  • LXD est pré-installé sur les machines Ubuntu 16.04, 32 et 64 bits. Si vous voulez utiliser LXD, utilisez Ubuntu !
  • Il ne faut pas utiliser les anciennes commandes "lxc-xxxx" sur un serveur qui utilise lxd. La commande unique "lxc" remplace toutes les anciennes commandes.

Initialisation du serveur LXD

  • Installez complètement une Ubuntu 16.04. Pensez à la mettre à jour avec : apt-upgrade
  • Eventuellement, lancez : apt-get install lxd
  • Lancez la commande : lxd init
  • Répondre ensuite aux questions (normalement tout est par défaut) :
    • Do you want to configure a new storage pool : YES
    • Name of the storage backend to use : DIR
    • Would you like LXD to be available over the network : NO
    • Do you want to configure the LXD bridge : YES
    • Bridge interface name : lxdbr0
    • Do you want to setup an IPv4 subnet : YES
    • Ipv4 address : 192.168.222.1
    • Ipv4 CIDR mask : 24
    • First DHCP address : 192.168.222.2
    • Last DHCP address : 192.168.222.254
    • Max number of DHCP clients : 252
    • Do you want to NAT the IPv4 traffic : YES
    • Do you want to setup an IPv6 subnet : NO
  • NB : Je préfère utiliser le réseau en classe C 192.168.222.0/24 à la place du réseau qui est proposé par LXD 10.0.0.0/24

Commandes de gestion

  • NB : LXD utilise le dépôt d'images https://us.lxd.images.canonical.com

Utilisation du dépôt officiel " images: "

  • lxc image list images:                                      Liste de toutes les images du dépôt images
  • lxc image list images: debian amd64           Liste des images debian en 64 bits
  • lxc init images:debian/7 foo                           Création d'un container "foo" basé sur une image de debian7
  • lxc init local:foo_v1 foo                                   Création d'un container "foo" basé sur une image locale foo_v1

Commandes de gestion des containers

  • lxc list                                                                  Voir la liste des containers
  • lxc start foo                                                        Lancer le container "foo"
  • lxc stop foo                                                        Arrêter le container "foo"
  • lxc info foo                                                         Informations sur le container "foo"
  • lxc delete foo                                                    Effacer le container "foo"
  • lxc exec foo -- apt-get update                       Lance une commande sur "foo"
  • lxc exec foo -- /bin/bash                                  Pour avoir la main sur "foo"

Utilisation du dépôt local "local:"

  • lxc image list local:                                                        Liste de toutes les images locales
  • lxc publish foo --alias foo_v1                                       Création de l'image "foo_v1" à partir du container "foo"
  • lxc image export foo_v1 /root/foo_v1                        Création d'une archive foo_v1.tar.gz à partir de "foo_v1"
  • lxc image import foo_v1.tar.gz --alias foo_v1          Création d'une image "foo_v1" à partir de foo_v1.tar.gz
  • lxc init local:foo_v1 foo                                                 Création d'un container "foo" basé sur foo_v1

Options des containers

  • lxc config set foo boot.autostart true
  • lxc config set foo limits.memory 512MB
  • lxc config set foo limits.memory.swap false
  • lxc config set foo limits.memory.swap.priority 0
  • lxc config set foo limits.memory.enforce soft

Manipulation de fichiers

  • lxc file pull foo/etc/passwd /root/
  • lxc file push truc.tgz foo/root/

Configuration du Firewall

Dans /etc/rc.local, j'utilise le script suivant :

#!/bin/bash

sleep 3

# Nettoyage
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P INPUT ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

# Règle SNAT
REP=$(iptables -t nat -L|grep "MASQUERADE")
if [ -z "$REP" ]
then
  iptables -t nat -A POSTROUTING -s 192.168.222.0/24 ! -d 192.168.222.0/24 -j MASQUERADE
fi

# Exemple de règles DNAT
iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 80 -j DNAT --to-destination 192.168.222.2:80

Configuration du réseau virtuel (facultatif)

  • Sur la version 2.0 de LXD (Ubuntu 16.04), il faut modifier le fichier "/etc/default/lxd-bridge" : LXD-CONFILE="/etc/default/lxd-dhcp"
  • Puis créer un nouveau fichier "/etc/default/lxd-dhcp" avec :
dhcp-host=nginx,192.168.222.10
dhcp-host=srv2,192.168.222.11
  • Attention, les adresses IP doivent être dans la plage du DHCP !
  • Pour que les modifications soient prises en compte : service lxd-bridge restart