Docker 기반 에이전트 샌드박스
에이전트가 생성한 코드를 실행하기 위해 일회용 컨테이너를 생성합니다.
Docker 기반 에이전트 샌드박스은(는) CoddyKit의 무료 AI Agents 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Agents 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
에이전트에 샌드박스가 필요한 이유
에이전트가 LLM이 작성한 코드를 실행할 때 해당 코드는 신뢰할 수 없습니다. 민감한 파일을 읽거나 외부 연결을 설정하거나 리소스를 무제한으로 사용할 수 있습니다.
샌드박스는 코드가 무엇을 하든 피해가 제한되도록 코드 실행을 격리합니다.
샌드박스 계층으로서의 Docker
Docker 컨테이너는 가벼운 OS 수준의 격리를 제공합니다. 각 코드 조각은 명시적인 리소스 제한과 네트워크 제약이 적용된 새로운 컨테이너 내부에서 실행됩니다.
docker Python SDK를 사용하면 에이전트 내부에서 프로그래밍 방식으로 컨테이너를 생성하고 제거할 수 있습니다.
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실행 제한 시간
샌드박스 내부의 무한 루프는 에이전트를 영원히 멈추게 할 수 있습니다. containers.run()에 제한 시간(초)을 나타내는 timeout을 전달하면 Docker가 기한이 지난 후 컨테이너를 종료합니다.
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)}임시 작업 공간 마운트
코드에서 입력 파일을 읽거나 출력 파일을 작성해야 한다면 임시 호스트 디렉터리를 컨테이너에 마운트하십시오. 작업 공간에는 쓰기 모드 'rw'의 volumes를 사용하고 다른 것은 마운트하지 마십시오.
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 데몬이 실행 중이 아니거나 이미지가 캐시되어 있지 않으면 컨테이너가 시작되지 않을 수 있습니다. 항상 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)}데이터 유출을 방지하는 데 가장 중요한 샌드박스 설정은 무엇인가요?
에이전트 샌드박스는 실행된 코드가 훔친 데이터를 외부 서버로 전송하지 못하도록 해야 합니다. 어떤 Docker 매개변수가 외부로 나가는 네트워크 접근을 직접 차단하나요?
Docker 샌드박스 복습
Docker 기반 샌드박스는 메모리 및 CPU 제한, 네트워크 격리, 실행 제한 시간, 읽기 전용 파일 시스템을 결합하여 에이전트에 안전한 실행 환경을 제공합니다.
이 설정들을 재사용 가능한 도우미로 묶어 에이전트 도구로 제공하면 호스트 시스템에 위험을 초래하지 않고 LLM이 생성한 코드를 안전하게 실행할 수 있습니다.
자주 묻는 질문
“Docker 기반 에이전트 샌드박스” 강의는 무료인가요?
네 — “Docker 기반 에이전트 샌드박스” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Agents 강의 전체를 잠금 해제할 수 있습니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
“Docker 기반 에이전트 샌드박스”에서 뭘 배우나요?
에이전트가 생성한 코드를 실행하기 위해 일회용 컨테이너를 생성합니다. 브라우저에서 직접 실행하는 실습 코드로 AI Agents을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Agents을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Agents은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“Docker 기반 에이전트 샌드박스” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Agents 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Agents 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Docker 기반 에이전트 샌드박스
- 고도 보안 코드 에이전트를 위한 VM 격리
- E2B 및 클라우드 샌드박스 서비스
- 코드 실행을 위한 보안 정책