DockerにおけるGPUエラー「could not select device driver」の修正方法

intermediate🐳 Docker2026-07-16| Ubuntu/Debian/CentOS, Docker Engine, NVIDIA GPU(プロプライエタリドライバ)

Error Message

Error response from daemon: could not select device driver "" with capabilities: [[gpu]]
#docker#nvidia#gpu#devops#cuda

このエラーが発生する理由

docker run --gpus allを実行した際、コンテナが起動する代わりに素っ気ないエラーメッセージが表示されることがあります。これは基本的に、DockerがGPU対応のドライバを探しているものの、見つけられないことを意味します。デフォルトの状態では、Dockerは標準のruncランタイムを使用します。runcはCPUやRAMの隔離には優れていますが、NVIDIAのハードウェアと通信する方法を認識していません。

これを修正するには、NVIDIA Container Toolkitという「翻訳者」が必要です。これがないと、Dockerは--gpusフラグが何を意味するのかさえ理解できません。

ステップ 1:ホストドライバの確認

すべてはベースとなるドライバから始まります。ホストOSがGPUを認識できていなければ、Dockerも当然認識できません。ターミナルを開いて以下を実行してください:

nvidia-smi

ドライバのバージョン(例:535.129.03)と、RTX 3080やA100などのGPUモデルが表示されたステータス表が表示されるはずです。もし「command not found」や通信エラーが表示される場合は、ここで作業を中断してください。Dockerを操作する前に、NVIDIAのプロプライエタリドライバをインストールする必要があります。

ステップ 2:NVIDIA Container Toolkitのインストール

Ubuntu 22.04、Debian、CentOSなど、最近のほとんどのLinux環境では同様の手順を踏みます。システムがツールキットのダウンロード先を認識できるように、NVIDIAの公式パッケージリポジトリを追加する必要があります。

まず、GPGキーとリポジトリリストを設定します:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

次に、パッケージリストを更新してツールキットをインストールします。ダウンロードサイズは小さく、通常は20MB以下です。

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

ステップ 3:NVIDIAランタイムの登録

ツールキットをインストールしただけでは不十分です。Dockerに対して、実際にそれを使用するように指示する必要があります。NVIDIAは、daemon.jsonファイルの構成を自動化する便利なユーティリティを提供しています。

sudo nvidia-ctk runtime configure --runtime=docker

このコマンドにより/etc/docker/daemon.jsonが更新されます。「nvidia」という名前の新しいランタイムが追加され、ツールキットのバイナリを参照するようになります。興味があれば、cat /etc/docker/daemon.jsonを実行して新しい設定ブロックを確認してみてください。

ステップ 4:再起動と動作確認

Dockerは起動時にのみ設定を読み込みます。変更を適用するためにサービスを再起動します:

sudo systemctl restart docker

いよいよ本番です。小さなCUDAコンテナを実行して、GPUにアクセスできるか確認しましょう。公式のNVIDIAイメージを使用して、コンテナの内部からnvidia-smiを実行します。

docker run --rm --gpus all nvidia/cuda:12.0-base-ubuntu22.04 nvidia-smi

ターミナルに見慣れたGPUの表が表示されれば成功です。表示されれば、ブリッジが正常に構築されたことになります。

Docker Composeのトラブルシューティング

もしDocker Composeを使用していて、まだエラーが発生する場合は、YAMLファイルに原因がある可能性があります。Composeでは、ハードウェアを予約するために特定のdeployブロックが必要です。docker-compose.ymlがバージョン3.8以上を使用していることを確認してください。

services:
  gpu-worker:
    image: nvidia/cuda:12.0-base-ubuntu22.04
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

安定稼働のためのプロのヒント

  • **WSL2ユーザー:**UbuntuのWSLディストリビューション内にはNVIDIAドライバをインストールしないでください。Windows側に最新のGame ReadyドライバまたはStudioドライバをインストールします。Docker Desktopが残りの処理を自動的に行います。
  • **カーネルアップデート:**LinuxカーネルのアップデートによってNVIDIAドライバが破損することがあります。ホスト側でnvidia-smiが動作しなくなった場合、Dockerも失敗します。通常、sudo apt install --reinstall nvidia-driver-<version>を実行することで解決します。
  • **パーシステンス(永続性):**本番環境では、sudo nvidia-smi -pm 1を使用してパーシステンスモードを有効にしてください。これによりドライバがロードされたままになり、コンテナの起動遅延が100〜200msほど短縮されます。

Related Error Notes