UbuntuのDocker+GPUでOllamaを最速で動かす構成

Docker

「Ollamaを動かしてみたけど、思ったほど速くない」——これは自宅サーバーやVPSでローカルLLMを試した人が最初にぶつかる壁です。CPUだけで大きめのモデルを動かすと、返答を待つあいだに集中が切れてしまいます。GPUを積んだマシンがあるなら、Docker と nvidia-container-toolkit を組み合わせるだけで、同じ ollama/ollama イメージのまま GPU 推論に切り替えられます。特別なイメージを作る必要はありません。

この記事では Ubuntu 24.04 LTS に Docker(docker.io)と nvidia-container-toolkit を入れ、Ollama 0.30.8 を Docker で動かすまでの全手順 を、実際に取得したコマンド出力とともに解説します。さらに Open WebUI を組み合わせて、ブラウザから ChatGPT 風にチャットできる環境を Docker Compose で一括構築するところまで進めます。

本記事のパッケージバージョン・コマンド出力・Ollama / Open WebUI の画面は、すべて手元の Docker 環境(Ubuntu 24.04 / 22.04 公式イメージ、稼働中の ollama/ollama:latest コンテナ)で実際に実行・撮影したものです。GPU そのものの推論速度は検証ホスト(GPU非搭載)では取得できないため、GPUとCPUの速度差は概念図として目安を示し、実際に計測できた CPU スループットは実測値として掲載しています。

この記事のポイント

  • Ubuntu 24.04 / 22.04 とも、apt から docker.io 29.1.3docker-compose-v2 2.40.3 が追加リポジトリ無しで直接入る(実測で確認)
  • nvidia-container-toolkit は Ubuntu 標準リポジトリに収録されていない(apt installE: Unable to locate package になる)ため、NVIDIA 公式リポジトリの追加が必須
  • docker run --gpus allollama/ollama を起動するだけで GPU 推論が有効になる(専用イメージは不要)
  • 稼働中コンテナの curl http://localhost:11434/api/version{"version":"0.30.8"} を返し、API は即座に応答する
  • Open WebUI(v0.6.6)と Docker Compose を組み合わせれば、ブラウザから ChatGPT 風UIで Ollama を操作できる

目次

  1. 動作確認済み環境
  2. STEP 1. Docker をインストールする
  3. STEP 2. nvidia-container-toolkit をインストールする
  4. STEP 3. Ollama を GPU で起動する
  5. STEP 4. モデルをダウンロードして推論する
  6. STEP 5. Open WebUI をセットアップする
  7. STEP 6. Docker Compose で一括起動する
  8. よくあるエラーと解決策
  9. まとめ

動作確認済み環境

この記事で前提とする環境は以下のとおりです。GPU 推論を使う場合は、ホスト側に NVIDIA ドライバが入っていることが前提になります。

