Docker AIのGordonがなんだか使いにくかったので
MCP風にラップしてKiro CLIに使ってもらってみた
MCP風にラップしてKiro CLIに使ってもらってみた
こんにちは、クラウド活用推進担当の榊原です。今回もよろしくお願いします
AI技術が急速に進化し、開発現場でもAIアシスタントの利用が当たり前になってきました。コーディング支援、コードレビュー、ドキュメント生成など、様々な場面でAIが活躍しています。
そんな今日この頃、Dockerにも専用のAIアシスタントがあることをご存知でしょうか?
Docker Desktopに搭載された「Gordon」というAIアシスタントです。CLIで利用可能で、Dockerに関する
質問に答えてくれたり、Dockerfileを解析してくれたりと、Docker開発に特化した知識を持っています。
実際に使ってみると確かに便利なのですが、いくつか使いにくい点も見えてきました。
そして何より、CLIのAIアシスタントならAmazon Q/Kiro CLIの存在がとても大きいです。
特にAWSへのデプロイが前提の開発なら、最初からそちらを使った方が便利なのは言うまでもありません。
しかしGordonが持つDockerの専門知識は捨てがたいのも事実です。
そこで思いついたのが、「GordonをMCPっぽくしてKiro CLIに使ってもらおう」というアイデアでした。
そうすればKiroの使いやすさとGordonの専門知識、両方の良いとこ取りができるのではないかと。
というわけで、GordonをMCP風にラップして、Kiro CLIに使ってもらってみました。
Gordonは、Docker DesktopとDocker CLIに組み込まれたAIアシスタントです。
Docker Desktop 4.38.0以降で利用可能です。
主な機能として、Dockerfileの改善提案や、コンテナの脆弱性・設定問題の発見、コンテナ実行時のトラブルシューティングなどがあります。
2025年11月現在は、ベータ版での提供になります。
・Docker Desktop: 4.38.0以降
・Docker Accountを持っていること
1. Docker Desktopの左ペインからAsk Gordonを選択
2. Sign in to use Ask Gordonを選択して、Docker Accountでログイン
3. Docker Desktopの設定から、Beta Features > Enable Docker AIにチェックを入れて設定を保存
これでGordonを使うことができるようになります
またGordonはCLIにも対応しており、Windows PowerShellからdocker aiコマンドでアクセスすることができます。
% docker ai hello
Hello! How can I assist you with Docker or any tech-related questions today?
👍 Helpful 👎 Not helpful
実際に使ってみたところ、Gordonにはこんな良いところがありました。
・Docker専門知識が豊富: Dockerに特化しているだけあって、的確なアドバイスをくれる
・具体的なコード例: 抽象的な説明だけでなく、実際に使えるコード例を提示してくれる
・実用的な推奨事項: セキュリティ、パフォーマンス、保守性のバランスを取り、実際に適用できる現実的な提案をしてくれる
・公式ドキュメントへのリンク: 詳細を知りたい場合のリンクを提供してくれる
でも、実際に使ってみると困った点もいくつかありました。
・WSLネイティブで使えない
WSL(Ubuntu 24.04)上でdocker aiを実行しようとすると、以下のように出力されました。
% docker ai
Docker Desktop is not running
Docker Desktopは確実に動作しており、Docker Daemonとの接続も問題ありません。
ほかのコマンドは普通に動きます。しかしdocker aiはなぜか動かない。
ソケットの問題かもしれないということでもろもろ頑張った結果、コマンドの起動ができるようになりました。
(参考: Running docker desktop with MCP toolkit enabled, can't connect from wsl)
なったんですが……
% docker ai
>>> hello
• Gordon is slow to respond, will retry (1/15)
• Gordon is slow to respond, will retry (2/15)
• Gordon is slow to respond, will retry (3/15)
• Gordon is slow to respond, will retry (4/15)
• Gordon is slow to respond, will retry (5/15)
• Gordon is slow to respond, will retry (6/15)
• Gordon is slow to respond, will retry (7/15)
• Gordon is slow to respond, will retry (8/15)
• Gordon is slow to respond, will retry (9/15)
• Gordon is slow to respond, will retry (10/15)
• Gordon is slow to respond, will retry (11/15)
• Gordon is slow to respond, will retry (12/15)
• Gordon is slow to respond, will retry (13/15)
• Gordon is slow to respond, will retry (14/15)
• Gordon is not available at the moment
レスポンスが無くタイムアウト。おしゃべりできません。
結局、「これなら動くぞ!」となったのはWin側の実行ファイルを直接叩く方法でした。
% docker.exe ai
>>> hello
Hello! How can I assist you today? I specialize in Docker-related queries and tasks,
so feel free to ask anything about Docker, containerization, or related technologies!
👍 Helpful 👎 Not helpful
動作自体は問題ありませんが、他のコマンドに紛れてこれだけ.exeなのはとても使いにくいです。
・多言語対応が不十分
これはシェル側の問題でもありますが、CLIで日本語で話しかけると、文字化け等で大変見にくいものになってしまいました。
出力されている内容自体は違和感ないので、LLMの問題というより、マルチバイト文字列の表示に対応していないということのようです。
とにかく、日本語で聞きたいこちらとしては、なかなか厳しいところがあります。
% docker.exe ai
>>> こんにちは
�� こ�� こん�� こんに�� こんにち�� こんにちは�� こんにちは!Docker�� こんにちは!Dockerや�� こんにちは!Dockerや技�� こんにちは!Dockerや技術�� こんにちは!Dockerや技術関�� こんにちは!Dockerや技術関連�� こんにちは!Dockerや技術関連の�� こんにちは!Dockerや技術関連の質�� こんにちは!Dockerや技術関連の質問�� こんにちは!Dockerや技術関連の質問が�� こんにちは!Dockerや技術関連の質問があ�� こんにちは!Dockerや技術関連の質問があれ�� こんにちは!Dockerや技術関連の質問があれば�� こんにちは!Dockerや技術関連の質問があれば、�� こんにちは!Dockerや技術関連の質問があれば、何�� こんにちは!Dockerや技術関連の質問があれば、何で�� こんにちは!Dockerや技術関連の質問があれば、何でも�� こんにちは!Dockerや技術関連の質問があれば、何でも聞�� こんにちは!Dockerや技術関連の質問があれば、何でも聞いて�� こんにちは!Dockerや技術関連の質問があれば、何でも聞いてく��
� �� �さ �さ� �さ�� �さい �さい� �さい�� �さい。 �さい。� �さい。�� �さい。ど �さい。ど� �さい。ど�� �さい。どう �さい。どう� �さい。どう�� �さい。どうぞ �さい。どうぞ� �さい。どうぞ�� �さい。どうぞお �さい。どうぞお� �さい。どうぞお�� �さい。どうぞお気 �さい。どうぞお気� �さい。どうぞお気�� �さい。どうぞお気軽 �さい。どうぞお気軽� �さい。どうぞお気軽�� �さい。どうぞお気軽に �さい。どうぞお気軽に� �さい。どうぞお気軽に�� �さい。どうぞお気軽に! �さい。どうぞお気軽に! � �さい。どうぞお気軽に! ��
�さい。どうぞお気軽に! ���
�さい。どうぞお気軽に! 😊
👍 Helpful 👎 Not helpful
・会話内容の保持がセッション内でのみ
現状docker aiで開始するCLI版Gordonでは、会話内容の保存はそのセッション内に限られます。なので、一度セッションを終了してしまうと、過去の会話を再開することができません。
Docker Desktop上での利用ならその限りではありませんが、CLI版では難しそうです。
Gordonには良いところも、使いにくいところもあります。
しかしそんな絶妙な使い心地に直面していると、思ってしまうことがあります。
そもそもCLI AIアシスタントなら、Amazon Q/Kiro CLIでいいのでは?と……
GordonはCLIで使えるAIアシスタントですが、CLI AIアシスタントの世界にはすでに強大な存在感を放つものがあります。 Amazon Q/Kiro CLIです。
これらのツールは:
・汎用性が高い: Dockerだけでなく、あらゆる開発タスクに対応
・ファイル操作が得意: コードの読み書き、編集が自然にできる
・コンテキスト理解が優れている: プロジェクト全体を理解した上でアドバイスをくれる
・AWS統合: AWSサービスとの連携が強力
といった特徴があります。
特にECSやFargateなどAWS環境へのデプロイ前提なら、
最初からAmazon Q/Kiro CLIを頼った方が
圧倒的に便利です。
こう考えると、Gordonの立ち位置は少し微妙です。
Docker特化の知識は確かに魅力的
でも使いにくさがある
そしてQ/Kiro CLIという強力なライバルがいる
「じゃあGordonを使う理由は?」と問われると、正直答えに困ります。
でも、ここで諦めるのはもったいない。
Gordonには確かにDockerの専門知識という強みがあります。これをなんとか活かしたい。
そこで思いついたのが、「MCPっぽくラップしてKiro CLIから使えるようにする」というアイデアです。
Gordonは使いにくい、それはもう仕方ありません。でもDocker専門知識は価値があります。
Q/Kiro CLIという強力なライバルがいる、現状同じ領域では敵わないでしょう。なら協力すれば……。
MCP化し、メインはKiro CLI、DockerはGordonに聞くという役割分担で連携すれば、
Kiroの使いやすさとGordonのDocker専門知識を組み合わせられます。
これなら、Gordonの使いにくさを解消しつつ、その価値を最大限に引き出せるのではないかと。
ホスト環境:
・Host OS: Windows 11 Pro
・Docker Desktop: v4.52.0
・Kiro IDE: 0.6.0
WSL環境:
・Linux Distro: Ubuntu 24.04.2 LTS
・Docker version: 29.0.1
・Kiro CLI: 1.20.0
MCP実装環境:
・Python: 3.12.3
・FastMCP: 2.13.1
・uv: 0.9.10
さっそくMCP化していきます。FastMCPでさくっと作るのがよさそうです。
というわけで頼んだ、Kiro。
完成したコードが以下になります。
"""Gordon MCP Server - FastMCP implementation."""
import subprocess
import re
from typing import Optional
from fastmcp import FastMCP
mcp = FastMCP("Gordon Docker AI")
def run_docker_ai(question: str, working_dir: Optional[str] = None, timeout: int = 60) -> str:
"""Execute docker ai command and return the response."""
import os
enhanced_question = f"{question}\n\nPlease provide a complete answer in one response without asking follow-up questions."
cmd = ["docker.exe", "ai"]
if working_dir:
expanded_dir = os.path.expanduser(working_dir)
abs_dir = os.path.abspath(expanded_dir)
if abs_dir.startswith('/'):
import subprocess as sp
try:
win_path = sp.run(['wslpath', '-w', abs_dir],
capture_output=True, text=True, timeout=5).stdout.strip()
cmd.extend(["--working-dir", win_path])
except Exception:
cmd.extend(["--working-dir", abs_dir])
else:
cmd.extend(["--working-dir", abs_dir])
cmd.append(enhanced_question)
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout, encoding='utf-8', errors='ignore')
output = result.stdout + result.stderr
cleaned = clean_output(output)
if not cleaned:
return "Error: No response from Gordon"
if result.returncode != 0 and len(cleaned) < 100:
return f"Error executing docker ai: {cleaned}"
return cleaned
except subprocess.TimeoutExpired:
return f"Error: Command timed out after {timeout} seconds"
except Exception as e:
return f"Error: {str(e)}"
def clean_output(output: str) -> str:
"""Clean up Gordon's streaming output."""
output = re.sub(r'\x1b\[[0-9;]*[a-zA-Z]', '', output)
lines_to_remove = [
r'Working on your request.*', r'Searching my knowledge base.*',
r'Sending tool call results.*', r'UNC.*', r'.*CMD\.EXE.*',
r'.*Windows.*', r'.*\\wsl\.localhost\\.*', r'.*cmd\.exe.*',
r'.*powershell\.exe.*', r'➜.*', r'.*\x00.*', r'^[^\x20-\x7E\s]+$',
]
for pattern in lines_to_remove:
output = re.sub(pattern, '', output, flags=re.MULTILINE)
lines = [line.strip() for line in output.split('\n') if line.strip()]
result = '\n'.join(lines)
prev_line = None
cleaned_lines = []
for line in result.split('\n'):
if line != prev_line:
cleaned_lines.append(line)
prev_line = line
return '\n'.join(cleaned_lines).strip()
@mcp.tool()
def ask_gordon(question: str) -> str:
"""Ask Gordon (Docker AI) any question about Docker."""
return run_docker_ai(question)
@mcp.tool()
def analyze_file(file_path: str, context: Optional[str] = None) -> str:
"""Ask Gordon to analyze a Docker-related file and provide recommendations."""
import os
expanded_path = os.path.expanduser(file_path)
if not os.path.exists(expanded_path):
return f"Error: File not found at {expanded_path}"
dir_path = os.path.dirname(expanded_path) or "."
filename = os.path.basename(expanded_path)
question = f"Analyze the {filename} file and provide recommendations"
if context:
question += f". Context: {context}"
return run_docker_ai(question, working_dir=dir_path)
def main():
"""Run the MCP server."""
mcp.run(transport='stdio')
if __name__ == "__main__":
main()
2つのツールを実装しました。
・ask_gordon: Gordonに一般的な質問をする基本ツール
・analyze_file: Dockerfileなどのファイルを解析して改善提案をもらうツール
実装で工夫した点が3点あります。
1. docker.exeを直接呼び出す
WSL環境からWindows側の実行ファイルdocker.exeを直接呼び出しています。
cmd = ["docker.exe", "ai", enhanced_question]
前述の通り、WSLネイティブのdockerコマンドではGordonが正常に動作しないため、Windows側の実行ファイルを直接叩く形にしています。
2. 対話形式を抑制する
Gordonは対話形式を前提としているため、そのまま使うと追加質問を求められることがあります。
そこで、プロンプトに「1レスポンスで完結するように」という指示を含めています。
enhanced_question = f"{question}\n\nPlease provide a complete answer in one response without asking follow-up questions."
これにより、MCP経由での利用に適した形で応答を得られるようにしています。
3. ワーキングディレクトリを指定する(analyze_fileツール)
analyze_fileツールは、ファイルパスを受け取ってそのファイルをGordonに解析してもらう仕組みです。
しかし、カレントディレクトリ以外のファイルパスを渡すと、Gordonが許可を求めるモードになってしまう問題がありました。
そこで、ファイルの内容をプロンプトに含めるのではなく、docker aiコマンドの--working-dirオプションでファイルがあるディレクトリを指定するように調整しました。
# ファイルのディレクトリを取得
dir_path = os.path.dirname(expanded_path) or "."
# --working-dirオプションでディレクトリを指定して実行
return run_docker_ai(question, working_dir=dir_path)
これにより、ファイル解析がスムーズに行えるようになりました。
これらをKiro CLIにMCPサーバとして読み込ませて使ってみます。
ask gordonを使ってDockerfileのベストプラクティスについて質問すると、詳細な解説が返ってきました。
> Dockerfileのベストプラクティスについて教えてください
Running tool ask_gordon with the param (from mcp server: gordon)
⋮ {
⋮ "question": "What are the best practices for writing a Dockerfile? Please provide comprehensive guidance on optimization, security, maintainability, and common patterns."
⋮ }
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:
> y
- Completed in 25.987s
> Dockerfileのベストプラクティスについて、以下の観点から説明します。
## 最適化
1. マルチステージビルドの使用
- ビルドステージと本番ステージを分けることで、最終イメージのサイズを削減
dockerfile
# ビルドステージ
FROM node:16 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 本番ステージ
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
2. 適切なベースイメージの選択
- alpineやdebian-slimなどの軽量で信頼できるイメージを使用
- Docker Hubの公式イメージを優先
3. 複数行の引数をソート
- アルファベット順にソートすることで、メンテナンスしやすく重複を防止
dockerfile
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
git \
vim \
&& rm -rf /var/lib/apt/lists/*
4. レイヤーの最小化
- コマンドを結合してレイヤー数を削減
dockerfile
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
5. .dockerignoreの使用
- 不要なファイルをビルドコンテキストから除外
node_modules
*.log
.git
## セキュリティ
1. ベースイメージのバージョン固定
dockerfile
FROM ubuntu:20.04
2. rootユーザーを避ける
dockerfile
RUN addgroup --system appgroup && adduser --system appuser --ingroup appgroup
USER appuser
3. 不要なパッケージをインストールしない
dockerfile
RUN apt-get install -y --no-install-recommends curl
4. 定期的なイメージの再ビルド
- セキュリティパッチを含めるため、--no-cacheオプションを使用
bash
docker build --no-cache -t my-image:latest .
5. エフェメラルコンテナの使用
- ステートレスで使い捨て可能な設計にする
## メンテナンス性
1. 明確なコメントの使用
dockerfile
# 依存関係のインストール
RUN apt-get update && apt-get install -y curl
2. 環境変数の活用
dockerfile
ENV PORT=3000
EXPOSE $PORT
3. 依存関係のキャッシュ最適化
dockerfile
COPY package*.json ./
RUN npm install
COPY . .
## 一般的なパターン
1. CMDでデフォルトコマンドを定義
dockerfile
CMD ["npm", "start"]
2. ENTRYPOINTで固定コマンドを定義
dockerfile
ENTRYPOINT ["python3", "app.py"]
3. 必要なポートのみ公開
dockerfile
EXPOSE 8080
4. ラベルでメタデータを追加
dockerfile
LABEL maintainer="your-email@example.com"
これらのベストプラクティスに従うことで、最適化され、安全で、メンテナンスしやすい
Dockerfileを作成できます。
▸ Time: 42s
検証用にあまりよくないDockerfileを用意しました。
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y python3
RUN apt-get install -y python3-pip
RUN apt-get install -y curl
RUN apt-get install -y git
COPY . /app
WORKDIR /app
RUN pip3 install flask
RUN pip3 install requests
RUN pip3 install psycopg2-binary
CMD python3 app.py
このファイルの解析をKiro CLIにお願いしてみると、このDockerfileの問題点と改善案が返ってきました。
> ./Dockerfileを解析してください
Running tool analyze_file with the param (from mcp server: gordon)
⋮ {
⋮ "file_path": "./Dockerfile"
⋮ }
Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:
> y
- Completed in 14.723s
> Dockerfileの解析結果です。
## 現在の構成
1. FROM ubuntu:latest - Ubuntuの最新版をベースイメージとして使用
2. RUN apt-get update - パッケージリストを更新
3. RUN apt-get install -y python3 - Python 3をインストール
4. RUN apt-get install -y python3-pip - pipをインストール
5. RUN apt-get install -y curl - curlをインストール
6. RUN apt-get install -y git - Gitをインストール
7. COPY . /app - カレントディレクトリの内容を/appにコピー
8. WORKDIR /app - 作業ディレクトリを/appに設定
9. RUN pip3 install flask - Flaskをインストール
10. RUN pip3 install requests - requestsライブラリをインストール
11. RUN pip3 install psycopg2-binary - PostgreSQL用ライブラリをインストール
12. CMD python3 app.py - app.pyを実行するデフォルトコマンド
## 改善推奨事項
1. RUNコマンドの統合
レイヤー数を削減するため、apt-getコマンドを1つにまとめる:
dockerfile
RUN apt-get update && apt-get install -y python3 python3-pip curl git && apt-get clean && rm -rf /var/lib/apt/lists/*
2. ベースイメージのバージョン固定
ubuntu:latestを特定バージョン(例: ubuntu:20.04)に変更
3. Pythonパッケージのバージョン固定
dockerfile
RUN pip3 install flask==2.3.2 requests==2.31.0 psycopg2-binary==2.9.7
4. .dockerignoreの使用
不要なファイル(.git、node_modulesなど)を除外
5. セキュリティ改善
rootユーザーでの実行を避ける:
dockerfile
RUN useradd -m appuser
USER appuser
6. ヘルスチェックの追加
dockerfile
HEALTHCHECK CMD curl --fail http://localhost:5000 || exit 1
7. マルチステージビルドの検討
最終イメージサイズを最適化
これらの改善により、Dockerfileはより効率的で安全、かつメンテナンスしやすくなります。
▸ Time: 30s
自然な統合
MCP化したことで、Kiroとの会話の中で、Gordonの知識を自然に利用することができるようになりました。Gordon自体の使用感を気にすることなく使えるようになり、Kiro CLIの使いやすさと、GordonのDocker専門知識のいいとこ取りができるようになったと思います。
Kiroによるプロンプト生成
実際にGordonに質問するのはKiroなので、AIにわかりやすいようにまとめたプロンプトをAIが生成してくれます。ユーザが提示する曖昧で非構造的な質問も、AIによって明確で構造的なプロンプトに置き換えてもらうことで、より質の高い解答が引き出せると思います。
応答速度
Kiroだけでなく、Gordonの応答を待つ必要があるため、最終的な出力に少し時間がかかります。
対話の抑制による課題
今回はプロンプトやワーキングディレクトリの調整で対話を抑制しました。
しかしGordonはあくまで対話型のAIアシスタントなので、MCPのような使い方は想定されていないはずです。
非対話的な使用では、会話の文脈を保持できません。そのため文脈を考慮した追加の質問や、返答に対して詳しい説明を求めること、Gordonからの質問に対する返答などができなくなってしまいます。
> MCPサーバGordonを使った率直な感想を教えてください
> GordonをMCPサーバとして使った率直な感想は以下の通りです:
良い点:
- Docker公式の知識ベースに基づいた正確で信頼性の高い情報を提供してくれる
- ベストプラクティスや具体的なコード例が豊富で実用的
- Dockerfileの解析機能が非常に便利で、現状の問題点と改善案を明確に示してくれる
- 公式ドキュメントへのリンクも提供されるため、さらに深く学習できる
気になる点:
- 回答が非常に詳細で包括的なため、情報量が多くなりがち
- シンプルな質問に対しても、かなり網羅的な回答が返ってくる傾向がある
- 時には必要以上に多くの推奨事項が提示される
総合的な評価:
Docker関連の質問に対して、公式の専門知識を即座に引き出せるのは大きな価値があります。
全体として、Docker開発において非常に有用なツールだと感じています。
今回は使用感がイマイチだったDocker AIのGordonを、MCP化してKiro CLIに使ってもらいました。
メインはAmazon Q/Kiro CLIでプロジェクト全体の理解やファイル操作、AWS連携を担当し、
GordonはMCP経由で補完的にDocker詳細やベストプラクティス、トラブルシューティングを担当するという役割分担にすることで、それぞれの良さを活かせると思います。
なお、現状のGordonはベータ版での提供です。今回取り上げた使いにくさも、本番リリース時には改善されている可能性があります。
また今回はDocker専門のAIでしたが、特定分野に特化してチューニングされたAIは他にも数多くあります。そしてこれからも増えていくことと思います。
そう考えると、ユーザーの要求に応じて適切なAIを出し分けるようなシステムがあっても面白いかなと思いました。
ここまで読んでいただき、ありがとうございました
・Ask Gordon
・Amazon Q
・Kiro
・FastMCP