Aller au contenu
Virtualisation medium

Créer un conteneur LXC dans Proxmox VE

18 min de lecture

Logo Proxmox

Ce guide vous accompagne pour créer votre premier conteneur LXC dans Proxmox VE. Vous allez comprendre pourquoi choisir un conteneur plutôt qu’une VM, maîtriser les options de l’assistant de création (privileged vs unprivileged, nesting), et apprendre à gérer vos conteneurs en CLI avec pct. À la fin, vous aurez un conteneur Debian opérationnel, prêt à héberger vos services.

  • La différence entre conteneur LXC et VM KVM : quand choisir l’un ou l’autre
  • Privileged vs unprivileged : comprendre les implications de sécurité
  • Nesting : autoriser Docker ou d’autres conteneurs à l’intérieur
  • Créer un conteneur via l’interface web et en CLI avec pct
  • Les templates : où les trouver et comment les télécharger
  • Les commandes pct essentielles pour la gestion quotidienne
ÉlémentDétail
Proxmox VE installéVersion 8.x ou 9.x — guide d’installation
Interface web maîtriséeLes 3 niveaux Datacenter → Node → Guest — guide interface
Stockage configuréAu moins un stockage avec le type de contenu “CT Templates”
Réseau fonctionnelUn bridge configuré (vmbr0 par défaut)

Un conteneur LXC (Linux Container) partage le noyau Linux de l’hôte Proxmox. Contrairement à une VM qui émule un ordinateur complet avec son propre noyau, le conteneur n’est qu’un processus isolé. Résultat : démarrage instantané, empreinte mémoire minimale, performances natives.

CritèreVM KVMConteneur LXC
NoyauPropre noyau (Linux, Windows, BSD…)Noyau de l’hôte (Linux uniquement)
Démarrage10-60 secondes1-2 secondes
RAM minimum~256 Mo~32 Mo
IsolationForte (hyperviseur)Moyenne (namespaces + cgroups)
Overhead~2-5% CPU, RAM fixeQuasi nul
OS supportésTous (Windows, Linux, BSD…)Linux uniquement
Live migrationOuiNon (restart migration)

Analogie : si une VM est un appartement avec ses propres murs, plomberie et électricité, un conteneur est une chambre dans une colocation — plus léger, mais on partage les parties communes (le noyau).

C’est la question la plus importante lors de la création d’un conteneur.

ModeUID root dans le conteneurSécuritéCas d’usage
Unprivileged (défaut)Mappé vers UID 100000+Forte99% des cas — toujours préférable
Privileged= root de l’hôte (UID 0)FaibleCas spéciaux uniquement

Unprivileged : le root du conteneur (UID 0) est mappé vers un utilisateur non-privilégié de l’hôte (par exemple UID 100000). Même si un attaquant s’échappe du conteneur, il atterrit avec les droits d’un utilisateur lambda. C’est le mode par défaut depuis Proxmox VE 4.0 — gardez-le sauf cas précis.

Privileged : le root du conteneur = le root de l’hôte. Une faille d’évasion = accès root à votre serveur. L’équipe LXC considère ces conteneurs comme non sécurisés par design. N’utilisez que dans un environnement de confiance.

Le nesting expose /proc et /sys au conteneur, ce qui permet :

  • Docker ou Podman à l’intérieur du conteneur
  • D’autres conteneurs LXC imbriqués
  • Le fonctionnement de systemd pour isoler ses services

Nesting + unprivileged est la combinaison recommandée pour faire tourner Docker dans un conteneur Proxmox.

Avant de créer un conteneur, vous avez besoin d’un template — une image de base contenant un système Linux minimal.

  1. Accéder au gestionnaire de templates

    Dans l’interface Proxmox, allez dans : Node → local (ou votre stockage) → CT Templates

    ct-templates-view

  2. Télécharger un template depuis les dépôts

    Cliquez sur le bouton Templates. Une liste de templates officiels apparaît. Sélectionnez par exemple debian-12-standard puis cliquez sur Download.

    ct-templates-download

    Le téléchargement prend quelques secondes. Le template apparaît ensuite dans la liste.

