WSL上のUbuntuにNVIDIA Container Toolkitをセットアップする
WSL2 上の Ubuntu 24.04(noble)で NVIDIA Container Toolkit を正しくセットアップし、docker run / docker compose から GPU を使える状態にするまでの流れを、コマンドの意味と背景を添えて解説します。単なるコピペ手順ではなく、なぜこの順番で何をしているのかを理解するのがゴールです。
前提(このガイドが想定する環境)
- Windows 11 + WSL2 の Ubuntu 24.04(noble)
- Windows 側に NVIDIA ドライバが導入済み(WSL 対応)
- WSL 内で Docker Engine(dockerd) を直接使う想定(→ Docker Desktop のエンジンを使う場合は多くの設定が Desktop 側で吸収されます)
-
sudoが使えること
補足:WSL では GPU のカーネルドライバは Windows 側が担います。WSL 内では
nvidia-smiなどのユーザーランドと、Docker が GPU を使うためのランタイム(NVIDIA Container Toolkit)を用意すれば良い、という役割分担です。
セットアップコマンド
# 1) リポジトリと鍵(Ubuntu 24.04 / noble 想定)
sudo apt-get update
sudo apt-get install -y curl gpg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
| sudo gpg --dearmor -o /etc/apt/keyrings/nvidia-container-toolkit.gpg
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
| sed 's#deb https://#deb [signed-by=/etc/apt/keyrings/nvidia-container-toolkit.gpg] https://#' \
| sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
# 2) ツールキット導入
sudo apt-get install -y nvidia-container-toolkit
# 3) Docker に組み込み
sudo nvidia-ctk runtime configure --runtime=docker
# 4) デーモン再起動(WSL は systemd ないことがあるので両対応)
sudo systemctl restart docker 2>/dev/null || sudo service docker restart
# 5) ランタイム認識の確認("Runtimes: runc nvidia" と出ればOK)
docker info | grep -E 'Runtimes|Default Runtime'
# 6) テスト
docker run --rm --gpus all nvidia/cuda:12.6.2-runtime-ubuntu22.04 nvidia-smi
何をセットアップしているのか(全体像)
- APT の信頼設定:NVIDIA の公式リポジトリ鍵(GPG)を登録
-
APT のソース追加:
libnvidia-containerの安定版リポジトリを system に教える -
ツールキット導入:
nvidia-container-toolkitをインストール -
Docker 連携:
nvidia-ctkで Docker に NVIDIA ランタイムを登録 - Docker 再起動:設定反映
-
検証:
docker infoとnvidia/cudaイメージで動作確認
この 1→6 を通すと、Docker デーモンは --gpus all の要求を満たせるようになり、Compose の devices 予約も機能します。
ステップごとの深掘り
1) APT の下準備
sudo apt-get update
sudo apt-get install -y curl gpg
なぜ:外部リポジトリの鍵や list を取得するために curl と鍵登録用の gpg を入れます。apt-get update は既存ソースの索引更新。
2) 公式鍵を system keyring に保存
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
| sudo gpg --dearmor -o /etc/apt/keyrings/nvidia-container-toolkit.gpg
なぜ:APT はリポジトリのメタデータに署名があると、その署名をこの鍵で検証します。信頼できる配布元から来たことを確認する重要ステップです。--dearmor は ASCII 鍵をバイナリ形式に変換して keyring として使えるようにしています。
3) APT ソースを追加
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
| sed 's#deb https://#deb [signed-by=/etc/apt/keyrings/nvidia-container-toolkit.gpg] https://#' \
| sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
なぜ:APT に "どこを見に行けばパッケージが取れるか" を教えます。signed-by=... を付けて、そのリポジトリの検証にさきほどの鍵を使うよう明示しています。apt-get update で新規ソースの索引を取り込みます。
4) ツールキットを導入
sudo apt-get install -y nvidia-container-toolkit
なぜ:Docker が GPU を扱うためのランタイム(nvidia-container-runtime 等)と、要件チェックや設定用の nvidia-ctk を含むメタパッケージです。WSL の場合、カーネルモジュールは Windows 側にあるため、ここでは “ユーザーランド+ランタイム” を整備するイメージです。
5) Docker にランタイムを登録
sudo nvidia-ctk runtime configure --runtime=docker
なぜ:Docker デーモンの設定(通常は /etc/docker/daemon.json)に "runtimes": {"nvidia": { ... }} を自動で追記します。これにより Docker は --gpus や Compose の devices 予約を解釈し、NVIDIA ランタイム経由でコンテナを起動できるようになります。
6) Docker を再起動
sudo systemctl restart docker 2>/dev/null || sudo service docker restart
なぜ:デーモンの設定変更は再起動しないと反映されません。WSL は systemd が有効でないケースもあるので両対応コマンドにしています。
7) 動作確認
docker info | grep -E 'Runtimes|Default Runtime'
狙い:Runtimes: runc nvidia のように nvidia が並んでいることを確認。必要なら Default Runtime を runc のままにして、起動ごとに --gpus all を付ける運用でも問題ありません。
docker run --rm --gpus all nvidia/cuda:12.6.2-runtime-ubuntu22.04 nvidia-smi
狙い:ホストのドライバとコンテナの CUDA の 互換を実機で検証。nvidia-smi が GPU を列挙できれば成功です。
WSL 特有の注意点
-
nvidia-smiの場所:WSL では/usr/lib/wsl/lib/nvidia-smiにあります。PATH に通しておくと快適。 -
どの Docker デーモンを使っているか:
docker infoの Operating System が "Docker Desktop" と出るなら Desktop エンジン。Desktop を使う場合は GPU 有効化を Docker Desktop 側の設定で行うのが王道で、WSL 内にnvidia-container-toolkitを入れなくても動きます。 -
CUDA 版数の要件:コンテナのタグ(例:
12.9)がホストのドライバ最低要件を上回ると、nvidia-container-cli: requirement error: cuda>=...で落ちます。基本は ホストの “CUDA Version” 以下のタグを選ぶか、ホストドライバを更新します。
よくあるつまずき
-
Docker を再起動していない:設定反映されず
could not select device driver "" with capabilities: [[gpu]]が続発。 -
古いリポジトリ URL を使って 404:
stable/deb/nvidia-container-toolkit.listを使う(本記事のコマンド)。 -
Compose が GPU を掴めない:
deploy.resources.reservations.devices(capabilities: [gpu])の書式を確認。runtime: nvidiaは古い流儀。 -
WSL 内の
nvidia-smiが見つからない:PATH に/usr/lib/wsl/libを追加。