「ローカルでAIを動かしてみたいけれど、何から始めればいいのか分からない」
そんなときに候補になるのが、Docker Model Runner(DMR)です。
DMRは、Docker上でAIモデルを動かすための仕組みです。
DMRを使うとローカルでモデルを管理・実行できます。
OpenAI互換、Anthropic互換、Ollama互換のAPIにも対応してます。
またDMRは、モデルをダウンロードした後は、APIキーなし・継続課金なし・オフラインでも利用しやすい点が特長です。
この記事では、Windows 11 + VS Code + Git Bash を使用し、Docker DesktopでDMRを使う準備から、ローカルLLM(qwen3)での簡単な動作確認、さらにAIO(AI Overview)を意識した記事生成用のPythonプログラムを作って動かすところまで、順番にやさしく説明します
DMR(Docker Model Runner)の概要
DMRは、「LLM をコンテナの一つ」として管理して、Docker上でローカルLLMを扱う機能です。
普通のAIサービスは、サービスに加入してクラウドAPIにアクセスして使いますが、DMRは自分のパソコン上でAIモデルを動かすことを前提にしています。
DMRはDocker Hub、OCI互換レジストリ、Hugging Faceのモデルを扱え、ローカルモデルの管理やログ確認もできます。
また、DMRは推論エンジンとして llama.cpp、vLLM、Diffusers をサポートしており、用途に応じて使い分けられます。
Docker Desktopで使う場合
Docker Desktopのインストール
Docker Desktopは、Windowsでコンテナを使いやすくするための公式のGUIアプリです。
Install Docker Desktop on Windowsに従って、インストールすると使えます。
Docker Desktopの設定
Docker Desktopをインストールしたら、DMRを使えるように設定します。
Docker Desktopの Settings から AI を開き、Enable Docker Model Runner をオンにします。
次に、今回の様に、ホスト側からアクセスして使う場合は、TCP host access を有効にします。
この項目で、アクセス時のポート番号(default:12434)を指定できます。
対応するNVIDIA環境があれば、GPU推論を有効にする設定も用意されています。

