使用 Docker 建置並執行代理式 AI 應用程式
簡介
代理式應用程式正在改變軟體的構建方式。這些應用程式不僅僅是回應,它們還能進行決策、規劃和行動。它們由模型驅動,由代理編排,並與 API、工具和服務即時整合。
所有這些新的代理式應用程式,無論其功能為何,都共用一種通用架構。這是一種由三個核心組件構成的新型堆疊:
模型 (Models):指 GPT、CodeLlama、Mistral 等。它們負責推理、編寫和規劃。它們是智慧背後的引擎。
代理 (Agent):這是邏輯所在。代理接收目標,將其拆解,並找出達成目標的方法。它們負責編排一切。它們會與 UI、工具、模型和閘道進行通訊。
MCP 閘道 (MCP gateway):這是將代理連接到外部世界(包括 API、工具和服務)的橋樑。它為代理提供了一種透過模型上下文協定 (MCP) 呼叫功能的標準化方式。
Docker 透過將模型、工具閘道和雲端基礎設施統一為開發者友善的工作流程(使用 Docker Compose),使這種人工智慧堆疊變得更簡單、更快速且更安全。

本指南將帶您了解代理式開發的核心組件,並示範 Docker 如何透過下列工具將它們整合在一起:
- Docker Model Runner 讓您能夠透過簡單的指令和 OpenAI 相容的 API 在本地執行 LLM。
- Docker MCP Catalog and Toolkit 協助您發現並安全地執行外部工具(例如 API 和資料庫),並使用模型上下文協定 (MCP)。
- Docker MCP Gateway 讓您能夠編排並管理 MCP 伺服器。
- Docker Offload 提供了一個強大的 GPU 加速環境,讓您可以使用與本地相同的 Compose 工作流程來執行 AI 應用程式。
- Docker Compose 是將這一切整合在一起的工具,讓您能透過單一檔案定義並執行多容器應用程式。
在本指南中,您將從在 Docker Offload 中執行應用程式開始,使用您已經熟悉的 Compose 工作流程。接著,如果您的機器硬體支援,您將使用相同的工作流程在本地執行相同的應用程式。最後,您將深入剖析 Compose 檔案、Dockerfile 和應用程式,了解它們如何協同運作。
先決條件
若要學習本指南,您需要:
步驟 1:複製範例應用程式
您將使用一個現有的範例應用程式,該應用程式示範了如何利用 Docker 的 AI 功能將模型連接到外部工具。
$ git clone https://github.com/docker/compose-for-agents.git
$ cd compose-for-agents/adk/
步驟 2:使用 Docker Offload 執行應用程式
您將首先在 Docker Offload 中執行應用程式,它為執行 AI 工作負載提供了一個託管環境。如果您想利用雲端資源,或者您的本地機器未達執行模型的硬體要求,這將是理想選擇。Docker Offload 包含對 GPU 加速實例的支援,使其非常適合 AI 模型推論等運算密集型工作負載。
若要使用 Docker Offload 執行應用程式,請依照下列步驟操作:
登入 Docker Desktop Dashboard。
在終端機中,執行下列指令以啟動 Docker Offload:
$ docker offload start出現提示時,選擇您要用於 Docker Offload 的帳戶,並在詢問「Do you need GPU support? (您需要 GPU 支援嗎?)」時選擇 Yes。
在已複製儲存庫的
adk/目錄中,於終端機執行下列指令來建置並執行應用程式:$ docker compose up第一次執行此指令時,Docker 會從 Docker Hub 拉取模型,這可能需要一些時間。
應用程式現在已透過 Docker Offload 執行。請注意,使用 Docker Offload 時的 Compose 工作流程與在本地執行時相同。您在
compose.yaml檔案中定義應用程式,然後使用docker compose up來建置並執行它。造訪 https://:8080。在提示字元中輸入一個正確或錯誤的事實並按下 Enter。一個代理程式會搜尋 DuckDuckGo 來驗證它,另一個代理程式則會修改輸出結果。