En CLI avec pveam :

Fenêtre de terminal
# Mettre à jour la liste des templates disponibles
pveam update
# Lister les templates système disponibles
pveam available --section system
# Télécharger un template vers le stockage local
pveam download local debian-12-standard_12.7-1_amd64.tar.zst
# Lister les templates téléchargés
pveam list local
  1. Lancer l’assistant de création

    Cliquez sur le bouton bleu Create CT en haut à droite de l’interface. Un assistant en 7 étapes s’ouvre.

  2. Onglet General : identité du conteneur

    OptionValeur recommandéeExplication
    Node(votre nœud)Serveur où le CT sera créé
    CT ID(proposé auto)Numéro unique — gardez celui proposé
    Hostnamedebian-testNom d’hôte du conteneur
    Unprivileged containerCoché (défaut)Mode sécurisé — gardez-le
    Nesting✅ Coché si DockerNécessaire pour Docker/systemd
    Password(définir)Mot de passe root du conteneur

    general-tab

  3. Onglet Template : choisir l’image de base

    • Storage : local (ou votre stockage avec les templates)
    • Template : debian-12-standard_12.7-1_amd64.tar.zst

    template-tab

  4. Onglet Disks : stockage du conteneur

    OptionValeur recommandéeExplication
    Storagelocal-lvmStockage pour le rootfs
    Disk size (GiB)88 Go suffisent pour un conteneur de base

    disks-tab

  5. Onglet CPU : processeur

    OptionValeur recommandéeExplication
    Cores11 cœur suffit pour la plupart des services

    Le conteneur peut utiliser tous les cœurs de l’hôte si vous ne spécifiez pas de limite. La valeur “Cores” définit le maximum.

    cpu-tab

  6. Onglet Memory : mémoire vive

    OptionValeur recommandéeExplication
    Memory (MiB)512512 Mo — suffisant pour un conteneur minimal
    Swap (MiB)512Swap alloué au conteneur

    memory-tab

  7. Onglet Network : réseau

    OptionValeur recommandéeExplication
    Nameeth0Nom de l’interface dans le conteneur
    Bridgevmbr0Bridge par défaut de Proxmox
    IPv4DHCP ou IP statiqueChoisissez selon votre réseau
    Firewall✅ CochéActive le firewall Proxmox

    Pour une IP statique : entrez l’adresse au format CIDR (ex: 192.168.1.100/24) et la gateway (ex: 192.168.1.1).

    network-tab

  8. Onglet DNS : résolution de noms

    OptionValeur recommandéeExplication
    DNS domain(laisser vide)Hérite de l’hôte
    DNS servers(laisser vide)Hérite de l’hôte

    Par défaut, le conteneur utilise les DNS de l’hôte Proxmox. Vous pouvez spécifier des DNS personnalisés (ex: 1.1.1.1 pour Cloudflare).

  9. Onglet Confirm : vérifier et créer

    L’assistant affiche un récapitulatif. Vérifiez que Unprivileged est bien coché, puis cliquez sur Finish.

    Optionnel : cochez Start after created pour démarrer immédiatement.

    confirm-tab

L’interface web appelle pct create. Voici l’équivalent CLI :

Fenêtre de terminal
# Télécharger le template (si pas déjà fait)
pveam download local debian-12-standard_12.7-1_amd64.tar.zst
# Créer le conteneur
pct create 101 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \
--hostname debian-test \
--memory 512 \
--swap 512 \
--cores 1 \
--rootfs local-lvm:8 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp,firewall=1 \
--unprivileged 1 \
--features nesting=1 \
--password "VotreMotDePasseSecurise"
# Démarrer le conteneur
pct start 101

Trois méthodes pour ouvrir un shell dans votre conteneur :

Dans l’interface web : CT → Console. Une session getty s’ouvre, connectez-vous avec root et le mot de passe défini.

console

