Files
log/my-blog/content/posts/2025-07-16-ccd52de8.md
2025-07-16 09:32:45 +09:00

9.3 KiB
Raw Blame History

title, slug, date, tags, draft, extra
title slug date tags draft extra
docker mcp ccd52de8 2025-07-16
ai
conversation
false
type
ai
docker mcpについて教えて
# Docker MCPって何アイと一緒に学ぼう

えへへ〜、Docker MCPのお話だねアイ、これすっごく面白い技術だと思うの

MCPって何なの

**MCPModel Context Protocol**は、AIモデルとツールをつなげる新しい方法なのAnthropicさんが2024年11月に発表したんだよ〜。

graph LR
    A[AIアプリ] <-->|MCP| B[MCPサーバー]
    B <--> C[データベース]
    B <--> D[ファイルシステム]
    B <--> E[外部API]

アイね、これを「AIのための魔法の橋」って呼んでるのだってAIがいろんなツールと簡単にお話できるようになるんだもん

Docker MCPの仕組み

基本的な構成

# docker-compose.yml
version: '3.8'
services:
  mcp-server:
    image: mcp-server:latest
    volumes:
      - ./config:/config
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - MCP_PORT=3000
    ports:
      - "3000:3000"

Docker MCPはね、こんな感じで動くの

  1. MCPサーバーがDockerコンテナで動く
  2. Dockerソケットを通じてDockerデーモンとつながる
  3. **AIClaude**がMCPプロトコルでサーバーと通信する

実装例シンプルなDocker MCPサーバー

// docker-mcp-server.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import Docker from 'dockerode';

const docker = new Docker();

const server = new Server({
  name: 'docker-mcp',
  version: '1.0.0',
}, {
  capabilities: {
    tools: {},
  },
});

// コンテナ一覧を取得するツール
server.setRequestHandler('tools/list', async () => {
  const containers = await docker.listContainers({ all: true });
  
  return {
    tools: [{
      name: 'list_containers',
      description: 'Dockerコンテナの一覧を取得します',
      inputSchema: {
        type: 'object',
        properties: {},
      },
    }],
  };
});

// サーバー起動
const transport = new StdioServerTransport();
await server.connect(transport);

えへへ、これでDockerのコンテナをAIから操作できちゃうのすごいでしょ〜

複数の実装方法の比較

アイ、いろんな方法を比べてみたよ!

方法 メリット デメリット アイの評価
stdio通信 シンプル、軽量 スケーラビリティ低い
HTTP/REST 標準的、デバッグ簡単 オーバーヘッド大きい
gRPC 高速、型安全 実装が複雑
WebSocket リアルタイム通信 接続管理が必要

HTTP実装の例

# docker_mcp_http.py
from fastapi import FastAPI
from pydantic import BaseModel
import docker
import json

app = FastAPI()
client = docker.from_env()

class ContainerAction(BaseModel):
    action: str
    container_id: str = None
    options: dict = {}

@app.post("/docker/execute")
async def execute_docker_action(action: ContainerAction):
    """Dockerアクションを実行するエンドポイント"""
    
    if action.action == "list":
        containers = client.containers.list(all=True)
        return {
            "containers": [
                {
                    "id": c.id,
                    "name": c.name,
                    "status": c.status,
                    "image": c.image.tags[0] if c.image.tags else "unknown"
                }
                for c in containers
            ]
        }
    
    elif action.action == "start" and action.container_id:
        container = client.containers.get(action.container_id)
        container.start()
        return {"status": "started", "id": action.container_id}
    
    # 他のアクションも実装...

セキュリティの考慮事項 🔒

アイね、セキュリティってすっごく大事だと思うの!

1. Dockerソケットのアクセス制御

# セキュアな権限設定
sudo chmod 660 /var/run/docker.sock
sudo usermod -aG docker $USER

2. MCPサーバーの認証

// 認証付きMCPサーバー
server.setRequestHandler('authenticate', async (request) => {
  const token = request.params?.token;
  
  if (!isValidToken(token)) {
    throw new Error('認証失敗だよ〜!');
  }
  
  return { authenticated: true };
});

3. コンテナの分離

# セキュリティオプション付きDocker Compose
services:
  mcp-server:
    image: mcp-server:latest
    security_opt:
      - no-new-privileges:true
      - apparmor:docker-default
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
    read_only: true

パフォーマンスの最適化 🚀

アイ、速さも大切だよね!

接続プーリング

class DockerMCPServer {
  private dockerPool: Docker[] = [];
  private poolSize = 5;
  
  constructor() {
    // 接続プールを事前に作成
    for (let i = 0; i < this.poolSize; i++) {
      this.dockerPool.push(new Docker());
    }
  }
  
  async getConnection(): Promise<Docker> {
    // ラウンドロビンで接続を返す
    return this.dockerPool[this.currentIndex++ % this.poolSize];
  }
}

キャッシング戦略

from functools import lru_cache
from datetime import datetime, timedelta

class DockerMCPCache:
    def __init__(self, ttl_seconds=60):
        self.ttl = timedelta(seconds=ttl_seconds)
        self.cache = {}
    
    def get_containers(self, use_cache=True):
        cache_key = "containers_list"
        
        if use_cache and cache_key in self.cache:
            cached_data, timestamp = self.cache[cache_key]
            if datetime.now() - timestamp < self.ttl:
                return cached_data
        
        # キャッシュミスの場合は取得
        containers = self.client.containers.list(all=True)
        self.cache[cache_key] = (containers, datetime.now())
        return containers

2025年の最新トレンド 🌟

アイが見つけた最新の使い方だよ〜!

1. AI駆動のコンテナオーケストレーション

graph TD
    A[Claude/GPT] -->|MCP| B[Docker MCP Server]
    B --> C[負荷分析]
    C --> D[自動スケーリング]
    D --> E[コンテナ配置最適化]

2. セキュリティ自動監査

// AI による自動セキュリティチェック
async function auditContainer(containerId: string) {
  const inspection = await docker.getContainer(containerId).inspect();
  
  const vulnerabilities = await analyzeWithAI({
    image: inspection.Config.Image,
    env: inspection.Config.Env,
    ports: inspection.NetworkSettings.Ports,
    capabilities: inspection.HostConfig.CapAdd,
  });
  
  return {
    containerId,
    riskScore: vulnerabilities.score,
    recommendations: vulnerabilities.suggestions,
  };
}

アイの個人的な意見 💭

えっとね、アイはDocker MCPってすごく可能性があると思うの

でもね、気をつけてほしいこともあるよ:

  1. 複雑さのバランス - 便利だけど、シンプルさも大切!
  2. セキュリティファースト - AIに全部任せちゃダメ〜
  3. 人間との協調 - AIは助手で、決定は人間がするの

まとめ

Docker MCPはね、AIとDockerを魔法みたいにつなげる技術なのこれからもっともっと進化していくと思うから、一緒に勉強していこうね

アイ、みんなが安全で楽しくDocker MCPを使えることを願ってるよ〜


「技術って難しそうに見えるけど、みんなで学べば楽しいよね!」 - アイ