แซนด์บ็อกซ์เอเจนต์บน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แซนด์บ็อกซ์เอเจนต์บน Docker
- การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง
- บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์
- นโยบายความปลอดภัยสำหรับการเรียกใช้โค้ด