今回の作業では、以下の2つがONになっていれば、DMRが使用できて、http://localhost:12434でアクセスできます。
- Enable Docker Model Runner
- host-side TCP support
qwen3を使ってみる
作業環境では、Windows 11でエディタにVS Codeを使用しターミナルは、Git Bashを使っています。
DMR関連のコマンド確認
ここからは、実際に手を動かしてみます。
まず、Git Bashを開いて、DMR関連コマンドが使えるか確認します。
docker model versionの確認
$ docker model version
Client:
Version: v1.1.33
OS/Arch: windows/amd64
Server:
Version: v1.1.29
Engine: Docker Desktop
#DMRのバージョンを表示。
docker model listの確認
$ docker model list
MODEL NAME PARAMETERS QUANTIZATION ARCHITECTURE MODEL ID CREATED CONTEXT SIZE
#ローカルにpull済みのモデル一覧を表示するコマンドです。
まだ、ローカル上にLLMが存在しません。
qwen3のロードと実行
CLIからモデルを事前ロードしたい場合は、docker model run -d を使います。d(detached) はバックグラウンドで起動するためのオプションです。
$ docker model run -d qwen3
Unable to find model 'qwen3' locally. Pulling from the server.
43070e2d4e53: Pull complete [==================================================>] 11.36kB/11.36kB
b505f0cf6920: Pull complete [==================================================>] 5.028GB/5.028GB
Model pulled successfully
#ローカルに qwen3が、見つからなかったので、クラウド上のリポジトリ(Docker Hubなど)からデータを取得(Pull)しています。
$ docker model ps
MODEL NAME BACKEND MODE UNTIL
qwen3 llama.cpp completion 3 minutes from now
#ロードされている実行中モデルの一覧を表示する。
curlコマンドを使っての簡単な動作確認
モデル一覧の確認
$ curl http://localhost:12434/v1/models
{"object":"list","data":[{"id":"docker.io/ai/qwen3:latest","object":"model","created":1746022478,"owned_by":"docker","dmr":{"architecture":"qwen3","parameters":"8.19 B","quantization":"IQ2_XXS/Q4_K_M","size":"4.68 GiB"}}]}
#id:APIで指定するモデル名
LLMにプロンプトを送信する場合、Git Bashでは、日本語を使うと文字コードの違いによりパースエラーが発生するので、ファイルに保存してから送るようにします。
data.json という名前で送信内容を保存します。
{
"model": "qwen3",
"messages": [
{"role": "user", "content": "こんにちは、自己紹介してください。"}
],
"temperature": 0.7
}
#"temperature": 0.7(温度):AIが回答を生成する際の 「多様性」や「ランダム性」を調整するパラメータ です。
Git Bash でそのファイル(data.json)を使って実行します。
$ curl http://localhost:12434/v1/chat/completions -H "Content-Type: application/json" -d @data.json
{"choices":[{"finish_reason":"stop","index":0,"message":{"role":"assistant","content":"こんにちは!私は通称でQwenと申します。アリババクラウドが開発した大規模言語モデルで、質問に答えることや文章の作成、会話のサポートなど、さまざまなタスクをサポートできます。実際の体をもたない仮想のアシスタントです。何かお手伝いできることがありましたら、どうぞお気軽にお声がけください!","reasoning_content":"Okay, the user greeted me with \"こんにちは\" which means \"Hello\" in Japanese. They asked for my self-introduction. I need to respond in Japanese.\n\nFirst, I should start with a friendly greeting in return. Then, introduce myself as Qwen, the large language model developed by Alibaba Cloud. Mention my capabilities like answering questions, creating content, and engaging in conversations. Also, include the part about being a virtual assistant without a physical form. Keep the tone warm and approachable. Make sure the response is concise but covers the main points. Check for any grammar mistakes and ensure the flow is natural in Japanese.\n"}}],"created":1776990734,"model":"model.gguf","system_fingerprint":"b1-e365e65","object":"chat.completion","usage":{"completion_tokens":225,"prompt_tokens":16,"total_tokens":241,"prompt_tokens_details":{"cached_tokens":0}},"id":"chatcmpl-zDfOYZJ8keWc5kdMR2wDnDcjeBno7lr4","timings":{"cache_n":0,"prompt_n":16,"prompt_ms":496.642,"prompt_per_token_ms":31.040125,"prompt_per_second":32.21636510806577,"predicted_n":225,"predicted_ms":37683.301,"predicted_per_token_ms":167.48133777777778,"predicted_per_second":5.9708144995047014}}
回答の文章だけを抜き出したい場合
$ curl http://localhost:12434/v1/chat/completions -H "Content-Type: application/json" \
-d @data.json | jq '.choices[0].message.content'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2014 100 1868 100 146 39 3 0:00:48 0:00:47 0:00:01 491
"こんにちは!私はQwenと申します。アリババクラウドが開発した大規模言語モデルで、質問に答えることや文章の作成、さまざまなタスクをサポートすることが出来ます。お気軽にお話しくださいね!😊"
jq:JSON を整形して表示するツールです。存在しない場合は、こちらからダウンロードできます。
Pythonプログラムの作成と実行
Docker公式のPython例では、ベースURLは http://localhost:12434/engines/v1、APIキーは not-needed とされています。
ここでは、DMRはAPIエンドポイントを使います。
Pythonプログラム仕様
今回は、AIO(AI Overview)を意識した記事作成ツールを作ります。
- 冒頭に結論の要約ブロック
- 見出しを質問型に寄せる
- 各見出しの直下で短く先に答える
- FAQ を付ける
このツールでは、最初に要点を見せて、読み手にもAIにも分かりやすい構成の記事が生成されます。
Pythonコード
VS Codeで aio_writer.py という名前のファイルを作り、次のコードを保存します。
from openai import OpenAI
MODEL_ID = "docker.io/ai/qwen3:latest"
client = OpenAI(
base_url="http://localhost:12434/engines/v1",
api_key="not-needed"
)
def generate_article(keyword: str) -> str:
prompt = f"""
あなたはSEOとAIO(AI Overview)に強い日本語ライターです。
次のキーワードで、AIOに最適化した記事を作成してください。
キーワード:
{keyword}
要件:
- 冒頭に「結論の要約ブロック」を入れる
- 要約ブロックは箇条書き3点
- H2見出しは質問型にする
- 各H2の直下で、まず1〜2文で短く答える
- その後に詳しい説明を書く
- FAQを3つ付ける
- 日本語で自然に書く
- タイトルも出力する
出力形式:
タイトル:
結論の要約:
- ...
- ...
- ...
導入文:
H2:
短い答え:
本文:
H2:
短い答え:
本文:
H2:
短い答え:
本文:
FAQ:
Q1:
A1:
Q2:
A2:
Q3:
A3:
まとめ:
"""
response = client.chat.completions.create(
model=MODEL_ID,
messages=[
{"role": "system", "content": "あなたはSEO記事作成が得意な日本語ライターです。"},
{"role": "user", "content": prompt}
]
)
return response.choices[0].message.content
def main():
keyword = input("キーワードを入力してください: ").strip()
if not keyword:
print("キーワードが空です。")
return
article = generate_article(keyword)
print("\n===== 生成結果 =====\n")
print(article)
with open("aio_article.txt", "w", encoding="utf-8") as f:
f.write(article)
print("\naio_article.txt に保存しました。")
if __name__ == "__main__":
main()
実行方法
Git Bashで次を実行します。
python aio_writer.py
キーワードを入力してくださいと表示されたら、以下の様な作りたい記事のキーワードを入力して進むと、AIOを意識した構成の記事のたたき台が生成されます。
生成結果は、画面に表示されるとともにaio_article.txt に保存されます。
AIエージェント 入門
主要コマンド一覧(クイックリファレンス)
以下は、よく使うコマンドのまとめです。
| コマンド | 内容 |
docker model ls | ローカルに保存されているモデルの一覧を表示 |
docker model pull [モデル名] | 指定したモデルをダウンロード(Docker Hub や Hugging Face から) |
docker model run [モデル名] | モデルを起動して対話モードに入る |
docker model run -d [モデル名] | モデルをバックグラウンド(デタッチモード)で起動 |
docker model inspect [モデル名] | モデルの詳細情報(レイヤー、アーキテクチャなど)を表示 |
docker model rm [モデル名] | ローカルのモデルを削除 |
docker model configure | コンテキストサイズなどの実行設定を変更 |
参考:docker model run | Docker Docs
DMR使用上の注意点
Docker DesktopでAI機能をオンにしただけでは、ホスト側から常に使えるとは限りません。localhost:12434 で使いたいときは、TCP host access の設定も必要です。
初回は少し遅く感じることがあります。
これは故障ではなく、モデルのロードが入るためです。Docker公式でも、モデルは必要時にメモリへ読み込まれ、一定時間アイドルになるまで残るためです。
モデルはサイズが大きいことがあります。
たとえば軽量モデルと比べると、より大きなモデルは保存容量やメモリ使用量が増えやすいです。
まず軽めのモデルで動作を確認してから、必要に応じて大きなモデルへ進むことがおすすめです。
Git Bashでの作業
Git Bashでは日本語を直接 curl に書くと、環境によって文字化けすることがあります。
これはDMRの問題ではなく、シェルや文字コードの影響です。
まとめ
DMRは、Docker Desktopの上でローカルAIを扱うための仕組みです。
最初は少し難しく見えますが、やることを分けて考えると意外と整理しやすいです。
- Docker Desktopを入れる
- AI設定でDMRを有効にする
- qwen3などのモデルを使って動作確認する
- PythonからOpenAI互換APIとして使う
この流れで進めると、はじめて使う場合でも迷わずに使えます。
参考リンク
- Docker Model Runner overview
https://docs.docker.com/ai/model-runner/ - Get started with DMR
https://docs.docker.com/ai/model-runner/get-started/ - DMR REST API
https://docs.docker.com/ai/model-runner/api-reference/ - Install Docker Desktop on Windows
https://docs.docker.com/desktop/setup/install/windows-install/ - Inference engines
https://docs.docker.com/ai/model-runner/inference-engines/ - Local models
https://docs.docker.com/ai/docker-agent/local-models/
