
Dans ce tutoriel, nous allons configurer une carte graphique NVIDIA sur Proxmox, la rendre disponible dans un conteneur LXC, puis l’exploiter dans Docker au sein de ce même conteneur.
L’exemple final porte sur l’installation de l’application Ollama pour l’IA qui utilisera l’accélération matériel de la carte graphique, mais la procédure s’applique à d’autres usages (Serveur multimedia Plex, encodage/décodage …).
Matériel et environnements testés
- Serveurs HP : ML110 G9 et Z840
- Cartes graphiques : Nvidia Quadro P6000 et Nvidia RTX 2080
Mais le plus important c’est :
-D’avoir du CPU Intel
-Une carte Nvidia assez récente en fonction des besoins pour pouvoir suivre ce tuto
-Le mode secure boot désactivé pour pouvoir charger le driver Nvidia (Et donc activer le mode legacy boot), par exemple pour HP :
https://support.hp.com/us-en/document/ish_6930187-6931079-16
-Que la carte graphique soit reconnu en faisant un lspci (dans mon cas une GeForce RTX 2080) :
root@ml110:~# lspci |grep NVIDIA
03:00.0 VGA compatible controller: NVIDIA Corporation TU104 [GeForce RTX 2080] (rev a1)
03:00.1 Audio device: NVIDIA Corporation TU104 HD Audio Controller (rev a1)
03:00.2 USB controller: NVIDIA Corporation TU104 USB 3.1 Host Controller (rev a1)
03:00.3 Serial bus controller: NVIDIA Corporation TU104 USB Type-C UCSI Controller (rev a1)
root@ml110:~#
Pour une config AMD, un autre tuto arrivera.
1. 🚀 Configuration de Proxmox
1.1. Modifier le fichier sources.list
nano /etc/apt/sources.list
Assurez-vous d’avoir les dépôts suivants (pour Proxmox 8 sur base Debian Bookworm) :
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
Note : Commentez (désactivez) le repository
ceph
et le repositorypve-enterprise
s’ils sont présents.
1.2. Mettre à jour le système
apt update
apt upgrade
1.3. Installer les dépendances
apt install pve-headers-$(uname -r) build-essential dkms wget libglvnd-dev sudo libglvnd0
1.4. Activer l’IOMMU dans GRUB
Éditez le fichier /etc/default/grub
:
nano /etc/default/grub
Dans la ligne contenant GRUB_CMDLINE_LINUX_DEFAULT
, ajoutez les paramètres intel_iommu=on iommu=pt
, par exemple :
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
Puis mettez à jour GRUB :
update-grub
1.5. Activer le regroupement des IOMMU (recommandé)
Créez ou modifiez les fichiers suivants :
echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu.conf
Puis mettez à jour initramfs
update-initramfs -u
Info : S’il y a eu une mise à jour du noyau (après
apt upgrade
), redémarrez la machine.
1.6. Désactiver le module nouveau
sudo modprobe -r nouveau
1.7. Installer le driver NVIDIA
(Exemple : version 550.144.03
– adaptez si nécessaire)
wget https://fr.download.nvidia.com/XFree86/Linux-x86_64/550.144.03/NVIDIA-Linux-x86_64-550.144.03.run
chmod +x NVIDIA-Linux-x86_64-550.144.03.run
./NVIDIA-Linux-x86_64-550.144.03.run --dkms
1.8. Charger les modules nécessaires
Modifiez le fichier /etc/modules
:
nano /etc/modules
Ajoutez-y :
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
# load nvidia modules
nvidia-drm
nvidia-uvm
1.9. Créer un fichier pour blacklist nouveau
nano /etc/modprobe.d/nvidia-installer-disable-nouveau.conf
Mettez-y :
blacklist nvidiafb
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
1.10. Règles udev pour gérer les périphériques NVIDIA
nano /etc/udev/rules.d/70-nvidia.rules
Ajoutez-y :
KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'"
KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'"
SUBSYSTEM=="module", ACTION=="add", DEVPATH=="/module/nvidia", RUN+="/usr/bin/nvidia-modprobe -m"
Activez immédiatement les règles :
udevadm control --reload-rules && udevadm trigger
1.11. Redémarrer Proxmox
reboot
1.12. Vérifier la présence des périphériques NVIDIA
Après reboot, vous devriez voir :
ls -lah /dev/nvidia*
Exemple :
crw-rw-rw- 1 root root 195, 0 Mar 4 19:03 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Mar 4 19:03 /dev/nvidiactl
crw-rw-rw- 1 root root 195, 254 Mar 4 19:03 /dev/nvidia-modeset
crw-rw-rw- 1 root root 510, 0 Mar 4 19:03 /dev/nvidia-uvm
crw-rw-rw- 1 root root 510, 1 Mar 4 19:03 /dev/nvidia-uvm-tools
/dev/nvidia-caps:
cr-------- 1 root root 237, 1 Mar 4 19:03 nvidia-cap1
cr--r--r-- 1 root root 237, 2 Mar 4 19:03 nvidia-cap2
On retrouve les numéros majeurs (ex. 195, 510 et 237) pour la configuration du LXC.
2. 🏷 Créer et configurer un conteneur LXC Debian 12
2.1. Créer un LXC Debian 12 privilégié, avec Nesting activé
Depuis l’interface Proxmox, créez un conteneur LXC Debian 12 et, dans l’onglet Options (ou Features selon la version) :
- Cochez Privileged (ou assurez-vous que la case “Unprivileged container” est désactivée).
- Activez l’option Nesting.
Vous pouvez également télécharger le template lxc debian et l’installer en ligne de commande :
pveam update
pveam available | grep debian-12-standard
Vous devriez voir la dernière version en date, dans notre cas :
system debian-12-standard_12.7-1_amd64.tar.zst
SI votre stockage est bien nommé local (par défaut en général dans proxmox) vous pouvez lancer :
pveam download local debian-12-standard_12.7-1_amd64.tar.zst
Lancez la création du LXC avec le template debian :
pct create 100 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \ --hostname debian12-nvidia \ --cores 4 \ --memory 4096 \ --swap 0 \ --rootfs local-lvm:20 \ --net0 name=eth0,bridge=vmbr0,ip=dhcp \ --features nesting=1 \ --unprivileged=0 \ --password TonMotDePasseIci
Dans cet exemple nous allons créer un LXC avec le template Debian précédement télécharger et les paramètres :
-Nom de machine : debian12-nvidia
-Nombre de core CPU : 4
-Taille RAM : 4096
-Taille SWAP :0
-Emplacement du stockage : local-lvm
-Carte réseau – Quel switch virtuel – Paramètres IP : vmbr0 en DHCP
-Activation de l’option Nesting pour Docker : nesting=1
-LXC en mode privilégié : –unprivileged=0
-Mot de passe root du LXC : TonMotDePasseIci
2.2. Éditer la configuration du LXC
Après création, éditez la conf (ex. ID 100) :
nano /etc/pve/lxc/100.conf
Ajoutez à la fin :
les instructions suivantes (en adaptant les numéros majeures grace à la commande ls -lah /dev/nvidia*
vue au point : 1.12. Vérifier la présence des périphériques NVIDIA) :
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 510:* rwm
lxc.cgroup2.devices.allow: c 237:* rwm
lxc.mount.entry: /dev/nvidia-caps dev/nvidia-caps none bind,optional,create=dir
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-caps dev/nvidia-caps none bind,optional,create=dir,mode=0777
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-caps/nvidia-cap1 none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-caps/nvidia-cap2 none bind,optional,create=file
2.3. Démarrer le LXC et y transférer le driver NVIDIA
Sur l’hôte Proxmox :
pct start 100
pct push 100 /root/NVIDIA-Linux-x86_64-550.144.03.run /root/NVIDIA-Linux-x86_64-550.144.03.run
(Adaptez le chemin si nécessaire.)
2.4. Configurer la Debian du LXC
Dans le conteneur (SSH ou console Proxmox) :
lxc-attach 100
nano /etc/apt/sources.list
Ajoutez (ou vérifiez) :
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
Puis :
apt update
apt upgrade
apt install gpg curl wget
3. 🎉 Installer NVIDIA Container Toolkit
Parfois, le paquet nvidia-container-toolkit
n’est pas dans les dépôts. Pour l’installer directement depuis NVIDIA :
Ajouter la clé GPG officielle :
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/debian11/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
Mettre à jour :
apt update
Installer nvidia-container-toolkit
:
apt install -y nvidia-container-toolkit
Ajuster la config (si besoin) :
nano /etc/nvidia-container-runtime/config.toml
Pour ajouter ou vérifier :
no-cgroups = true
4. 🔧 Installer le driver NVIDIA dans le LXC
Dans le conteneur :
chmod +x NVIDIA-Linux-x86_64-550.144.03.run
./NVIDIA-Linux-x86_64-550.144.03.run --no-kernel-module
L’option
--no-kernel-module
est utilisée car le module du noyau est déjà géré par l’hôte Proxmox.
Vérifiez :
ls -lah /dev/nvidia*
nvidia-smi
Vous devriez voir vos périphériques NVIDIA et avoir accès à la carte via nvidia-smi
:
root@NVIDIA-TESTS:~# ls -lah /dev/nvidia*
crw-rw-rw- 1 root root 195, 254 Mar 6 13:41 /dev/nvidia-modeset
crw-rw-rw- 1 root root 510, 0 Mar 6 13:41 /dev/nvidia-uvm
crw-rw-rw- 1 root root 510, 1 Mar 6 13:41 /dev/nvidia-uvm-tools
crw-rw-rw- 1 root root 195, 0 Mar 6 13:41 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Mar 6 13:41 /dev/nvidiactl
/dev/nvidia-caps:
total 0
drw-rw-rw- 2 root root 80 Mar 6 13:41 .
drwxr-xr-x 8 root root 620 Mar 6 14:00 ..
crw-rw-rw- 1 root root 510, 1 Mar 6 13:41 nvidia-cap1
crw-rw-rw- 1 root root 510, 1 Mar 6 13:41 nvidia-cap2

