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 > 設定 > リソース > メモリ)。
- キャプション: 「メモリを18~22GBに設定し、『Apply』をクリック!」
- モデル: 一度Pullしたモデルはローカルに保存されるので、毎回ダウンロード不要。ストレージに約13GBの空きを確保してください。
1. Docker ComposeでOllamaを起動
-
空のディレクトリを作成(例:
mkdir ollama-test && cd ollama-test
)。 -
以下の内容を
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:
-
以下のコマンドで起動:
docker compose up -d
-
(任意)ログを確認:
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