0Pricing
AI Agents · บทเรียน

แซนด์บ็อกซ์เอเจนต์บน Docker

สร้างคอนเทนเนอร์ชั่วคราวสำหรับเรียกใช้โค้ดที่เอเจนต์สร้างขึ้น

แซนด์บ็อกซ์เอเจนต์บน Docker เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดเอเจนต์จึงต้องใช้แซนด์บ็อกซ์

เมื่อเอเจนต์เรียกใช้โค้ดที่เขียนโดย LLM โค้ดนั้นถือว่าไม่น่าเชื่อถือ โค้ดอาจพยายามอ่านไฟล์ที่มีข้อมูลละเอียดอ่อน สร้างการเชื่อมต่อขาออก หรือใช้ทรัพยากรอย่างไม่จำกัด

แซนด์บ็อกซ์จะแยกการเรียกใช้โค้ดออกจากส่วนอื่น เพื่อจำกัดความเสียหายไม่ว่าโค้ดจะทำอะไร

Docker ในฐานะชั้นแซนด์บ็อกซ์

คอนเทนเนอร์ Docker มอบการแยกในระดับ OS ที่มีน้ำหนักเบา โค้ดแต่ละส่วนจะทำงานภายในคอนเทนเนอร์ใหม่ที่มีการกำหนดขีดจำกัดทรัพยากรและข้อจำกัดเครือข่ายไว้อย่างชัดเจน

SDK ของ Python สำหรับ docker ช่วยให้คุณสร้างและทำลายคอนเทนเนอร์ด้วยโปรแกรมจากภายในเอเจนต์ได้

import docker

client = docker.from_env()
print(client.version()['Version'])

การเรียกใช้คอนเทนเนอร์พื้นฐาน

client.containers.run() จะเริ่มต้นคอนเทนเนอร์ เรียกใช้คำสั่ง และส่งคืนเอาต์พุตเป็นไบต์ การตั้งค่า auto_remove=True จะล้างคอนเทนเนอร์หลังจากสิ้นสุดการทำงาน

import docker

client = docker.from_env()

output = client.containers.run(
    'python:3.12-slim',
    'python -c "print(2 + 2)"',
    auto_remove=True
)

print(output.decode())  # '4'

ขีดจำกัดหน่วยความจำและ CPU

หากไม่มีขีดจำกัด สคริปต์ที่ทำงานผิดปกติอาจใช้หน่วยความจำของโฮสต์จนหมด ให้ส่งค่า mem_limit และ nano_cpus เพื่อจำกัดการใช้ทรัพยากร

หากกระบวนการใช้หน่วยความจำเกิน mem_limit คอนเทนเนอร์จะถูกยุติโดย OOM และจะเกิดข้อยกเว้นขึ้น

output = client.containers.run(
    'python:3.12-slim',
    'python -c "x = [0]*10**8"',   # tries to allocate ~800 MB
    mem_limit='256m',
    nano_cpus=1_000_000_000,        # 1 CPU
    auto_remove=True
)
# Raises docker.errors.ContainerError if OOM-killed

การปิดใช้งานเครือข่าย

การตั้งค่า network_disabled=True จะป้องกันไม่ให้คอนเทนเนอร์สร้างการเชื่อมต่อเครือข่ายขาออกหรือขาเข้า แม้แต่การค้นหา DNS ก็จะล้มเหลว วิธีนี้จะหยุดการลักลอบนำข้อมูลออกและการติดต่อกลับไปยังระบบสั่งการและควบคุม

output = client.containers.run(
    'python:3.12-slim',
    'python -c "import urllib.request; urllib.request.urlopen(\"http://example.com\")"',
    network_disabled=True,
    auto_remove=True
)
# Raises ContainerError: network unreachable

หมดเวลาการทำงาน

ลูปไม่สิ้นสุดภายในแซนด์บ็อกซ์อาจทำให้เอเจนต์ของคุณหยุดรอไปตลอด ให้ส่งค่า timeout ซึ่งระบุเป็นวินาทีให้กับ containers.run() เพื่อให้ด็อกเกอร์ยุติคอนเทนเนอร์เมื่อถึงกำหนดเวลา

import docker
from docker.errors import ContainerError

client = docker.from_env()

try:
    output = client.containers.run(
        'python:3.12-slim',
        'python -c "while True: pass"',
        mem_limit='256m',
        network_disabled=True,
        auto_remove=True,
        timeout=30
    )
except Exception as e:
    print(f'Sandbox timeout or error: {e}')

ฟังก์ชันช่วยเหลือแซนด์บ็อกซ์แบบครบถ้วน

การรวมการตั้งค่าทั้งหมดไว้ในฟังก์ชันที่นำกลับมาใช้ใหม่ได้ช่วยให้เรียกใช้จากเครื่องมือของเอเจนต์ได้ง่าย ให้ส่งคืนทั้งเอาต์พุตมาตรฐานและแฟล็กสถานะ เพื่อให้เอเจนต์จัดการกับความล้มเหลวได้

import docker

client = docker.from_env()

def run_in_sandbox(code: str, timeout: int = 30) -> dict:
    cmd = f'python -c "{code.replace(chr(34), chr(39))}"'
    try:
        out = client.containers.run(
            'python:3.12-slim',
            cmd,
            mem_limit='256m',
            nano_cpus=500_000_000,
            network_disabled=True,
            auto_remove=True,
            timeout=timeout
        )
        return {'success': True, 'output': out.decode()}
    except Exception as e:
        return {'success': False, 'error': str(e)}

การเมานต์พื้นที่ทำงานชั่วคราว