5. 🐳 Installer Docker dans le LXC
Ajouter la clé GPG Docker et le dépôt :
apt-get update
apt-get install ca-certificates curl sudo
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
Installer Docker :
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Configurer Docker pour utiliser le runtime NVIDIA par défaut :
nano /etc/docker/daemon.json
Ajoutez :
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
Redémarrer Docker :
systemctl restart docker
6. 🤖 Exemple : Déployer Ollama (IA) via Docker Compose
6.1. Préparer le dossier et le fichier docker-compose.yml
mkdir ollama
cd ollama
nano docker-compose.yml
Exemple de configuration :
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama:/root/.ollama
pull_policy: always
tty: true
restart: unless-stopped
environment:
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=all
- OLLAMA_ACCELERATOR=cuda
- CUDA_VISIBLE_DEVICES=0
- OLLAMA_FORCE_CUDA=1
- OLLAMA_USE_CUDA=1
devices:
- /dev/nvidia0:/dev/nvidia0
- /dev/nvidiactl:/dev/nvidiactl
- /dev/nvidia-uvm:/dev/nvidia-uvm
- /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools
- /dev/nvidia-modeset:/dev/nvidia-modeset
- /dev/nvidia-caps:/dev/nvidia-caps
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
runtime: nvidia
ollama-webui:
image: ghcr.io/ollama-webui/ollama-webui:main
container_name: ollama-webui
ports:
- "3000:8080"
volumes:
- ollama-webui:/app/backend/data
depends_on:
- ollama
environment:
- 'OLLAMA_API_BASE_URL=http://ollama:11434/api'
restart: unless-stopped
volumes:
ollama: {}
ollama-webui: {}
6.2. Lancer les conteneurs
Toujours dans le répertoire ollama
:
docker compose up -d
6.3. Optionnel : Installer Portainer
Pour gérer vos conteneurs plus facilement, vous pouvez installer Portainer :
docker run -d -p 8000:8000 -p 9443:9443 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:lts
7. 🔎 Vérification du fonctionnement d’Ollama
Consultez les logs pour vérifier que votre GPU est détecté. Par exemple :
docker logs -f ollama
time=2025-03-04T18:47:34.093Z level=INFO source=gpu.go:217 msg="looking for compatible GPUs"
time=2025-03-04T18:47:34.450Z level=INFO source=types.go:130 msg="inference compute" ...
name="NVIDIA GeForce RTX 2080" total="7.8 GiB" available="7.7 GiB"
ou par exemple :
time=2025-03-04T20:05:05.414Z level=INFO source=types.go:130 msg="inference compute" ...
name="Quadro P6000" total="23.9 GiB" available="23.7 GiB"
Tant qu’il affiche bien le nom de la carte, c’est que la configuration fonctionne !

