OllamaをDockerで動かす:CPU・GPU・ボリューム・API確認
モデルファイルを失ったり、ホストとコンテナのネットワークを混同したり、ローカルAPIを誤って公開したりせずにOllamaをDockerで動かす実践ガイドです。
このガイドの内容
OllamaをDockerで動かすという言葉には、通常3つの判断が含まれます。モデルファイルをどこに置くか、コンテナがホストや別のサービスへどう接続するか、CPUと利用可能なGPUのどちらを使うかです。まずは最小構成から始めましょう。公式Ollamaイメージを名前付きボリュームで起動し、ローカルAPIを確認してから、GPUオプションや別のアプリを追加します。
OllamaをDockerで動かすと何が変わるか
通常のOllamaはローカルサービスとして動きます。コマンドで実行環境を起動し、モデルファイルはマシン上に置かれ、クライアントはポート11434を呼び出します。Dockerはこのサービスを独自のファイルシステム、プロセス名前空間、ネットワーク規則、ライフサイクルを持つコンテナで包みます。再現性の高いデプロイに便利ですが、/root/.ollamaをボリュームで永続化しないと、コンテナ内で取得したモデルがコンテナ削除時に消えることがあります。
そのため、Dockerコマンドが動くだけでは構成は完成しません。Dockerを唯一のOllama実行環境にするのか、ホストアプリや別コンテナから呼び出すのか、モデルのダウンロードをアップグレード後も残すのかを決めます。OpenCode、MCPホスト、Web UI、リモートクライアントを追加する前に、境界を見える形にしておきましょう。
コンテナの寿命とモデルの保存先は別です
コンテナを削除しても安全なのは、モデルディレクトリが書き込み可能なコンテナ層の外にある場合だけです。名前付きボリュームまたは意図したバインドマウントが、Ollama Docker構成を永続化します。
CPU・NVIDIA GPU・AMD GPUを選ぶ
ネットワーク、ボリューム、新しいホストを検証する段階では、まずCPU構成を使います。変更点が少なく、モデルの読み込み時間や応答速度を比べる基準になります。APIが動いたら、別の環境からコピーした不明なDockerオプションを足すのではなく、ホストに合ったアクセラレーター用コマンドへ切り替えてください。
NVIDIAコンテナでは、通常、ホスト側のドライバーとNVIDIA Container Toolkitが必要です。AMD構成は異なるイメージタグやデバイス設定を使うことがあり、対応状況はOS、ランタイム、現在のOllama案内に依存します。GPUは最適化の層として扱い、エンドポイント、ボリュームの場所、基本的なヘルス確認は変えないようにします。
docker version
docker run --rm --gpus=all nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi
| 経路 | 使う場面 | 重要な確認 |
|---|---|---|
| CPU | 最も単純な基準を作りたい、または対応GPUがない | 性能調整の前にAPIとモデル応答を確認する |
| NVIDIA GPU | ホストドライバーとNVIDIA Container Toolkitが動作している | 大きなモデルを取得する前にDockerからGPUが見えるか確認する |
| AMD GPU | ホストとOllamaイメージが必要なROCm経路に対応している | 対象ホストの現在のイメージとデバイス要件に従う |
| ホストとコンテナ | 別サービスがDockerネットワーク経由でOllamaを呼び出す | ホストのループバックではなくネットワーク内のサービス名を使う |
モデルを永続化するボリュームを作る
名前付きボリュームはOllama Docker構成の初期値として扱いやすい方法です。保存場所をDockerが管理し、モデルファイルを手動で移さずにコンテナを交換できます。公式イメージはOllamaのデータを/root/.ollamaに保存するため、そこへ一貫してボリュームをマウントしてください。初回起動とアップグレードで別のボリュームを作ると、意図せず新しいモデルライブラリになります。
バインドマウントは、ディスク使用量を確認したい場合、決めたホストディレクトリをバックアップしたい場合、特定のドライブへモデルを置きたい場合に便利です。一方で権限やパスの判断が増えます。初回デプロイでは、名前付きボリュームのほうが説明しやすく壊しにくいでしょう。
ボリュームはバックアップではありません
Dockerボリュームはコンテナ交換からモデルファイルを守りますが、自動的に二重化されるわけではありません。モデルライブラリが重要なら、意図的にバックアップまたは再構築の手順を用意してください。
docker volume create ollama-data
docker run -d --name ollama -p 11434:11434 -v ollama-data:/root/.ollama ollama/ollama
docker exec -it ollama ollama pull <model-name>
コンテナを起動してAPIを確認する
docker runがコンテナIDを返したら、大きなモデルを取得する前に状態を確認します。docker psでプロセスが動いているかを確認し、docker logsでポート、権限、ランタイムのエラーを調べます。その後、ホストから/api/tagsを呼び出します。tagsの応答が成功しても、すべてのモデルが読み込めることや、すべてのクライアントに利用権限があることまでは証明しません。
2つ目の確認として、小さなモデルで1回リクエストします。これにより、HTTPリスナーが生きているだけの状態と、モデル経路まで動作している状態を分けられます。APIは応答するのにモデルリクエストが失敗する場合は、ネットワーク設定を変える前に、モデル名、空き容量、メモリ、コンテナログを確認してください。
-
プロセスを確認
コンテナがUp状態で、公開ポートが意図したものになっていることを確認します。
-
エンドポイントを確認
ポート11434を公開した同じマシンから/api/tagsを呼び出し、ステータスコードを記録します。
-
モデルを確認
小さなモデルを取得または使用し、エディターやエージェントを接続する前に安全なプロンプトを1回実行します。
docker ps --filter name=ollama
docker logs ollama --tail 100
curl http://127.0.0.1:11434/api/tags
docker exec -it ollama ollama list
localhostを混同せずにホストアプリを接続する
正しいOllama URLはクライアントの実行場所で決まります。Dockerがポートを公開している同じホスト上のデスクトップアプリは、通常http://127.0.0.1:11434を呼び出せます。同じDockerネットワークの別コンテナは、Composeのサービス名とポート、たとえばhttp://ollama:11434を使います。コンテナ内の127.0.0.1はそのコンテナ自身を指し、Windows、macOS、Linuxのホストを自動的に指すわけではありません。
リモートクライアントには、明示的に保護したアドレスとファイアウォール規則を使います。テストアプリを接続するためだけにポート11434をインターネットへ公開しないでください。リモートエンドポイントが必要なら、経路、認証またはプライベートネットワークの境界、アクセスを許可するモデルサービスを記録します。
| クライアントの場所 | 一般的なエンドポイント | よくある間違い |
|---|---|---|
| ホストのデスクトップ | http://127.0.0.1:11434 | ホストアプリからコンテナのサービス名を使う |
| 別のComposeサービス | http://ollama:11434 | 呼び出し元コンテナ自身を指すlocalhostを使う |
| 別のマシン | プライベートでファイアウォール保護されたホストアドレス | 認証なしのAPIを公開インターフェースへバインドする |
| Odysseusまたはエディター | アプリのプロバイダー設定が要求するエンドポイント | 基本API確認が通る前にエンドポイントを変更する |
モデル、コンテキスト、公開範囲を安全に保つ
Dockerに入れたからといって、Ollamaサービスが自動的に非公開になるわけではありません。コマンドやホストの既定値によっては、公開ポートがすべてのインターフェースへバインドされます。ホストだけで試す場合は、他のマシンからのアクセスが不要なら-p 127.0.0.1:11434:11434のようなループバックバインドを優先します。Composeサービスが内部からAPIを使う場合は、プライベートネットワークに置き、必要な場合以外はホストポートを公開しません。
モデルのコンテキスト長、同時実行数、GPUメモリは、コンテナが使うRAMやVRAMの量を変えます。一度に1つの変数だけを増やし、docker stats、ホストメモリ、モデルの応答を観察してください。秘密情報をイメージ、シェル履歴、スクリーンショット、バージョン管理されたComposeファイルへ入れないでください。ローカルモデルのエンドポイントと外部検索ツールでは、プライバシーの境界が異なります。
| 確認項目 | 重要な理由 | 安全側の初期値 |
|---|---|---|
| ポートバインド | APIへ到達できるインターフェースを決める | ホストだけのテストではループバックにバインドする |
| ボリュームの場所 | コンテナ交換後もモデルが残るかを決める | 名前付きボリュームを1つ使い、場所を記録する |
| コンテキストと同時実行 | リクエスト中のメモリ使用量を増やすことがある | 小さく始め、上限を増やす前に計測する |
| 外部ツール | プロンプトや取得内容をホスト外へ送る可能性がある | プロバイダーを確認し、ツール権限を絞る |
ヘルス、GPU、ボリューム、APIの障害を切り分ける
Ollama Docker構成が失敗したら、層を1つずつ変更します。まずDocker自体が簡単なコンテナを起動できるかを確認し、次にOllamaコンテナが動き続けるかを調べます。その後にボリューム、API、モデル、最後にクライアントアプリを確認します。エラーのたびにコマンド全体を入れ替えると、どの境界で失敗したのか分からなくなります。
GPUの失敗は、Ollama APIよりもホスト側のランタイムに原因があることが多いです。GPUが渡されていない、ドライバーが互換性を持たない、選んだイメージがホストに合わない、といった場合、コンテナが/api/tagsに応答していてもCPUを使っていることがあります。モデルが再作成後に見つからない場合は、再取得する前にdocker inspectの結果とマウント先を比較してください。
コンテナの削除とボリュームの削除は同じではありません
最後のコマンドが削除するのはコンテナだけです。モデルファイルが不要になった、またはバックアップ済みだと確認するまで、docker volume rm ollama-dataを実行しないでください。
docker inspect ollama
docker stats ollama
docker stop ollama && docker rm ollama
| 症状 | 疑う境界 | 次の確認 |
|---|---|---|
| コンテナがすぐ終了する | イメージ、コマンド、権限、ランタイム | docker logs ollamaと終了コードを確認する |
| API接続が拒否される | ポートバインドまたはプロセスの状態 | docker ps、公開ポート、/api/tagsを確認する |
| モデルが消えた | 誤った、または存在しないボリューム | docker inspectのマウントと/root/.ollamaを比較する |
| GPUオプションが失敗する | ホストドライバーまたはコンテナランタイム | Ollamaの前に最小のGPUテストを実行する |
| ホストでは動くがコンテナでは動かない | ネットワーク名前空間 | localhostをComposeのサービス名に置き換える |
| リクエストのメモリ使用量が大きい | コンテキスト、同時実行、モデルサイズ | 設定を1つ下げ、ホストとコンテナの指標を見る |
OllamaをDockerで動かすときのよくある質問
公式リファレンス
- Ollama Dockerドキュメント - 公式コンテナイメージとDockerデプロイの案内
- Ollama APIドキュメント - 公式エンドポイントとリクエストのリファレンス
- Docker ComposeのGPUサポート - GPU予約とComposeに関する公式案内
関連するローカルAI設定ガイド
- Odysseus AI Dockerセットアップ - Odysseus AI全体をDocker中心でデプロイするガイドです。
- Odysseus AI Ollamaセットアップ - ホストとコンテナのエンドポイントを混同せず、既存のOllamaをOdysseusへ接続します。
- Ollama MCPサーバー - ローカル推論とMCPツール、承認、外部ネットワーク呼び出しを分けて考えます。
- Ollama Web Search - ホスト型Web Search APIとローカル・セルフホスト検索の違いを比較します。
- OpenCode Ollamaセットアップ - コンテナ化したOllamaエンドポイントをローカルのコーディングエージェントで使います。
最終更新:2026年8月22日
ホームへ戻る