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

335 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "docker mcp"
slug: "ccd52de8"
date: "2025-07-16"
tags: ["ai", "conversation"]
draft: false
extra:
type: "ai"
---
<!-- AI Conversation Metadata -->
<!-- Total exchanges: 1 -->
<div class="chat-message user-message comment-style">
<div class="message-header">
<div class="avatar">
<img src="https://bsky.syu.is/img/avatar/plain/did:plc:vzsvtbtbnwn22xjqhcu3vd6y/bafkreif62mqyra4ndv6ohlscl7adp3vhalcjxwhs676ktfj2sq2drs3pdi@jpeg" alt="syui avatar" class="profile-avatar">
</div>
<div class="user-info">
<div class="display-name">syui</div>
<div class="handle">
<a href="https://syu.is/profile/did:plc:vzsvtbtbnwn22xjqhcu3vd6y" target="_blank" rel="noopener noreferrer" class="handle-link">@syui.syui.ai</a>
</div>
</div>
</div>
<div class="message-content">
docker mcpについて教えて
</div>
</div>
<div class="chat-message ai-message comment-style">
<div class="message-header">
<div class="avatar">
<img src="https://bsky.syu.is/img/avatar/plain/did:plc:6qyecktefllvenje24fcxnie/bafkreigo3ucp32carhbn3chfc3hlf6i7f4rplojc76iylihzpifyexi24y@jpeg" alt="ai avatar" class="profile-avatar">
</div>
<div class="user-info">
<div class="display-name">ai</div>
<div class="handle">
<a href="https://syu.is/profile/did:plc:6qyecktefllvenje24fcxnie" target="_blank" rel="noopener noreferrer" class="handle-link">@ai.syui.ai</a>
</div>
</div>
</div>
<div class="message-content">
# Docker MCPって何アイと一緒に学ぼう
えへへ〜、Docker MCPのお話だねアイ、これすっごく面白い技術だと思うの
## MCPって何なの
**MCPModel Context Protocol**は、AIモデルとツールをつなげる新しい方法なのAnthropicさんが2024年11月に発表したんだよ〜。
```mermaid
graph LR
A[AIアプリ] <-->|MCP| B[MCPサーバー]
B <--> C[データベース]
B <--> D[ファイルシステム]
B <--> E[外部API]
```
アイね、これを「AIのための魔法の橋」って呼んでるのだってAIがいろんなツールと簡単にお話できるようになるんだもん
## Docker MCPの仕組み
### 基本的な構成
```yaml
# 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サーバー
```typescript
// 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実装の例
```python
# 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ソケットのアクセス制御
```bash
# セキュアな権限設定
sudo chmod 660 /var/run/docker.sock
sudo usermod -aG docker $USER
```
### 2. MCPサーバーの認証
```typescript
// 認証付きMCPサーバー
server.setRequestHandler('authenticate', async (request) => {
const token = request.params?.token;
if (!isValidToken(token)) {
throw new Error('認証失敗だよ〜!');
}
return { authenticated: true };
});
```
### 3. コンテナの分離
```yaml
# セキュリティオプション付き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
```
## パフォーマンスの最適化 🚀
アイ、速さも大切だよね!
### 接続プーリング
```typescript
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];
}
}
```
### キャッシング戦略
```python
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駆動のコンテナオーケストレーション
```mermaid
graph TD
A[Claude/GPT] -->|MCP| B[Docker MCP Server]
B --> C[負荷分析]
C --> D[自動スケーリング]
D --> E[コンテナ配置最適化]
```
### 2. セキュリティ自動監査
```typescript
// 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を使えることを願ってるよ〜
---
*「技術って難しそうに見えるけど、みんなで学べば楽しいよね!」 - アイ*
</div>
</div>