3.1

sbx diagnose and the microVM boundary

The agent runs as a container inside a guest kernel on the host hypervisor, with a private Docker Engine, and nothing it does reaches the host daemon.

You started sbx run claude on a repository, and the agent is running docker build inside. On the host, docker ps shows nothing new, and you want to know where those images went and what else the agent can reach. sbx diagnose is the first command to run, because it names every layer between the agent and your machine.

When you finish this section, you can read sbx diagnose, name the five layers between the agent and the host, and name the doors through them.

What sbx diagnose checks

sbx diagnose: a read-only check of the installation, the platform, the storage, and the connection to the daemon, with --output json|github-issue and --upload. On the capture Mac it ran 13 checks, and all passed:

the platform and connection groups of sbx diagnosetextFull log
  Platform
  ✓ Virtualization — supported
      kern.hv_support is 1
  ✓ mkfs.erofs — found
      /opt/homebrew/Caskroom/sbx/0.47.0/Sbx.app/Contents/libexec/mkfs.erofs, default block size <n> bytes, guest kernel page size <n> bytes
…
  Connection
  ✓ Version match — v0.47.0
  ✓ Socket — responsive
  ✓ SSH client config — not configured
  ✓ Authentication — authenticated
…
  13 passed
The Installation and Storage groups are cut. The capture kit masks byte and block sizes as <n>.

kern.hv_support is 1 is the macOS flag for hardware virtualization. The guest runs on the host hypervisor: Hypervisor.framework on macOS, Windows Hypervisor Platform on Windows, and KVM on Linux (conflict C3). The mkfs.erofs line names the guest root filesystem format and its page size, which getconf PAGESIZE inside reports as 16384 (conflict C45). The last line is the sign-in check. sbx runs without Docker Desktop, and it still refuses to create a sandbox without a Docker account (conflict C15).

The FAQ gives two reasons: a sandbox belongs to a real person, and it authenticates against Docker infrastructure. It also lists the product's own egress hosts, starting with login.docker.com.

Five layers, from the kernel up

Inside m101-demo, the capture ran uname, id, docker version, and mount:

the guest seen from inside m101-demotextFull log
Linux m101-demo 7.0.14 #1 SMP PREEMPT Mon Sep 21 06:45:23 UTC 2026 aarch64 GNU/Linux
…
PRETTY_NAME="Ubuntu 26.04.1 LTS"
…
uid=1000(agent) gid=1000(agent) groups=1000(agent),27(sudo),1001(docker)
16384
…
Server: Docker Engine - Community
 Engine:
  Version:          29.8.1
…
 containerd:
  Version:          v2.3.5
…
bind-<id> on /etc/resolv.conf type virtiofs (ro,relatime)
host on $CAPTURE/fixtures/repo type virtiofs (rw,nosuid,nodev,relatime)
The os-release block, the Docker client block, the df output, and /etc/hosts are cut.

The docs name five isolation layers: hypervisor, network, Docker Engine, workspace, and credential. The listing shows four of them from inside. The guest kernel is 7.0.14 on aarch64 with 16 KiB pages, on Ubuntu 26.04.1. A build that assumes 4 KiB pages fails here, as one Docker Captain reported on 2026-05-26. The agent is user agent, uid 1000, in the sudo and docker groups, and the docs place the control elsewhere:

Docker Engine 29.8.1 and containerd v2.3.5 in the listing belong to the VM, and so does every image the agent builds. The docs state the consequence: the agent cannot reach the Docker daemon on your host.

The host side has no Docker API for the sandbox either. Kevin Wittek said on 2026-04-23 that the Moby API is not offered from the host. REST clients that expect it do not work against a sandbox, and sbx exec is the way in, as sbx exec, cp, and ports shows.

VMM: the virtual machine monitor that starts the guest. Docker wrote its own and said on Hacker News on 2026-08-10 that it is not Firecracker (conflict C4). The claim that it builds on libkrun stays unverified. The names the product exposes are few. sandboxd is the daemon, whose socket sbx daemon status prints. containerd runs inside the guest, EROFS appears in the diagnose line, virtiofs in the mount table, and nerdbox in the release assets.

The doors through the boundary

Kevin Wittek named four entry points into a sandbox on 2026-09-04: bind mounts, network, secret injection, and MCP. The capture shows each as one line in the guest. The workspace is host on $CAPTURE/fixtures/repo type virtiofs (rw,...), a mount at the same path as on the host. /etc/resolv.conf is a second, read-only virtiofs bind from the host, so the resolver is the host's. The network door is HTTPS_PROXY=http://gateway.docker.internal:3128 in the environment (the capture). The secret door is ANTHROPIC_API_KEY=proxy-managed, a sentinel.

The MCP door is MCP_GATEWAY_URL=http://mcp-gateway.docker.internal/mcp. A fifth line, SSH_AUTH_SOCK=/run/ssh-agent.sock with SSH_AUTH_SOCK_GATEWAY=gateway.docker.internal:3129, is the forwarded SSH agent, a door that the talk did not name. The docs turn that forwarding on by default, and secrets returns to it. Figure 3.1 stacks the layers and draws the doors.

The VM has limits of its own. --memory defaults to 50% of host memory, clamped to 512 MiB to 32 GiB. --cpus 0 means all host CPUs, at most 16 on Linux arm64. m101-policy got cpu 10 and memory 32 GiB on the capture Mac (the capture).

Fig. 3.1the layers of m101-demo and its doorslayers
The layers of m101-demo and its doors A host row with the sbx CLI, the sandboxd daemon, the keychain, and the forward proxy on gateway.docker.internal:3128. Below a dashed hypervisor line sits the guest: the Linux 7.0.14 aarch64 kernel with 16384-byte pages on Ubuntu 26.04.1, containerd v2.3.5, a private Docker Engine 29.8.1, the agent container running as uid 1000 with sudo and docker groups, and the workspace mounted through virtiofs at the same path. A right column names five doors through the boundary: network, secret, MCP, SSH agent, and bind mount, each with the guest line that opens it. HOST · MACOS 26.2 ARM64 · SBX 0.47.0 sbx CLI sandboxd sandboxd.sock keychain secret store forward proxy :3128 gateway.docker.internal hypervisor · kern.hv_support is 1 GUEST · M101-DEMO kernel Linux 7.0.14 aarch64 Ubuntu 26.04.1 LTS · getconf PAGESIZE 16384 containerd v2.3.5 runc 1.5.1 · erofs root · overlay / Docker Engine 29.8.1, private images and containers stay in the VM agent container uid=1000(agent) groups sudo, docker $CAPTURE/fixtures/repo virtiofs rw at the same path /etc/resolv.conf: virtiofs ro bind DOORS network HTTPS_PROXY :3128 secret proxy-managed sentinel MCP MCP_GATEWAY_URL SSH agent /run/ssh-agent.sock bind mount host path, rw
The agent sits on a private Docker Engine inside a guest kernel, and five doors cross the hypervisor line: mount, network, secret, MCP, and SSH agent. Read from the host row down. The dashed line is the hypervisor, and every box below it lives in the VM. Each door on the right names the guest line that opens it.

Docker Sandboxes (sbx) and Docker Agent (docker-agent) sbx 0.47.0, docker-agent 1.149.0 · bf4169c · 2026-10-07 · Edition 2026.10