😽

Docker環境でgpt-ossを動かしてみた

に公開

はじめに

この記事では、Docker Composeを使ってローカル環境でOllamaを動かし、軽量かつ高性能なAIモデル「gpt-oss:20b」を試す手順を紹介します。最終的に、http://localhost:11434 からAPIを呼び出して、AIの応答を得られる状態を目指します。これで、例えば自作アプリからAIを簡単に呼び出せるようになります!

  • 対象読者: Dockerを使った経験がある初級~中級エンジニア

  • 環境: macOS / Windows / Linux(Docker Desktop推奨)

  • ゴール: ローカルでAPI(/api/tags, /api/generate)を叩いてAIを動かす

  • 構成: Docker Compose + Ollama + gpt-oss:20b(MXFP4)

  • 対象OS: macOS / Windows / Linux(Docker Desktop 推奨)

  • 参考: ネイティブOllamaアプリでも同等手順(後述)

  • gpt-ossとは: https://openai.com/ja-JP/index/introducing-gpt-oss/

0. 事前準備:メモリとモデルの確認

  • メモリ: gpt-oss:20bは約12.5GiBのメモリを消費します。Docker Desktopの設定で、メモリを18~22GBに増やしておくと安定します(設定方法: Docker Desktop > 設定 > リソース > メモリ)。
    Docker Desktopのメモリ設定
  • キャプション: 「メモリを18~22GBに設定し、『Apply』をクリック!」
  • モデル: 一度Pullしたモデルはローカルに保存されるので、毎回ダウンロード不要。ストレージに約13GBの空きを確保してください。

1. Docker ComposeでOllamaを起動

  1. 空のディレクトリを作成(例: mkdir ollama-test && cd ollama-test)。

  2. 以下の内容をcompose.yamlとして保存。

    services:
      ollama:
        image: ollama/ollama:latest
        ports:
          - "11434:11434"   # ローカルのhttp://localhost:11434でOllamaのAPIにアクセス
        volumes:
          - ollama_data:/root/.ollama  # モデルデータを永続化
        healthcheck:
          test: ["CMD-SHELL", "ollama list >/dev/null 2>&1 || exit 1"]
            interval: 10s
            timeout: 5s
            retries: 20
    volumes:
      ollama_data:
    
  3. 以下のコマンドで起動:

    docker compose up -d
    
  4. (任意)ログを確認:

    docker compose logs -f ollama
    

補足: ポート11434はOllamaのAPIエンドポイントで、ホストから簡単にアクセスできます。

2. モデルをPull(初回のみ)

gpt-oss:20bは約13GBのモデルです。初回は以下のコマンドでダウンロードします(所要時間はネットワーク速度次第で5~20分程度)。

docker compose exec ollama ollama pull gpt-oss:20b

ダウンロード済みか確認:

docker compose exec ollama ollama list

出力例:

NAME           ID              SIZE     MODIFIED
gpt-oss:20b    aa4295ac10c3    13 GB    a few seconds ago

(任意)簡単な動作確認:

docker compose exec ollama ollama run gpt-oss:20b "hello"

注意: メモリ不足でエラー(HTTP 500)が発生した場合、Docker Desktopのメモリ設定を18~22GBに増やして再試行してください。

3. API疎通確認(ホストから直接)

OllamaのAPIはhttp://localhost:11434で公開されています。curlや任意のHTTPクライアント(Python, Ruby, Node.jsなど)でテストできます。

モデル一覧の取得

  • モデル一覧の確認 (/api/tags):

      curl -s http://localhost:11434/api/tags
    

    出力例:

    {"models":[{"name":"gpt-oss:20b","modified_at":"2025-08-31T09:28:00Z","size":13000000000}]}
    

生成リクエスト

  • 生成リクエスト (/api/generate, 非ストリーミング): シェルの引用エラーを避けるため、Here Docを使います。

    cat << 'JSON' | curl -sS -H "Content-Type: application/json" -d @- http://localhost:11434/api/generate
    {
      "model": "gpt-oss:20b",
      "prompt": "say hello",
      "stream": false
    }
    JSON
    

    出力例:

    {"model":"gpt-oss:20b","response":"Hello! How can I assist you today?","done":true}
    

4. ネイティブOllamaアプリでの代替手順(Docker不要)

Dockerを使わず、Ollama公式アプリ をインストール済みの場合、同等の操作が可能です。

# モデル実行(未インストールなら自動Pull)
ollama run gpt-oss:20b "hello"

# API確認(デフォルトでhttp://localhost:11434)
curl -s http://localhost:11434/api/tags

5. トラブルシューティング

問題 症状 解決方法
メモリ不足 HTTP 500エラーやコンテナのクラッシュ Docker Desktop > Settings > Resources > Memoryを18~22GBに設定し、コンテナを再起動(docker compose up -d)。
GPU未検出 ログに「no compatible GPUs were discovered」と表示 CPUでも動作可能。GPUが必要ならNVIDIA GPUとドライバを確認(公式ドキュメント)。
モデル未発見 ollama pullが失敗、またはモデルが見つからない モデル名(gpt-oss:20b)の綴りやネットワーク(プロキシ設定)を確認。
シェルエラー curlコマンドで引用エラーが発生 Here Docを使用するか、JSONをファイルに保存して-d @file.jsonで送信。

6. 補足:モデルをDockerイメージに含めない理由

  • イメージの軽量化: モデルを含めるとイメージが巨大になり、ビルドや配布に時間がかかる。
  • 柔軟性: モデルを環境変数やコマンドで簡単に切り替え可能。
  • 効率性: 初回ダウンロード後はローカルにキャッシュされ、再利用可能。

7. 最後に

上記手順でdocker composeを使用し、ローカル環境でAIが動くようになりました。次は、PythonやNode.jsなど好きな言語でAPIを呼び出して、AIをアプリに組み込んでみてください!

Happy coding!

Discussion