使用 Docker 構建和執行 Agentic AI 應用程式
簡介
自主式應用程式正在改變軟體的構建方式。這些應用程式不僅會響應,還會決策、規劃和行動。它們由模型驅動,由代理編排,並與 API、工具和服務即時整合。
所有這些新的自主式應用程式,無論它們做什麼,都共享一個共同的架構。這是一種新型的技術棧,由三個核心元件構成
模型:這些是您的 GPTs、CodeLlamas、Mistrals。它們進行推理、編寫和規劃。它們是智慧背後的引擎。
代理:這是邏輯所在之處。代理接受一個目標,將其分解,並找出如何完成它。它們編排一切。它們與 UI、工具、模型和閘道器進行通訊。
MCP 閘道器:這是將您的代理連線到外部世界(包括 API、工具和服務)的橋樑。它為代理提供了一種透過模型上下文協議 (MCP) 呼叫功能的標準方式。
Docker 透過將模型、工具閘道器和雲基礎設施統一到一個使用 Docker Compose 的開發者友好工作流中,使這個 AI 驅動的技術棧更簡單、更快、更安全。


本指南將引導您瞭解自主式開發的核心元件,並展示 Docker 如何透過以下工具將它們全部聯絡在一起
- Docker Model Runner 允許您透過簡單的命令和與 OpenAI 相容的 API 在本地執行 LLM。
- Docker MCP 目錄和工具包 幫助您使用模型上下文協議 (MCP) 發現並安全地執行外部工具,如 API 和資料庫。
- Docker MCP 閘道器 讓您編排和管理 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 儀表板。
在終端中,透過執行以下命令啟動 Docker Offload
$ docker offload start
出現提示時,選擇您要用於 Docker Offload 的帳戶,並在提示“您需要 GPU 支援嗎?”時選擇“是”。
在克隆倉庫的
adk/
目錄中,在終端中執行以下命令來構建和執行應用程式$ docker compose up
首次執行此命令時,Docker 會從 Docker Hub 拉取模型,這可能需要一些時間。
應用程式現在正透過 Docker Offload 執行。請注意,使用 Docker Offload 時的 Compose 工作流與本地工作流相同。您在 `compose.yaml` 檔案中定義您的應用程式,然後使用 `docker compose up` 來構建和執行它。
訪問 https://:8080。在提示框中輸入一個正確或錯誤的事實,然後按回車。一個代理會搜尋 DuckDuckGo 來驗證它,另一個代理會修改輸出。
完成後,在終端中按 ctrl-c 停止應用程式。
執行以下命令停止 Docker Offload:
$ docker offload stop
步驟 3:可選。在本地執行應用程式
如果您的機器滿足必要的硬體要求,您可以使用 Docker Compose 在本地執行整個應用程式堆疊。這使您可以端到端地測試應用程式,包括模型和 MCP 閘道器,而無需在雲中執行。這個特定示例使用上下文大小為 10000
的 Gemma 3 4B 模型。
硬體要求
- VRAM:3.5 GB
- 儲存空間:2.31 GB
如果您的機器超過這些要求,可以考慮使用更大的上下文大小或更大的模型來執行應用程式,以提高代理的效能。您可以在 `compose.yaml` 檔案中輕鬆更新模型和上下文大小。
要在本地執行應用程式,請按照以下步驟操作:
在克隆倉庫的
adk/
目錄中,在終端中執行以下命令來構建和執行應用程式$ docker compose up
首次執行此命令時,Docker 會從 Docker Hub 拉取模型,這可能需要一些時間。
訪問 https://:8080。在提示框中輸入一個正確或錯誤的事實,然後按回車。一個代理會搜尋 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):根據批評家提供的驗證結論編輯答案。
- 審計員(Auditor):一個更高級別的代理,它按順序安排批評家和修訂者的工作。它作為入口點,評估 LLM 生成的答案,驗證它們,並完善最終輸出。
應用程式的所有行為都在 `agents/` 目錄下的 Python 中定義。以下是主要檔案的分解說明:
agents/agent.py
:定義了 Auditor,一個將 Critic 和 Reviser 代理連線在一起的 SequentialAgent。該代理是應用程式的主要入口點,負責使用真實世界的驗證工具來稽核 LLM 生成的內容。agents/sub_agents/critic/agent.py
:定義了 Critic 代理。它載入語言模型(透過 Docker Model Runner),設定代理的名稱和行為,並連線到 MCP 工具(如 DuckDuckGo)。agents/sub_agents/critic/prompt.py
:包含 Critic 的提示,指示代理使用外部工具提取並驗證宣告。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 目錄和工具包:啟動和管理遵循模型上下文協議 (MCP) 標準的工具整合。
- Docker MCP 閘道器:編排和管理 MCP 伺服器,將代理連線到外部工具和服務。
- Docker Compose:使用單個檔案定義和執行多容器自主式 AI 應用程式,在本地和雲中使用相同的工作流。
- Docker Offload:在安全、託管的雲環境中使用與本地相同的 Docker Compose 工作流執行 GPU 密集型 AI 工作負載。
有了這些工具,您可以在本地或雲端高效地開發和測試自主式 AI 應用程式,始終使用相同且一致的工作流程。