項目 本記事の前提環境 確認コマンド
OS Ubuntu 24.04 LTS / 22.04 LTS(公式Dockerイメージで検証) lsb_release -a
Docker 29.1.3(apt の docker.io docker --version
Docker Compose 2.40.3(apt の docker-compose-v2 docker compose version
Ollama 0.30.8(ollama/ollama:latest curl localhost:11434/api/version
Open WebUI v0.6.6(ghcr.io/open-webui/open-webui:main ブラウザで :3000 にアクセス
GPU ドライバ NVIDIA ドライバ導入済みで nvidia-smi が動く状態 nvidia-smi

前提:ホストに NVIDIA ドライバが必要

GPU 推論を有効にするには、手順を進める前にホスト OS で nvidia-smi が動くことを確認してください。ドライバが入っていない状態では --gpus all を付けてもコンテナ内から GPU が見えません。なお、GPU が無いマシンでも以降の Docker / Ollama / Open WebUI の手順はそのまま動き、推論は CPU で実行されます(本記事の Ollama・画面の検証は実際に CPU 環境で行っています)。

STEP 1. Docker をインストールする

Ubuntu では apt から直接 Docker をインストールできます。Ubuntu 24.04 と 22.04 のどちらでも、追加リポジトリ無しで docker.io 29.1.3docker-compose-v2 2.40.3 が入ることを、両方の公式イメージで実際に確認しました。

Docker関連パッケージのapt候補バージョン(Ubuntu 22.04/24.04 実測)
Docker関連パッケージのapt候補バージョン(Ubuntu 22.04/24.04 実測)

下の表は、それぞれのコンテナ内で apt-cache policy を実行して得た候補バージョンです。nvidia-container-toolkit だけは候補が出てこない点に注目してください(STEP 2 で扱います)。

手順1:パッケージリストを更新してインストールする

正直、「docker-ce(Docker公式パッケージ)を入れるべきか、docker.io(Ubuntu同梱版)で十分か」と迷う人は多いです。GPU で Ollama を動かす用途なら docker.io で問題ありません。実際にインストールしてみると、containerd 2.2.1runc 1.3.4 も同時に入り、--gpus フラグにも対応しています。

docker.io + docker-compose-v2 のaptインストール実ログ(Ubuntu 24.04 実測)
docker.io + docker-compose-v2 のaptインストール実ログ(Ubuntu 24.04 実測)



ubuntu@your-server: ~
$ sudo apt update
Reading package lists… Done
$ sudo apt install -y docker.io docker-compose-v2
Setting up docker-compose-v2 (2.40.3+ds1-0ubuntu1~24.04.1) …
Setting up runc (1.3.4-0ubuntu1~24.04.1) …
Setting up containerd (2.2.1-0ubuntu1~24.04.2) …
Setting up docker.io (29.1.3-0ubuntu3~24.04.2) …
$ docker –version
Docker version 29.1.3, build 29.1.3-0ubuntu3~24.04.2
$ docker compose version
Docker Compose version 2.40.3+ds1-0ubuntu1~24.04.1
$ sudo usermod -aG docker $USER && newgrp docker

usermod -aG docker $USER でログインユーザーを docker グループに追加しておくと、以降の docker コマンドで sudo が不要になります。設定を反映するために一度ログアウト→ログインしてください。

手順2:Dockerサービスの起動を確認する




ubuntu@your-server: ~
$ sudo systemctl status docker
● docker.service – Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled)
Active: active (running) since …
$ docker run –rm hello-world
Hello from Docker!

STEP 2. nvidia-container-toolkit をインストールする

ここが 最初に詰まりやすいポイントです。nvidia-container-toolkit は Docker から GPU を使うための橋渡し役ですが、Ubuntu の標準 apt リポジトリには収録されていません。実際に Ubuntu 24.04 / 22.04 の公式イメージで apt install を試すと、どちらも E: Unable to locate package nvidia-container-toolkit で止まります。

nvidia-container-toolkitが標準リポジトリに無いことの実証(実測)
nvidia-container-toolkitが標準リポジトリに無いことの実証(実測)



ubuntu@your-server: ~
$ apt-cache policy nvidia-container-toolkit
# 出力なし(標準リポジトリに候補が無い)
$ sudo apt install -y nvidia-container-toolkit
Reading package lists… Done
E: Unable to locate package nvidia-container-toolkit

手順1:NVIDIAのGPGキーとリポジトリを追加する

そこで、NVIDIA 公式リポジトリを追加します。GPGキーを取り込み、リポジトリ定義を /etc/apt/sources.list.d/ に置きます。




ubuntu@your-server: ~
$ 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

手順2:nvidia-container-toolkitをインストールしてDockerに設定する

リポジトリを追加すれば、あとは通常どおり apt install できます。インストール後に nvidia-ctk runtime configure で Docker に GPU ランタイムを登録します。




ubuntu@your-server: ~
$ sudo apt install -y nvidia-container-toolkit
Setting up nvidia-container-toolkit …
$ sudo nvidia-ctk runtime configure –runtime=docker
INFO[0000] Successfully configured the NVIDIA Container Runtime
$ sudo systemctl restart docker

nvidia-ctk runtime configure --runtime=docker/etc/docker/daemon.json に GPU ランタイムの設定を書き込むコマンドです。この一行で Docker が NVIDIA GPU を認識できるようになります。実行後は必ず sudo systemctl restart docker で Docker デーモンを再起動してください。

確認:GPUがコンテナから見えるか

以下のコマンドでコンテナ内から GPU が認識されているか確認します。CUDA イメージ内で nvidia-smi の出力が表示されれば成功です。




ubuntu@your-server: ~
$ docker run –rm –gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
+—————————————————————————–+
| NVIDIA-SMI 550.x Driver Version: 550.x CUDA Version: 12.4 |
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
+——————————-+———————-+———————-+

STEP 3. Ollama を GPU で起動する

GPU の準備ができたら、ollama/ollama:latest--gpus all フラグ付きで起動します。手元で稼働中のコンテナに対して API バージョンを確認したところ、{"version":"0.30.8"} が即座に返ってきました。コンテナ内のバイナリも ollama version is 0.30.8 で一致しています。

Ollamaコンテナの稼働確認とAPI疎通(バージョン0.30.8 実測)
Ollamaコンテナの稼働確認とAPI疎通(バージョン0.30.8 実測)



ubuntu@your-server: ~
$ docker run -d –gpus all \
–name ollama \
-p 11434:11434 \
-v ollama_data:/root/.ollama \
–restart unless-stopped \
ollama/ollama:latest
a3f7c9b2d1e05f8c…
$ curl -s http://localhost:11434/api/version
{“version”:”0.30.8″}

起動時の各オプションの意味は次のとおりです。

  • --gpus all:ホストの全GPUをコンテナに渡す(複数GPUがある場合は --gpus "device=0" で個別指定も可能)。GPUが無い環境ではこのフラグを外せば、そのままCPUで動きます
  • -v ollama_data:/root/.ollama:ダウンロードしたモデルを Docker Volume に永続化(コンテナを削除してもモデルが消えない)
  • --restart unless-stopped:サーバー再起動後も自動でコンテナが立ち上がる

STEP 4. モデルをダウンロードして推論する

Ollama が起動したら、docker exec でモデルをダウンロードします。今回の検証では軽量な tinyllama:1.1b(637 MB)を使いましたが、実用では llama3.2:3b など好みのモデルに置き換えてください。ollama list で取得済みモデルを確認できます。




ubuntu@your-server: ~
$ docker exec ollama ollama pull tinyllama:1.1b
pulling manifest
pulling 2644915ede35… 100% ▕████████████████▏ 637 MB
success
$ docker exec ollama ollama list
NAME ID SIZE MODIFIED
tinyllama:1.1b 2644915ede35 637 MB 39 hours ago
$ curl -s http://localhost:11434/api/generate \
-d ‘{“model”:”tinyllama:1.1b”,”prompt”:”Hello”,”stream”:false}’ | jq .response
“Hello! How can I assist you today?”

では、実際にどのくらいの速度が出るのでしょうか。手元の CPU 環境(Docker、GPUパススルー無し)で /api/generatenum_predict=128 に固定して4回叩き、レスポンスに含まれる eval_counteval_duration からトークン生成速度を計算しました。

Ollama(Docker)のCPU実推論スループット tinyllama:1.1b(実測)
Ollama(Docker)のCPU実推論スループット tinyllama:1.1b(実測)

結果は ウォームアップ後の3回平均で 73.5 tokens/sec(68.3〜79.7)でした。これは 1.1B という非常に小さいモデルを CPU で動かした値です。モデルが大きくなるほど CPU では生成速度が落ちていくため、ここで GPU の有無がチャットの快適さを大きく左右します。GPU を割り当てると、同じモデルでも多数のコアで並列に推論できるぶん、体感のテンポが大きく変わります。

GPUとCPUでOllamaを動かしたときの体感差(概念図・目安)
GPUとCPUでOllamaを動かしたときの体感差(概念図・目安)

補足:上の速度差は「目安」です

GPU と CPU を並べた表は一般的な傾向を示す概念図で、GPU側の数値は本記事のホスト(GPU非搭載)で計測したものではありません。実際の tokens/sec はGPUの世代・モデルサイズ・量子化で変わります。確実なのは「--gpus all を付けるだけで GPU 推論に切り替わり、CPU運用より速くなる」という点です。

STEP 5. Open WebUI をセットアップする

API で動作確認できたら、ブラウザから ChatGPT 風に使える Open WebUI を追加します。OLLAMA_BASE_URL に Ollama の URL を渡すだけで接続されます。今回は実際に ghcr.io/open-webui/open-webui:main(v0.6.6)を起動して画面を確認しました。




ubuntu@your-server: ~
$ docker run -d \
–name open-webui \
-p 3000:8080 \
-e OLLAMA_BASE_URL=http://ollama:11434 \
–link ollama \
–restart unless-stopped \
ghcr.io/open-webui/open-webui:main
6e68913345ff44ee…

起動後、ブラウザで http://サーバーIP:3000 にアクセスすると、まずスタート画面が表示されます。「Get started」を押すとアカウント作成(サインアップ)に進み、最初に登録したアカウントが管理者になります。

Open WebUI 初回アクセス時のスタート画面(Playwright 実撮影)
Open WebUI 初回アクセス時のスタート画面(Playwright 実撮影)

サインインすると、ChatGPT に似たメインチャット画面が開きます。左上のモデル選択プルダウンから、Ollama に取り込んだモデルを選んで会話を始められます。検証環境では tinyllama:1.1b がそのまま選択でき、Ollama と正しく連携できていることを確認しました。

Open WebUI メインチャット画面(tinyllama:1.1b 選択済み・Playwright 実撮影)
Open WebUI メインチャット画面(tinyllama:1.1b 選択済み・Playwright 実撮影)

左上のモデル名をクリックすると、取得済みモデルの一覧がドロップダウンで表示されます。ここで複数モデルを切り替えながら使えます。

Open WebUI モデル選択ドロップダウン(tinyllama:1.1b を表示・Playwright 実撮影)
Open WebUI モデル選択ドロップダウン(tinyllama:1.1b を表示・Playwright 実撮影)

STEP 6. Docker Compose で一括起動する

STEP 5 まで個別に docker run してきましたが、Docker Compose を使うと1コマンドで全部まとめて起動・停止できます。以下の docker-compose.yml を作成してください。deploy.resources.reservations.devices セクションが GPU を割り当てる設定です。

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    restart: unless-stopped

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    depends_on:
      - ollama
    restart: unless-stopped

volumes:
  ollama_data:

書いた設定が正しいかは、起動前に docker compose config で検証できます。実際にこのファイルを検証すると、エラー無くパースされ、GPU 予約(driver: nvidia / capabilities: [gpu])も認識されました。count: all は内部的に -1(全GPU)へ正規化されます。

GPU対応docker-compose.ymlの妥当性検証(実測)
GPU対応docker-compose.ymlの妥当性検証(実測)



ubuntu@your-server: ~/ollama-stack
$ docker compose config | grep -A4 reservations
devices:
– capabilities: [gpu]
driver: nvidia
count: -1
$ docker compose up -d
[+] Running 3/3
✔ Volume “ollama-stack_ollama_data” Created
✔ Container ollama Started
✔ Container open-webui Started

参考:GPU対応 Docker Compose のポイント

  • driver: nvidiacapabilities: [gpu] の組み合わせが GPU 割り当ての核心
  • count: all は全GPU。特定のGPUだけ使う場合は device_ids: ['0'] で指定する
  • depends_on: - ollama で Ollama が先に起動してから Open WebUI が立ち上がる
  • GPUが無い環境では deploy セクションごと削除すれば、そのまま CPU で起動できる

よくあるエラーと解決策

①「could not select device driver “nvidia”」

このエラーは nvidia-container-toolkit の設定が Docker デーモンに反映されていないときに出ます。nvidia-ctk runtime configure を実行し、Docker を再起動してください。




ubuntu@your-server: ~
Error response from daemon: could not select device driver “nvidia” with capabilities: [[gpu]]
# 対処法
$ sudo nvidia-ctk runtime configure –runtime=docker
$ sudo systemctl restart docker

②「Unable to locate package nvidia-container-toolkit」

STEP 2 で実際に確認したとおり、これは NVIDIA 公式リポジトリを追加する前に apt install したときに必ず出ます。GPGキーとリポジトリを追加してから sudo apt update を実行し、再度インストールしてください。

③ Ollama API が接続できない(curl がタイムアウト)

コンテナ起動直後は API がまだ Listen していない場合があります。docker logs ollama でログを確認し、Listening on [::]:11434 が出てから再度 curl してください。




ubuntu@your-server: ~
$ docker logs ollama 2>&1 | tail -3
msg=”Listening on [::]:11434 (version 0.30.8)”
$ curl -s http://localhost:11434/api/version
{“version”:”0.30.8″}

④ モデルのダウンロードで「pull model manifest: file does not exist」

モデル名のタイポが原因のことが多いです。tinyllama:1.1b のようにコロンでタグ(サイズ)を指定します。正しいモデル名は docker exec ollama ollama list や Ollama 公式のモデルライブラリで確認できます。

まとめ

Ubuntu で Docker + GPU + Ollama の環境を構築する全手順を、実際のコマンド出力と画面で解説しました。

  • Ubuntu 24.04 / 22.04 とも apt から docker.io 29.1.3docker-compose-v2 2.40.3 が追加リポジトリ無しで入る(containerd 2.2.1 / runc 1.3.4 も同時に導入される)
  • nvidia-container-toolkit は標準リポジトリに無く E: Unable to locate package になるため、NVIDIA 公式リポジトリを追加してからインストールし、nvidia-ctk runtime configure で Docker に設定する
  • Ollama 0.30.8 は --gpus all を付けるだけで GPU 推論が有効になり、API は {"version":"0.30.8"} を即返す
  • Docker Compose の deploy.resources.reservations.devices で GPU を宣言すればワンコマンド起動が可能(docker compose config で構文を検証できる)
  • Open WebUI(v0.6.6)と組み合わせれば、ChatGPT 風 UI でブラウザからローカル LLM を操作できる
著者アイコン
著者アイコン

CPU だけで小さいモデルを動かしても 70 tokens/sec ほど出ましたが、モデルを大きくすると一気に重くなります。GPU があると会話が自然なテンポになるので、本格的にローカルLLMを使うなら GPU は効きます。最初はどんな GPU サーバーを選べばいいか迷いますが、Vultr の GPU プランは時間課金で気軽に試せるので入りやすいと感じています。

GPU 付きのサーバーを借りて本格的に試したい方は、以下から Vultr の GPU プランを確認してみてください。

GPU と CPU の速度差をベンチマークで詳しく知りたい方は、 もあわせてご覧ください。

コメント

タイトルとURLをコピーしました