完成後,在終端機中按下 ctrl-c 以停止應用程式。
執行下列指令以停止 Docker Offload:
$ docker offload stop
步驟 3:選用。在本地執行應用程式
如果您的機器符合必要的硬體要求,您可以使用 Docker Compose 在本地執行整個應用程式堆疊。這讓您無需在雲端執行,即可端對端測試應用程式,包括模型和 MCP 閘道。此範例使用的是 Gemma 3 4B 模型,上下文長度為 10000。
硬體要求:
- VRAM:3.5 GB
- 儲存空間:2.31 GB
如果您的機器超過這些要求,請考慮以更大的上下文長度或更大的模型來執行應用程式,以提升代理程式的效能。您可以輕鬆地在 compose.yaml 檔案中更新模型和上下文長度。
若要於本地執行應用程式,請依照下列步驟操作:
在已複製儲存庫的
adk/目錄中,於終端機執行下列指令來建置並執行應用程式:$ docker compose up第一次執行此指令時,Docker 會從 Docker Hub 拉取模型,這可能需要一些時間。
造訪 https://:8080。在提示字元中輸入一個正確或錯誤的事實並按下 Enter。一個代理程式會搜尋 DuckDuckGo 來驗證它,另一個代理程式則會修改輸出結果。
完成後,在終端機中按下 ctrl-c 以停止應用程式。
步驟 4:檢閱應用程式環境
您可以在 adk/ 目錄中找到 compose.yaml 檔案。請使用文字編輯器開啟它,查看服務是如何定義的。
services:
adk:
build:
context: .
ports:
# expose port for web interface
- "8080:8080"
environment:
# point adk at the MCP gateway
- MCPGATEWAY_ENDPOINT=http://mcp-gateway:8811/sse
depends_on:
- mcp-gateway
models:
gemma3 :
endpoint_var: MODEL_RUNNER_URL
model_var: MODEL_RUNNER_MODEL
mcp-gateway:
# mcp-gateway secures your MCP servers
image: docker/mcp-gateway:latest
use_api_socket: true
command:
- --transport=sse
# add any MCP servers you want to use
- --servers=duckduckgo
models:
gemma3:
# pre-pull the model when starting Docker Model Runner
model: ai/gemma3:4B-Q4_0
context_size: 10000 # 3.5 GB VRAM
# increase context size to handle search results
# context_size: 131000 # 7.6 GB VRAM該應用程式由三個主要組件組成:
adk服務:這是執行代理式 AI 應用程式的 Web 應用程式。此服務會與 MCP 閘道和模型進行通訊。mcp-gateway服務:這是將應用程式連接到外部工具和服務的 MCP 閘道。models區塊:這定義了應用程式要使用的模型。
當您檢查 compose.yaml 檔案時,會發現模型有兩個顯著的元素:
adk服務內部的服務層級models區塊- 頂層的
models區塊
這兩個區塊共同運作,讓 Docker Compose 自動啟動您的 ADK Web 應用程式並連接到指定的 LLM。
提示想尋找更多可使用的模型嗎?請查看 Docker AI 模型目錄。
在檢查 compose.yaml 檔案時,您會發現閘道服務是一個由 Docker 維護的映像檔:docker/mcp-gateway:latest。此映像檔是 Docker 開源的 MCP 閘道,讓您的應用程式能夠連接到 MCP 伺服器,進而公開模型可以呼叫的工具。在此範例中,它使用 duckduckgo MCP 伺服器來執行網頁搜尋。
提示想尋找更多可使用的 MCP 伺服器嗎?請查看 Docker MCP 目錄。
只需在 Compose 檔案中輸入幾行指令,您就能執行並連接代理式 AI 應用程式所需的所有服務。
除了 Compose 檔案外,Dockerfile 和它所建立的 entrypoint.sh 指令碼,也在建置與執行階段串連 AI 堆疊中發揮作用。您可以在 adk/ 目錄中找到 Dockerfile。請使用文字編輯器開啟它。
# Use Python 3.11 slim image as base
FROM python:3.13-slim
ENV PYTHONUNBUFFERED=1
RUN pip install uv
WORKDIR /app
# Install system dependencies
COPY pyproject.toml uv.lock ./
RUN --mount=type=cache,target=/root/.cache/uv \
UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy \
uv pip install --system .
# Copy application code
COPY agents/ ./agents/
RUN python -m compileall -q .
COPY <<EOF /entrypoint.sh
#!/bin/sh
set -e
if test -f /run/secrets/openai-api-key; then
export OPENAI_API_KEY=$(cat /run/secrets/openai-api-key)
fi
if test -n "\${OPENAI_API_KEY}"; then
echo "Using OpenAI with \${OPENAI_MODEL_NAME}"
else
echo "Using Docker Model Runner with \${MODEL_RUNNER_MODEL}"
export OPENAI_BASE_URL=\${MODEL_RUNNER_URL}
export OPENAI_MODEL_NAME=openai/\${MODEL_RUNNER_MODEL}
export OPENAI_API_KEY=cannot_be_empty
fi
exec adk web --host 0.0.0.0 --port 8080 --log_level DEBUG
EOF
RUN chmod +x /entrypoint.sh
# Create non-root user
RUN useradd --create-home --shell /bin/bash app \
&& chown -R app:app /app
USER app
ENTRYPOINT [ "/entrypoint.sh" ]entrypoint.sh 有五個關鍵的環境變數:
MODEL_RUNNER_URL:由 Compose(透過服務層級的models:區塊)注入,指向您的 Docker Model Runner HTTP 端點。MODEL_RUNNER_MODEL:由 Compose 注入,用以選擇要在 Model Runner 中啟動的模型。OPENAI_API_KEY:如果您在 Compose 檔案中定義了openai-api-key密鑰,Compose 會將其掛載至/run/secrets/openai-api-key。入口點指令碼會讀取該檔案並將其匯出為OPENAI_API_KEY,使應用程式使用託管的 OpenAI 而非 Model Runner。OPENAI_BASE_URL:當沒有提供真實金鑰時,此變數會被設定為MODEL_RUNNER_URL,以便 ADK 的 OpenAI 相容用戶端將請求發送到 Docker Model Runner。OPENAI_MODEL_NAME:在退回到 Model Runner 時,模型名稱會加上openai/前綴,讓用戶端能夠抓取正確的模型別名。
總結來說,這些變數讓相同的 ADK Web 伺服器程式碼可以無縫地指向:
- 託管的 OpenAI:如果您提供了
OPENAI_API_KEY(以及選擇性的OPENAI_MODEL_NAME) - Model Runner:透過將
MODEL_RUNNER_URL和MODEL_RUNNER_MODEL重新對應到 OpenAI 用戶端預期的變數中
步驟 5:檢閱應用程式
adk Web 應用程式是一種代理實作,透過環境變數和 API 呼叫連接到 MCP 閘道和模型。它使用 ADK (Agent Development Kit) 定義了一個名為 Auditor 的根代理程式,該代理程式負責協調兩個子代理程式(Critic 和 Reviser),以驗證並優化模型產生的答案。
這三個代理程式分別是:
- Critic:使用工具集(如 DuckDuckGo)驗證事實主張。
- Reviser:根據 Critic 提供的驗證結論來編輯答案。
- Auditor:一個更高層級的代理程式,負責安排 Critic 和 Reviser 的執行順序。它作為入口點,評估 LLM 產生的答案、驗證它們並優化最終輸出。
應用程式的所有行為都在 agents/ 目錄下的 Python 檔案中定義。以下是重要檔案的細項說明:
agents/agent.py:定義了 Auditor,這是一個 SequentialAgent,它將 Critic 和 Reviser 代理程式串聯起來。此代理程式是應用程式的主要入口點,負責使用現實世界的驗證工具來審核 LLM 產生的內容。agents/sub_agents/critic/agent.py:定義了 Critic 代理程式。它載入語言模型(透過 Docker Model Runner)、設定代理程式的名稱與行為,並連接到 MCP 工具(例如 DuckDuckGo)。agents/sub_agents/critic/prompt.py:包含 Critic 的提示詞 (prompt),指示代理程式使用外部工具來擷取並驗證聲明。agents/sub_agents/critic/tools.py:定義 MCP 工具集設定,包含解析mcp/字串、建立工具連接以及處理 MCP 閘道通訊。agents/sub_agents/reviser/agent.py:定義了 Reviser 代理程式,它會接收 Critic 的發現並對原始答案進行最小程度的重寫。它還包含清理 LLM 輸出並確保其格式正確的回呼函數。agents/sub_agents/reviser/prompt.py:包含 Reviser 的提示詞,指示代理程式根據驗證過的聲明結論來修改答案文字。
MCP 閘道是透過 MCPGATEWAY_ENDPOINT 環境變數進行設定的,在此例中為 http://mcp-gateway:8811/sse。這讓應用程式能夠使用伺服器發送事件 (SSE) 與 MCP 閘道容器通訊,該容器本身則充當存取 DuckDuckGo 等外部工具服務的中介。
總結
基於代理的 AI 應用程式正演變為一種強大的新軟體架構。在本指南中,您探索了一個模組化、思維鏈系統,其中 Auditor 代理程式協調 Critic 和 Reviser 的工作,以進行事實查核並優化模型產生的答案。此架構展示了如何以結構化、模組化的方式將本地模型推論與外部工具整合結合。
您也看到了 Docker 如何透過提供一套支援本地與雲端代理式 AI 開發的工具,來簡化此過程:
- Docker Model Runner:透過 OpenAI 相容 API 在本地執行並託管開源模型。
- Docker MCP Catalog and Toolkit:啟動並管理遵循模型上下文協定 (MCP) 標準的工具整合。
- Docker MCP Gateway:編排並管理 MCP 伺服器,將代理連接到外部工具和服務。
- Docker Compose:使用單一檔案定義並執行多容器代理式 AI 應用程式,在本地和雲端使用相同的工作流程。
- Docker Offload:在安全、託管的雲端環境中執行 GPU 密集型 AI 工作負載,並使用與您本地相同的 Docker Compose 工作流程。
透過這些工具,您可以使用一致的工作流程,高效地在本地或雲端開發和測試代理式 AI 應用程式。