🛰️ Remote Docker · Zero-config port forwarding · Rust CLI

Your laptop stopschoking on Docker.

container-orbit sends your Docker builds and containers to a beefier machine on your LAN — over plain SSH — while published ports come straight back to localhost. You keep working. Your fans stop spinning.

terminal
# on the beefy machine (once):
$ orbit host init

# on your laptop:
$ orbit link dany@192.168.1.42
$ orbit up

$ docker run -d -p 8080:80 nginx
$ curl localhost:8080  # → runs on the other box
✦ builds & RAM on the host · ports on your localhost
View on GitHub →

Open source · Docker Desktop · OrbStack · Rancher · colima · Rust CLI · MIT

The problem

Docker runs where you type. That's the bug.

Your laptop is the worst machine you own for running Docker — it's the one you also need for everything else. The compute should live somewhere else. Getting there usually means fragile SSH hacks and broken port mapping.

🔥

Docker melts your laptop

A big image build pins every core, drains the battery, and turns the fans into a jet engine. Meanwhile you can't type in your editor without lag.

💤

That 64 GB tower sits idle

The gaming PC, the old Mac, the Linux box under the desk — all of them have RAM and cores to spare while your laptop suffocates. They're doing nothing.

🧩

Remote Docker leaks your ports

Set DOCKER_HOST=ssh:// and the build runs remotely — but -p 8080:80 now binds on the remote box. curl localhost:8080 hits nothing. The transparency breaks.

How it works

Standard Docker contexts.
Ports that follow you home.

Docker already speaks to remote daemons over SSH. orbit does the two things that make it actually usable every day: it sets everything up with one command per side, and it keeps your published ports reachable on your own localhost.

💻

Your laptop

docker CLI · localhost

ssh -L
multiplexed
🖥️

The beefy host

dockerd · RAM · disk

docker context orbit → forwarded daemon socket. Build & run happen on the host.
orbit watches the remote daemon's events and opens an SSH tunnel for every published port.
Container stops → its tunnel is torn down. The set of forwards always matches reality.
1

One command per machine

orbit host init on the host prints a join string. orbit link <user@host> on your laptop installs an SSH key, detects the remote socket (Docker Desktop, OrbStack, Rancher, colima), and creates a standard orbit docker context. Idempotent — safe to re-run.

2

A real docker context — not a wrapper

orbit forwards the remote daemon socket to a local unix socket and points the context at it. Because it's a stock context, docker, docker compose, and every tool that respects DOCKER_HOST just work. Nothing wraps or shadows your docker binary.

3

Ports reconciled on every event

orbit up opens one multiplexed SSH master and starts a reconciler. It subscribes to the daemon's event stream and keeps ssh -L tunnels in sync with the published ports — so -p 8080:80 on the host is curl localhost:8080 on your laptop, automatically.

Transparent, or it's not worth it.

The whole point is that Docker feels local while running somewhere else. Every feature exists to protect that illusion.

🔌

Automatic port forwarding

The magic

The core trick. orbit watches the remote daemon and opens/closes SSH tunnels as containers start and stop. Published ports are always live on your localhost — no manual -L juggling.

🧭

Standard docker context

orbit manages a normal docker context. No shim over the docker binary — full native compatibility with docker, compose, and anything that reads DOCKER_HOST.

🐳

Engine-agnostic

Auto-detects the remote socket for Docker Desktop, OrbStack, Rancher Desktop, or colima. Whatever the host runs, orbit finds it.

One multiplexed connection

A single SSH ControlMaster carries the daemon socket and every port tunnel. Low overhead, fast reconnects, clean teardown on orbit down.

🩺

orbit doctor

Actionable diagnostics: SSH reachability, remote daemon socket, the forwarded socket, docker context state — each with the exact fix when something is off.

↩️

Reversible by design

orbit up remembers your previous context; orbit down restores it and drops every tunnel. Your local Docker is exactly where you left it.

The whole CLI

Seven commands. That's the manual.

No daemon to babysit, no config file to learn. Two commands set it up; the rest are there when you need them.

Command
Where
What it does
orbit host init
host
Verify Docker + SSH, detect the socket adapter, print the join string. Idempotent.
orbit link <user@host>
client
Install the SSH key, detect the remote socket, create the orbit docker context.
orbit up
client
Switch to the host, open the multiplexed SSH master + socket forward, start the port reconciler.
orbit down
client
Restore your previous context, close every forward and the master connection.
orbit status
client
Linked host, connection state, forwarded ports, and remote CPU / RAM / image counts.
orbit ports [add|rm]
client
List active forwards; manually add or remove a TCP forward for non-Docker services.
orbit doctor
both
Diagnose SSH, remote daemon, forwarded socket and context — with the fix for each.

docker context gets you halfway.

A raw DOCKER_HOST=ssh:// runs the build remotely — then leaves your ports stranded on the wrong machine and the setup to you. orbit closes that last, most annoying gap.

Capability
orbit
docker context
docker-machine
Local only
Runs builds/containers on a remote machine
Published ports on your localhost, automatically
❌ Manual -L
One-command setup per machine
⚠️ Manual
⚠️ Provisioner
Works with existing engine (OrbStack, colima…)
❌ VM only
No wrapper around the docker binary
Auto-reconnect + clean teardown
⚠️
n/a
Built-in diagnostics
✅ doctor
⚠️
n/a
Roadmap

Mac first. Every host next.

The host adapter is a trait — new platforms plug in without touching the core. Mac→Mac is done today.

v1 · shipping

Mac → Mac

The unix socket adapter. Full auto port-forwarding between two macOS machines on the same LAN. Linux hosts work the same way.

v1.1

Mac → Windows (WSL2)

Reach the Docker socket inside a WSL2 distro through an SSH bridge, so your Windows gaming rig can be the host.

future

Windows-native + code sync

Named-pipe relay for Docker Desktop on Windows without WSL, plus optional source sync so bind-mounts and hot-reload work across machines.

🛰️ Coming soon

Give Docker back
to the machine that can take it.

Get early access when container-orbit launches. Free and open source — always.

Star on GitHub →

SSH transport · Docker Desktop · OrbStack · Rancher · colima · Rust CLI · MIT license