Si vous voulez faire tourner Docker dans un conteneur LXC, voici la configuration complète :

  1. Activer nesting et keyctl

    Fenêtre de terminal
    # Si le conteneur est déjà créé
    pct set 101 --features nesting=1,keyctl=1
    • nesting : expose /proc et /sys
    • keyctl : nécessaire pour Docker (gestion des clés du noyau)
  2. Redémarrer le conteneur

    Fenêtre de terminal
    pct reboot 101
  3. Installer Docker dans le conteneur

    Fenêtre de terminal
    pct enter 101
    # Dans le conteneur
    apt update && apt install -y curl
    curl -fsSL https://get.docker.com | sh
  4. Vérifier que Docker fonctionne

    Fenêtre de terminal
    docker run hello-world

Un bind mount permet d’accéder à un dossier de l’hôte Proxmox depuis le conteneur. Utile pour partager des données ou accéder à un stockage NFS.

Fenêtre de terminal
# Créer le dossier sur l'hôte
mkdir -p /mnt/bindmounts/shared
# Ajouter le bind mount au conteneur (conteneur arrêté)
pct set 101 --mp0 /mnt/bindmounts/shared,mp=/shared

Le dossier /mnt/bindmounts/shared de l’hôte devient /shared dans le conteneur.

Les commandes pct essentielles pour gérer vos conteneurs :

ActionCommandeNotes
Créer un CTpct create <ctid> <template> ...Voir exemple complet ci-dessus
Lister les CTpct listAffiche ID, statut, nom
Démarrerpct start <ctid>
Arrêter proprementpct shutdown <ctid>
Forcer l’arrêtpct stop <ctid>
Redémarrerpct reboot <ctid>
Entrer dans le CTpct enter <ctid>Shell root immédiat
Exécuter une commandepct exec <ctid> -- <cmd>Ex: pct exec 101 -- hostname
Voir la configpct config <ctid>
Modifier un paramètrepct set <ctid> --<option> <val>Ex: pct set 101 --memory 1024
Redimensionner disquepct resize <ctid> rootfs +5GAgrandir de 5 Go
Cloner un CTpct clone <ctid> <newctid>Clone complet
Créer un snapshotpct snapshot <ctid> <nom>
Supprimer un CTpct destroy <ctid>⚠️ Supprime aussi les données
SymptômeCause probableSolution
CT ne démarre pas : “permission denied”Stockage incompatible avec unprivilegedUtilisez un stockage de type dir ou zfspool (pas certains LVM)
Pas de réseauBridge mal configuréVérifiez que vmbr0 existe et est up sur l’hôte
Docker échoue : “keyctl” errorFeature keyctl manquantepct set <ctid> --features keyctl=1 puis reboot
Erreur mapping UIDBind mount avec unprivilegedAjustez les permissions du dossier sur l’hôte ou passez en privileged
CT démarre mais services échouentNesting manquant pour systemdpct set <ctid> --features nesting=1
Template non trouvéPas téléchargé ou mauvais storagepveam list local pour vérifier
”Resource busy” à la suppressionCT encore en cours d’exécutionpct stop <ctid> avant pct destroy
Erreur “TASK ERROR: CT is locked”Opération précédente interrompuepct unlock <ctid>
  1. Conteneur LXC = Linux uniquement, mais 10× plus léger qu’une VM. Idéal pour services Linux, Pi-hole, Home Assistant, Nginx…

  2. Unprivileged par défaut : gardez ce mode sauf cas très spécifique. C’est beaucoup plus sécurisé.

  3. Nesting + keyctl pour Docker : configurez ces features si vous voulez faire tourner Docker dans un conteneur.

  4. pct enter est votre meilleur ami : accès root instantané au conteneur sans authentification.

  5. Redimensionnement à chaud : contrairement aux VM, vous pouvez agrandir le disque d’un conteneur en cours d’exécution avec pct resize.

  6. Bind mounts avec précaution : ne montez jamais de dossiers système. Créez une arborescence dédiée sous /mnt/bindmounts/.

  7. Templates TurnKey : pensez-y pour déployer rapidement une application préconfigurée (WordPress, GitLab…).

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn