mrkeyoor.com_
Tue 29 Sept 18:28 UTC
Dev Toolsevaluationupdated 27 Aug 2026

moby review

Moby is the open-source engine code and component set used upstream by Docker Engine and other container systems. It gives engine builders APIs and swappable pieces for images, containers, networking, storage, and orchestration, rather than a polished product for ordinary container users.

+13stars / 7d
Verdict

Our Moby build took 188 seconds, while tests hit the 900-second cap with 19 passing and 4 failing out of 23 recorded. That cost makes sense for engineers changing Docker Engine or building a related container platform. Everyone else should install Docker or Podman, or use Moby's client and API modules instead of owning the daemon source.

We ran it

Lab card: what happened when we ran mobyScreenshot of moby (mobyproject.org)
Install✓ · 92s0 packages
Build✓ · 188s
Tests✗ timed out · 900s19 passed · 4 failed of 23 (go test)
Repo3281 files~382,561 lines of source · 29.9 MB · 21 CI workflows · Dockerfile

Answers from our run

Does moby build from source?

Dependencies installed in 92 seconds (0 packages), and the build succeeded in 188 seconds. We cloned commit d93602c into a clean Debian container with 3 CPUs and no project-specific setup.

Do moby's tests pass?

Not all of them: 19 of 23 passed and 4 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use moby?

Developers who only want to run containers: the README says Moby targets engine developers, while Docker products target end users.

What are the alternatives to moby?

Podman, containerd, CRI-O. Our Moby build took 188 seconds, while tests hit the 900-second cap with 19 passing and 4 failing out of 23 recorded.

Setup2/5Build worked, but useful testing needs engine privileges
Docs4/5Clear scope, module boundaries, and contributor guidance
Community5/5Same-day code activity and a current engine release
Maturity5/5Core Docker Engine upstream with explicit compatibility boundaries

Discussed on

  1. hnA new upstream project to break up Docker into independent components571 points
  2. hnDocker 19.03: Rootless Mode (Experimental)97 points
  3. hnThe Moby Project: accelerated software containerization36 points
  4. hnDocker is still silently punching holes in your firewall after 5 years23 points
  5. hnDocker is transitioning to the Moby Project7 points

Who it’s for

Engineers changing Docker Engine behavior or contributing fixes upstream.
Platform vendors assembling a container engine and willing to integrate and support its components.
Go developers using the separately versioned Moby client or API modules.
Container specialists working directly on daemon internals, storage, networking, or Swarm.

Who it’s NOT for

Developers who only want to run containers: the README says Moby targets engine developers, while Docker products target end users.
Companies requiring commercial support from this repository: releases receive best-effort community support.
Go applications importing the root module as a stable library: it produces binaries and has no API stability guarantee.
Code still importing github.com/docker/docker: that module was deprecated with Docker v29 and is no longer updated.
Contributors limited to an unprivileged environment: the documented development path uses a privileged container, and our tests hit permission errors under /etc/docker.

Setup reality

Our fresh sandbox completed installation in 92 seconds and installed 0 packages. The build succeeded in 188 seconds. Tests ran until the 900-second limit and timed out; the Go parser recorded 19 passed and 4 failed out of 23. The tail shows three remote IPAM tests failing because they could not create /etc/docker in the unprivileged container. It does not show the fourth failure.

The contributor path expects Git, Make, and an existing Docker installation. make shell builds the development image and enters a privileged container; building and exercising dockerd then uses repository scripts. Integration tests also need a daemon and inspect its state.

Running a container engine is host-level work, with privileges, storage, networking, containerd, runc, and API exposure to manage. The Docker CLI lives elsewhere. Go consumers should use the independently versioned client or api modules, not the root engine module.

Docker Engine's source, not the Docker product

Moby is easy to misread because the repository produces Docker Engine binaries and carries years of Docker history. The project describes itself as a set of components for assembling container systems. Docker uses it upstream, while other vendors can reuse or replace pieces. Its intended reader is an engine developer who wants to change container behavior, not an application developer looking for a friendly way to start a database.

That distinction shapes the code. Moby values modular APIs and replaceable implementations over a prescribed user experience. The source covers daemon behavior, image management, networking, volumes, execution, and Swarm orchestration. Related work lives in other repositories, including containerd for runtime primitives, BuildKit for builds, and docker/cli for the familiar command. A usable product assembles these pieces, packages them for an operating system, and supports the resulting combination.

The Apache 2.0 license permits broad reuse. Support expectations are equally clear. Repository releases receive best-effort support from maintainers, community members, and users. The README sends companies that need commercial support toward Docker Desktop or Mirantis Container Runtime. If a team only wants to run containers, starting from Moby source adds responsibility without improving the daily experience.

