August 31, 2021·6 min read·engineeringdockerlicensingdesktoptooling

Docker Desktop subscriptions make the product boundary matter

Docker has changed the terms for Desktop use in larger businesses. The announcement separates the Desktop product from Docker Engine and the open source components used to build and distribute images.

Docker Desktop and Docker Engine now need to be distinguished when discussing the cost of a development environment. Docker's August 31 subscription announcement requires a Pro, Team or Business subscription for Desktop use in larger businesses. It explicitly leaves the licensing terms of Docker Engine and upstream Docker or Moby projects unchanged. The commercial boundary runs through a product bundle that developers often refer to simply as Docker.

The announcement retains free Desktop use for personal work, education and non-commercial open source projects. Its small-business criterion requires fewer than 250 employees and less than $10 million in annual revenue. Both conditions appear together. The terms take effect today, with a grace period until January 31, 2022 for organizations that need a paid Desktop subscription.

I value the repeatable image and build file independently of the particular local desktop application being used to work with them. That makes this distinction useful. A decision about the convenience of a managed development product should be informed by what that product supplies, while the application artifact remains a separate engineering concern.

The subscription describes a product

The Desktop 4.0.0 release notes record the terms change alongside the software release. They identify Personal as the new name for the former Free subscription and state that Pro and Team include commercial Desktop use. Business is another paid option, so the announcement should not be read as requiring every affected user to buy the Business tier specifically.

This changes the question an organization asks about an installation. Having access to an open source component in the bundle does not by itself settle the terms for using the Desktop product. Conversely, the Desktop requirement does not establish a new charge for every use of Docker Engine. The release notes make that distinction explicit.

The small-business exemption also needs its actual wording preserved. An organization being small along one dimension does not establish that it meets the stated combined condition. The announcement describes an organizational criterion, not a limit on the size of a development team or the number of machines running containers.

The grace period gives affected organizations time to respond, but it does not change which product the terms cover. Engineering work can use that time to identify the actual dependency on Desktop. The useful inventory concerns the development environment being provided, alongside the tools and artifacts that environment operates.

There is a corresponding difference between describing the published policy and deciding how it applies to a particular organization. The announcement supplies the thresholds and the covered product. It does not supply the organization's headcount, revenue or pattern of use. Those facts belong to the organization evaluating its installations. Keeping them separate avoids treating an engineer's choice of image format as if it determined the commercial category of the company using the development product.

A build description can outlive its local builder

The existing BuildKit documentation describes the builder as a toolkit that converts source into build artifacts. It separates the build description frontend from the underlying dependency graph, called LLB. Dockerfile is one frontend. A build engine can therefore support the familiar file while keeping its execution machinery separate from the desktop interface through which a developer reaches it.

BuildKit also has a standalone daemon and client. Its documentation distinguishes that setup from the integration available through docker build. This is concrete evidence that the build system is a component with more than one mode of operation. It does not imply that changing the local setup is costless or that all modes have identical defaults.

Output handling illustrates the difference. In standalone mode the documented default retains build results internally until an output is requested. Exporters can write images or local files. A workflow that expects an image to appear in the local Docker image store needs to account for that output choice when using another build arrangement.

This is why a product substitution should be described in terms of behavior. The Dockerfile can remain the same while the builder endpoint or output destination changes. The artifact's portability is useful, but it does not remove the local integration work that makes a developer's ordinary commands behave as expected.

Builders can execute away from the laptop

The contemporary Buildx documentation gives another view of that separation. Buildx manages builder instances and can use remote Docker contexts. It supports a driver using the builder bundled with the Docker daemon and a driver that launches BuildKit in a container. The selected driver affects capabilities and where results go.

With the Docker driver, built images appear in the local Docker image view by default. With other drivers, output must be selected. Multi-platform builds using the container driver can produce a manifest list for several targets and push it to a registry. This is a build and distribution arrangement, rather than a dependency on a particular window in Desktop.

Remote builders also introduce operational choices. A context identifies an endpoint, and a builder can contain several nodes. The documentation describes adding native nodes for different architectures. The machine running the CLI is consequently distinct from the machine executing a build instruction and from the platform targeted by the output.

I prefer keeping those relationships explicit. It makes the value of Desktop easier to assess because the surrounding automation is understandable. A product can save work by configuring and presenting the components together, while the project still has a build definition whose inputs and outputs are visible.

Image distribution has its own contract

The registry manifest specification describes an image through configuration and layer descriptors. A descriptor carries a media type, size and digest. A manifest list can identify separate images for particular operating systems and architectures. These structures define what a registry distributes, independently of the interface that initiated the build.

That structure is useful when evaluating a development workflow because the output can be identified precisely. A successful build is meant to produce the expected image for its target platform. The registry then preserves references to the relevant objects. Changing the local product does not provide a reason to abandon that explicit artifact model.

The Registry V2 API specification adds the transfer rules. It describes content identifiers based on collision-resistant hashes and requires verification against the requested digest when fetching by digest. Resumable transfers and recognition of existing layers address distribution work that several clients can perform.

These documents do not make every development tool interchangeable. They establish specific contracts that help preserve artifact identity across a change in tools. The integration around those contracts can still differ, including credentials, context selection and output handling. Those are concrete capabilities to compare when deciding what a development product is worth to an organization.

Collaboration adds more than an image build

Desktop has also been adding workflows around the core image operations. The June Dev Environments preview announcement describes source-controlled environment details and Compose-based related services. It lets developers share work-in-progress code with dependencies through Docker Hub. That is a broader development workflow than executing a single image build.

This helps explain why an organization may value the product even when it understands the underlying components. A configured development environment includes the means to enter and inspect the application, as well as the software used to construct it. Replacing that integration means accounting for those operations explicitly.

The commercial announcement does not provide evidence that every organization needs the same arrangement. The engineering judgement depends on which supplied capabilities its development workflow uses. A small service with a repeatable image build and a project using shared development environments have different requirements around the artifact, even if both use the Docker command family.

Today's change makes that distinction administratively relevant. Desktop use in the affected organizations now needs a qualifying subscription after the transition period. The engine and upstream project terms remain unchanged, while the local product can still be assessed by the integration it supplies around build execution and image distribution.