🎉 Conclusion
Vous disposez désormais d’un système Proxmox avec une carte NVIDIA pass-through dans un conteneur LXC (privilégié, Nesting activé) et exploitable dans Docker.
Cette configuration permet notamment d’exécuter des tâches d’IA comme Ollama, ou tout autre outil GPU, dans vos conteneurs.
Vous pouvez bien évidement utiliser la carte graphique simultanément sur plusieurs LXC et plusieurs Dockers
Points essentiels :
- Vérifiez toujours que le pilote NVIDIA de l’hôte Proxmox est correctement installé et que
nvidia-smi
fonctionne. - Le conteneur LXC doit être privilégié et autoriser l’accès aux périphériques
nvidia*
etnvidia-caps
. - Le runtime
nvidia-container-runtime
est indispensable pour Docker. - Adaptez les versions de driver et de paquets à vos besoins matériels et logiciels.
8. 🔎 Debugging
8.1. Dans le cas ou ça à marché mais ça ne marche plus :
Dans le cas ou ça à marché mais ça ne marche plus et que vous voyez dans les logs ollama :
time=2025-03-06T18:37:14.645Z level=INFO source=gpu.go:217 msg="looking for compatible GPUs"
time=2025-03-06T16:37:14.671Z level=WARN source=gpu.go:605 msg="unknown error initializing cuda driver library /usr/lib/x86_64-linux-gnu/libcuda.so.550.144.03: cuda driver library init failure: 999. see https://github.com/ollama/ollama/blob/main/docs/troubleshooting.md for more information"
time=2025-03-06T18:37:14.689Z level=INFO source=gpu.go:377 msg="no compatible GPUs were discovered"
time=2025-03-06T16:37:14.689Z level=INFO source=types.go:130 msg="inference compute" id=0 library=cpu variant="" compute="" driver=0.0 name="" total="125.7 GiB" available="123.0 GiB"
Vérifiez à nouveau sur proxmox les numéro majeure des interfaces :
ls -lah /dev/nvidia*
Exemple :
crw-rw-rw- 1 root root 195, 0 Mar 4 19:03 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Mar 4 19:03 /dev/nvidiactl
crw-rw-rw- 1 root root 195, 254 Mar 4 19:03 /dev/nvidia-modeset
crw-rw-rw- 1 root root 510, 0 Mar 4 19:03 /dev/nvidia-uvm
crw-rw-rw- 1 root root 510, 1 Mar 4 19:03 /dev/nvidia-uvm-tools
/dev/nvidia-caps:
cr-------- 1 root root 237, 1 Mar 4 19:03 nvidia-cap1
cr--r--r-- 1 root root 237, 2 Mar 4 19:03 nvidia-cap2
On retrouve les numéros majeurs (ex. 195, 510 et 237) pour la configuration du LXC.
Et vérifiez qu’ils sont identiques à ceux de la config LXC :
root@ml110:~# cat /etc/pve/lxc/100.conf
arch: amd64
cores: 4
features: nesting=1
hostname: NVIDIA-TESTS
memory: 4096
net0: name=eth0,bridge=vmbr0,hwaddr=BC:24:11:AF:CE:A0,ip=dhcp,type=veth
onboot: 1
ostype: debian
rootfs: local-lvm:vm-100-disk-0,size=20G
swap: 0
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 510:* rwm
lxc.cgroup2.devices.allow: c 237:* rwm
lxc.mount.entry: /dev/nvidia-caps dev/nvidia-caps none bind,optional,create=dir
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-caps dev/nvidia-caps none bind,optional,create=dir,mode=0777
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-caps/nvidia-cap1 none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-caps/nvidia-cap2 none bind,optional,create=file
relancez votre LXC :
pct stop 100 && pct start 100
Connectez-vous au conteneur LXC :
root@ml110:~# lxc-attach 100
Et vérifiez à nouveau les logs ollama :
root@NVIDIA-TESTS:~# docker logs -f ollama
...
time=2025-03-06T18:38:39.326Z level=INFO source=gpu.go:217 msg="looking for compatible GPUs"
time=2025-03-06T18:38:40.310Z level=INFO source=types.go:130 msg="inference compute" id=GPU-000a74e5-c3c6-1f93-1295-5a276ecbeed4 library=cuda variant=v12 compute=7.5 driver=12.4 name="NVIDIA GeForce RTX 2080" total="7.8 GiB" available="7.7 GiB"
Si vous voyez à nouveau votre GPU, ça devrait fonctionner sans problèmes !