The Go module boundary matters

Docker v29 changed how Go consumers should treat this repository. The old github.com/docker/docker module is deprecated and will not receive updates. Applications that call the Engine API should import github.com/moby/moby/client; code sharing API types should use github.com/moby/moby/api. Those modules carry independent versions and tags.

The root github.com/moby/moby/v2 module exists to build engine binaries. Its APIs can change without library compatibility guarantees. Docker Engine tags use a docker- prefix and are also intended for binary builds, not consumption through go get. Using the root module ties an application to daemon internals that the maintainers explicitly decline to stabilize.

For most Go teams, the client module is the sensible choice. It provides a supported path to the Engine API without vendoring an engine. Forking the root becomes reasonable only when the daemon itself must change, such as for a storage integration, networking behavior, or container platform based on Moby.

What happened when we ran it

We cloned commit d93602c into a fresh unprivileged Debian container with three CPUs, 8 GB of memory, Go 1.24, and no secrets. The checkout contained 3,281 files, about 382,561 lines of source, and occupied 29.9 MB. Installation succeeded in 92 seconds and installed 0 packages. That zero describes the harness's package count, not an absence of Go dependencies.

The build succeeded in 188 seconds. This matters because the repository's core source could compile within the constrained container even though the environment could not provide the privileges expected by every test.

Tests continued until our 900-second limit and timed out. The Go parser recorded 19 passing and 4 failing tests out of 23. The tail shows TestGetCapabilitiesFromLegacyDriver, TestGetDefaultAddressSpaces, and TestRemoteDriver failing when they tried to create /etc/docker and received permission denied. The fourth failure is not visible in the supplied tail, so we cannot describe it. A timeout with four recorded failures is plainly not a pass.

These findings also show why a generic unprivileged container is an incomplete Moby development environment. Some packages can build and some tests can run, while daemon and networking code touches host-level paths and facilities. Contributors should use the project's documented targets and a disposable Docker-capable host, then narrow tests to the subsystem they changed before running wider suites.

Development assumes control of the host

Moby's contributor environment is a Docker image built from the repository. The documented prerequisites are Git, Make, and a current Docker installation. make shell creates the environment and opens a privileged container. Inside it, repository scripts build dockerd, install the binary, and start a debug daemon.

Privilege is expected because an engine manipulates namespaces, mounts, networks, cgroups, and container processes. That makes the source tree a bad fit for a casual hosted coding sandbox or a shared workstation holding important local containers. Use an isolated machine or virtual machine where daemon restarts, network changes, and disposable image state will not interrupt other work.

Testing is divided by responsibility. Go unit tests live near packages. API integration tests send requests to a daemon and inspect both the responses and daemon state. The wider path crosses repository boundaries because the user-facing CLI is maintained separately. This is normal for an engine, but it means one root command cannot reproduce every product combination.

Mature engineering, permanent platform movement

The repository was pushed on August 27, 2026. Docker Engine v29.7.2 was released on August 6. It fixed image-pull regressions on older kernels, an environment-variable panic in the separate CLI, and nftables compatibility, while updating BuildKit. GitHub reported 3,905 open issues and pull requests combined. The queue is large, but the recent push and current release show active maintenance.

Maturity here does not mean the environment stands still. Kernel behavior, containerd, runc, storage drivers, nftables, Windows, and API compatibility all move underneath the daemon. Moby has the history and contributor base to address that work, while downstream vendors still inherit the duty to test their kernel, runtime, filesystem, and networking combination.

Use packaged Docker Engine or Podman for ordinary container work. Use the Moby client when an application needs to control an existing engine. Take on the root source only when changing and supporting the engine is the actual job, because the build is just the beginning of that responsibility.

Alternatives

ProjectWhat it isPick it when
Podman gh↗A daemonless container engine with a Docker-like CLI and rootless operation.pick this instead when you need an end-user container tool and prefer a daemonless design.
containerd gh↗A focused runtime for image transfer and container lifecycle management.pick this instead when you are building a platform around runtime primitives without Docker Engine's full API surface.
CRI-OA container runtime built specifically for Kubernetes's Container Runtime Interface.pick this instead when the only target is running OCI containers for Kubernetes nodes.

What people are saying

  1. [github-trending] moby/moby

Sources

  1. Moby README
  2. Moby testing guide
  3. Moby development environment guide
  4. Docker Engine v29.7.2 release

More dev tools reviews

Kaku · kordoc · hey · wechat-miniapp-radar · omarchy-workspace-layout · fermats-last-theorem · the whole board →