หากโค้ดจำเป็นต้องอ่านไฟล์อินพุตหรือเขียนไฟล์เอาต์พุต ให้เมานต์ไดเรกทอรีของโฮสต์แบบชั่วคราวเข้าไปในคอนเทนเนอร์ ใช้ volumes พร้อมโหมด 'rw' สำหรับพื้นที่ทำงานเท่านั้น และไม่ต้องเมานต์สิ่งอื่น

import tempfile, os

with tempfile.TemporaryDirectory() as tmpdir:
    # Write input data
    with open(os.path.join(tmpdir, 'data.txt'), 'w') as f:
        f.write('hello sandbox')

    output = client.containers.run(
        'python:3.12-slim',
        'python -c "print(open(\"/workspace/data.txt\").read())"',
        volumes={tmpdir: {'bind': '/workspace', 'mode': 'rw'}},
        mem_limit='256m',
        network_disabled=True,
        auto_remove=True
    )
    print(output.decode())

ระบบไฟล์แบบอ่านอย่างเดียว

ตั้งค่า read_only=True เพื่อเมานต์ระบบไฟล์รากของคอนเทนเนอร์เป็นแบบอ่านอย่างเดียว โค้ดจะเขียนได้เฉพาะลงในโวลุ่มที่เมานต์ไว้อย่างชัดเจนเท่านั้น วิธีนี้จะป้องกันการเขียนลงใน /etc /usr หรือเส้นทางสำคัญอื่น ๆ ภายในอิมเมจ

import tempfile

with tempfile.TemporaryDirectory() as tmpdir:
    output = client.containers.run(
        'python:3.12-slim',
        'python -c "open(\"/output/result.txt\",\"w\").write(str(1+1))"',
        volumes={tmpdir: {'bind': '/output', 'mode': 'rw'}},
        read_only=True,
        mem_limit='256m',
        network_disabled=True,
        auto_remove=True
    )
    print(open(f'{tmpdir}/result.txt').read())  # '2'

การผสานแซนด์บ็อกซ์เข้ากับเครื่องมือของเอเจนต์

ลงทะเบียนตัวเรียกใช้แซนด์บ็อกซ์เป็นเครื่องมือที่ LLM เรียกใช้ได้ เอเจนต์จะสร้างโค้ด เครื่องมือจะเรียกใช้โค้ดนั้นอย่างแยกอิสระ และเอาต์พุตจะถูกส่งกลับไปยังขั้นตอนการให้เหตุผลถัดไป

tools = [
    {
        'type': 'function',
        'function': {
            'name': 'execute_python',
            'description': 'Run a Python snippet in an isolated Docker sandbox.',
            'parameters': {
                'type': 'object',
                'properties': {
                    'code': {'type': 'string', 'description': 'Python code to execute.'}
                },
                'required': ['code']
            }
        }
    }
]

def handle_tool_call(name, args):
    if name == 'execute_python':
        return run_in_sandbox(args['code'])

การจัดการข้อผิดพลาดและการล้างข้อมูล

คอนเทนเนอร์อาจเริ่มต้นไม่สำเร็จหากดีมอนของด็อกเกอร์ไม่ได้ทำงานอยู่ หรือหากอิมเมจไม่ได้อยู่ในแคช ควรจัดการ docker.errors.DockerException เสมอ และตรวจสอบให้แน่ใจว่าคอนเทนเนอร์ได้รับการล้างข้อมูลแม้จะเกิดข้อยกเว้น

from docker.errors import DockerException, ImageNotFound

def safe_run(code: str) -> dict:
    try:
        return run_in_sandbox(code)
    except ImageNotFound:
        # Pull the image first
        client.images.pull('python:3.12-slim')
        return run_in_sandbox(code)
    except DockerException as e:
        return {'success': False, 'error': f'Docker unavailable: {e}'}
    except Exception as e:
        return {'success': False, 'error': str(e)}

การตั้งค่าแซนด์บ็อกซ์ใดสำคัญที่สุดในการป้องกันการลักลอบนำข้อมูลออก

แซนด์บ็อกซ์ของเอเจนต์ต้องป้องกันไม่ให้โค้ดที่เรียกใช้ส่งข้อมูลที่ขโมยมาไปยังเซิร์ฟเวอร์ภายนอก พารามิเตอร์ใดของด็อกเกอร์ที่บล็อกการเข้าถึงเครือข่ายขาออกโดยตรง

สรุปแซนด์บ็อกซ์ของด็อกเกอร์

แซนด์บ็อกซ์ที่ใช้ด็อกเกอร์มอบสภาพแวดล้อมการทำงานที่ปลอดภัยให้เอเจนต์ โดยผสาน ขีดจำกัดหน่วยความจำและ CPU การแยกเครือข่าย การจำกัดเวลาการทำงาน และ ระบบไฟล์แบบอ่านอย่างเดียว

รวมการตั้งค่าเหล่านี้ไว้ในฟังก์ชันช่วยเหลือที่นำกลับมาใช้ใหม่ได้ และเปิดให้เป็นเครื่องมือของเอเจนต์ เพื่อให้ LLM เรียกใช้โค้ดที่สร้างขึ้นได้อย่างปลอดภัยโดยไม่เสี่ยงต่อระบบโฮสต์

คำถามที่พบบ่อย

บทเรียน “แซนด์บ็อกซ์เอเจนต์บน Docker” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “แซนด์บ็อกซ์เอเจนต์บน Docker” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “แซนด์บ็อกซ์เอเจนต์บน Docker”

สร้างคอนเทนเนอร์ชั่วคราวสำหรับเรียกใช้โค้ดที่เอเจนต์สร้างขึ้น คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “แซนด์บ็อกซ์เอเจนต์บน Docker” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แซนด์บ็อกซ์เอเจนต์บน Docker
  2. การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง
  3. บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์
  4. นโยบายความปลอดภัยสำหรับการเรียกใช้โค้ด
← กลับไปที่ AI Agents