WSL2 (Ubuntu 24.04) 上でNVIDIA GPUを使ってOllamaとOpen WebUIをDockerで動かすための手順記録。
ollamaサービスとopen-webuiサービスの2つを定義。ollama側は以下でGPUを予約する構成になっている。
deploy:
resources:
reservations:
devices:
- driver: nvidia
capabilities: [gpu]
この予約を機能させるには、Docker側にNVIDIA Container Toolkitが導入され、nvidiaランタイムが登録されている必要がある。
docker --version
docker compose version
docker info 2>&1 | grep -i -E "runtime|error"
nvidia-smi
docker infoのRuntimesにnvidiaが 含まれていない ことを確認nvidia-smiはホスト側では正常に動作し、GPUを認識(WSL2のGPUパススルーは機能している)dpkg -l | grep nvidia-containerが空)→ このままではdocker compose up時にollamaコンテナがGPU予約でエラーになる可能性が高いと判断。
sudo権限が必要なため、ユーザー自身のターミナルで実行してもらった。
# 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
sudo apt update
signed-byを明示するのは、apt-key(非推奨)を使わずこのリポジトリ専用の鍵だけを紐付けるため。
sudo apt install -y nvidia-container-toolkit
以下がインストールされた(バージョン1.19.1-1):
libnvidia-container-toolslibnvidia-container1nvidia-container-toolkitnvidia-container-toolkit-basesudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
/etc/docker/daemon.jsonにnvidiaランタイムの定義が追記される。
docker info 2>&1 | grep -i -A2 "runtime"
# → Runtimes: io.containerd.runc.v2 nvidia runc
docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
コンテナ内からnvidia-smiでGPUが見えることを確認。
GPU動作確認のためのイメージpull時に以下のエラーが発生:
docker: error getting credentials - err: exec: "docker-credential-desktop.exe": executable file not found in $PATH
原因: ~/.docker/config.jsonにDocker Desktop用のcredsStore: "desktop.exe"が残っていたため。今回の環境はネイティブdockerd(Docker Desktopではない)なので、このヘルパーが存在せずエラーになっていた。
対応:
cp ~/.docker/config.json ~/.docker/config.json.bak
echo '{}' > ~/.docker/config.json
公開イメージのpullには認証情報が不要なため、credsStore設定を空にして解消。元の設定は~/.docker/config.json.bakにバックアップ済み。
docker compose up -d
ollama/ollama:latestとghcr.io/open-webui/open-webui:mainの両イメージをpull(Open WebUI側は数GB規模のため時間がかかる)。
docker compose ps
docker logs ollama --tail 10
docker logs open-webui --tail 10
curl -s http://localhost:11434/
curl -s -o /dev/null -w "webui http status: %{http_code}\n" http://localhost:3000/
結果:
ollama: Up、ログ上でCUDA0 / NVIDIA GeForce RTX 5060 TiをGPUとして認識(VRAM 15.9GiB)open-webui: Up (healthy)、HTTP 200http://localhost:11434/ → Ollama is runninghttp://localhost:3000/ → ブラウザからアクセス可能http://localhost:3000が他用途と競合するため、ポートを14000に変更し、あわせて同一LAN内の他端末からもアクセスできるようにした。
cat /mnt/c/Users/akira/.wslconfig
[wsl2]セクションにnetworkingMode=mirroredが設定済みであることを確認。mirroredモードでは、WSL2がWindowsホストとネットワークインターフェースを共有するため、WSL2側で0.0.0.0にバインドしたポートはWindows側のLAN IPでもそのまま待ち受けとなり、追加のポートフォワーディング(netsh interface portproxy等)は不要。
ip addr show
# → eth2: inet 192.168.68.122/24 (このPCのLAN IP。mirroredモードによりWindows側と同一)
docker-compose.yamlのopen-webuiサービスのポートマッピングを変更:
ports:
- "14000:8080" # 変更前は "3000:8080"
適用:
docker compose up -d
open-webuiコンテナのみ再作成される(ollama側は無変更のため再作成されない)。
mirroredモードではWindows Firewallがそのままトラフィックを制御するため、LAN内の他端末からアクセスするには受信許可ルールが必要。管理者権限が必要なため、ユーザー自身がPowerShellを管理者として実行:
New-NetFirewallRule -DisplayName "Open WebUI (14000)" -Direction Inbound -Protocol TCP -LocalPort 14000 -Action Allow
New-NetFirewallRule -DisplayName "Ollama API (11434)" -Direction Inbound -Protocol TCP -LocalPort 11434 -Action Allow
確認:
Get-NetFirewallRule | Where-Object {$_.DisplayName -like '*WebUI*' -or $_.DisplayName -like '*Ollama*'} | Select-Object DisplayName, Enabled, Direction, Action, Profile
curl -s -o /dev/null -w "%{http_code}\n" http://192.168.68.122:14000/
curl -s http://192.168.68.122:11434/
両方とも正常応答を確認。LAN内の別端末のブラウザからhttp://192.168.68.122:14000でアクセス可能。
192.168.68.122はDHCPによる割り当てのため、ルーターの再起動等で変わる可能性がある。固定したい場合はルーター側でこのPCのIPをDHCP予約しておくとよい。netsh interface portproxyによるポートフォワーディング設定が別途必要になる。docker-compose.yamlのversion: '3.8'はComposeの新しい仕様では非推奨(obsolete)警告が出るが、動作に支障はない。削除しても問題ない。nvidia-ctk runtime configureとdocker再起動、および最初のAPTリポジトリ追加はsudoが必要なため、エージェントからは実行できず、都度ユーザーに手動実行を依頼した。