8.2. Dans le cas le driver NVIDIA-Linux-x86_64-550.144.03.run
ne veut pas s’installer :
Si vous bloquez dès l’installation de l’exécutable Nvidia, il est fort probable que vous ayez des drivers nvidia deja installé avec le gestionnaire de dépot debian (apt);
Lancez donc ces commandes pour supprimer tous les drivers Nvidia installés :
apt remove --purge '^nvidia-.*' '^libnvidia-.*' '^cuda-.*' '^libcuda.*' -y
apt autoremove -y
apt clean
rm -rf /etc/modprobe.d/nvidia.conf
rm -rf /etc/modules-load.d/nvidia.conf
rm -rf /etc/X11/xorg.conf.d/10-nvidia.conf
rm -rf /usr/local/cuda*
rm -rf /etc/apt/sources.list.d/cuda.list
rm -rf /var/lib/dkms/nvidia/
rm -rf /usr/lib/nvidia
rm -rf /usr/share/nvidia
rm -rf /var/cache/nvidia-installer
update-initramfs -u
Et recommencez le tuto à partir du point 1.6. Désactiver le module nouveau
8.3. Pour tout autre cas :
Si vous n’arrivez toujours pas à faire fonctionner votre carte Nvidia, je vous invite à poster un commentaire avec un max d’indications, logs etc …
Bonne continuation et bon usage de votre GPU !
✨🚀