From 1977ba2555a9fe50e6297698d3484ba5d9c268e9 Mon Sep 17 00:00:00 2001 From: Craig Osterhout Date: Thu, 30 Oct 2025 10:39:18 -0700 Subject: [PATCH 1/4] offload: enterprise beta Signed-off-by: Craig Osterhout --- .../admin/organization/manage-products.md | 49 +++++++ .../settings-and-maintenance/settings.md | 12 ++ content/manuals/desktop/setup/vm-vdi.md | 14 +- .../settings-management/settings-reference.md | 43 +++--- content/manuals/offload/_index.md | 10 +- content/manuals/offload/about.md | 55 ++------ content/manuals/offload/configuration.md | 125 +++++++----------- .../manuals/offload/images/hourglass-icon.png | Bin 0 -> 1446 bytes .../manuals/offload/images/offload-toggle.png | Bin 0 -> 48845 bytes content/manuals/offload/optimize.md | 17 +-- content/manuals/offload/quickstart.md | 103 ++++++++++----- content/manuals/offload/troubleshoot.md | 6 +- content/manuals/offload/usage.md | 89 +++++-------- .../reference/cli/docker/offload/accounts.md | 8 -- data/offload-cli/docker_offload.yaml | 2 - data/offload-cli/docker_offload_accounts.yaml | 12 -- data/offload-cli/docker_offload_start.yaml | 20 +++ data/offload-cli/docker_offload_status.yaml | 11 ++ data/offload-cli/docker_offload_version.yaml | 2 +- data/summary.yaml | 2 +- 20 files changed, 308 insertions(+), 272 deletions(-) create mode 100644 content/manuals/offload/images/hourglass-icon.png create mode 100644 content/manuals/offload/images/offload-toggle.png delete mode 100644 content/reference/cli/docker/offload/accounts.md delete mode 100644 data/offload-cli/docker_offload_accounts.yaml diff --git a/content/manuals/admin/organization/manage-products.md b/content/manuals/admin/organization/manage-products.md index 40125f86b2af..4c16712e5bce 100644 --- a/content/manuals/admin/organization/manage-products.md +++ b/content/manuals/admin/organization/manage-products.md @@ -16,6 +16,7 @@ product, including how to set up and configure them, see the following manuals: - [Docker Build Cloud](../../build-cloud/_index.md) - [Docker Scout](../../scout/_index.md) - [Testcontainers Cloud](https://testcontainers.com/cloud/docs/#getting-started) +- [Docker Offload](../../offload/_index.md) ## Manage product access for your organization @@ -98,6 +99,52 @@ To manage access to Testcontainers Cloud: select **Account**. 1. Select **Settings**, then **Lock access to Testcontainers Cloud**. +{{< /tab >}} +{{< tab name="Docker Offload" >}} + +### Manage Docker Offload access + +> [!NOTE] +> +> Docker Offload isn't included in the core Docker subscription plans. To make Docker Offload available, you must [sign +> up](https://www.docker.com/products/docker-offload/) and subscribe. + +To manage Docker Offload access for your organization, use [Settings +Management](/manuals/enterprise/security/hardened-desktop/settings-management/_index.md): + +1. Sign in to [Docker Home](https://app.docker.com/) as an organization owner. +1. Select **Admin Console** > **Desktop Settings Management**. +1. Configure the **Enable Docker Offload** setting to control whether Docker Offload features are available in Docker + Desktop. You can configure this setting in five states: + - **Always enabled**: Docker Offload is always enabled and users cannot disable it. The Offload + toggle is always visible in Docker Desktop header. Recommended for VDI environments where local Docker execution is + not possible. + - **Enabled**: Docker Offload is enabled by default but users can disable it in Docker Desktop + settings. Suitable for hybrid environments. + - **Disabled**: Docker Offload is disabled by default but users can enable it in Docker Desktop + settings. + - **Always disabled**: Docker Offload is disabled and users cannot enable it. The option is + visible but locked. Use when Docker Offload is not approved for organizational use. + - **User defined**: No enforced default. Users choose whether to enable or disable Docker Offload in their + Docker Desktop settings. +1. If GPU support is enabled for your organization's subscription, configure the + **Enable Docker Offload GPU Support** setting to control whether GPU support + is available in Docker Desktop. You can configure this setting in five + states: + - **Always enabled**: GPU support is always enabled and users cannot disable it. + - **Enabled**: GPU support is enabled by default but users can disable it in Docker Desktop + settings. + - **Disabled**: GPU support is disabled by default but users can enable it in Docker Desktop + settings. + - **Always disabled**: GPU support is disabled and users cannot enable it. The option is + visible but locked. + - **User defined**: No enforced default. Users choose whether to enable or disable GPU support in their + Docker Desktop settings. +1. Select **Save**. + +For more details on Settings Management, see the [Settings +reference](/manuals/enterprise/security/hardened-desktop/settings-management/settings-reference.md#enable-docker-offload). + {{< /tab >}} {{< /tabs >}} @@ -110,6 +157,8 @@ To view usage for Docker products: - Docker Build Cloud: View the **Build minutes** page in [Docker Build Cloud](http://app.docker.com/build). - Docker Scout: View the [**Repository settings** page](https://scout.docker.com/settings/repos) in Docker Scout. - Testcontainers Cloud: View the [**Billing** page](https://app.testcontainers.cloud/dashboard/billing) in Testcontainers Cloud. +- Docker Offload: View the **Offload** > **Offload overview** page in [Docker Home](https://app.docker.com/). For more details, see + [Docker Offload usage and billing](/offload/usage/). If your usage or seat count exceeds your subscription amount, you can [scale your subscription](../../subscription/scale.md) to meet your needs. diff --git a/content/manuals/desktop/settings-and-maintenance/settings.md b/content/manuals/desktop/settings-and-maintenance/settings.md index 45a169ba7e26..a90501ece96f 100644 --- a/content/manuals/desktop/settings-and-maintenance/settings.md +++ b/content/manuals/desktop/settings-and-maintenance/settings.md @@ -519,3 +519,15 @@ On Mac, you can reconfigure your initial installation settings on the **Advance - **Allow privileged port mapping (Requires password)**. Starts the privileged helper process which binds the ports that are between 1 and 1024. For more information, see [permission requirements for macOS](/manuals/desktop/setup/install/mac-permission-requirements.md#binding-privileged-ports). For more information on each configuration and use case, see [Permission requirements](/manuals/desktop/setup/install/mac-permission-requirements.md). + +## Docker Offload + +When signed in with a Docker account that has access to [Docker Offload](../../offload/_index.md), you can manage your +Offload settings from the **Docker Offload** tab. + +Use the **Docker Offload** tab to: + +- Toggle **Enable Docker Offload**. When enabled, you can start Offload sessions. +- Select **Idle timeout**. This is the duration of time between no activity and Docker Offload entering idle mode.For + details about idle timeout, see [Active and idle states](../../offload/configuration.md#understand-active-and-idle-states) +- Check **Enable GPU support**. When enabled, workloads can use cloud GPU if available. \ No newline at end of file diff --git a/content/manuals/desktop/setup/vm-vdi.md b/content/manuals/desktop/setup/vm-vdi.md index e99c02c5e4e3..766bd5bb0ff5 100644 --- a/content/manuals/desktop/setup/vm-vdi.md +++ b/content/manuals/desktop/setup/vm-vdi.md @@ -16,18 +16,16 @@ depending on whether nested virtualization is supported: - If your environment supports nested virtualization, you can run Docker Desktop with its default local Linux VM. -- If nested virtualization is not supported, Docker recommends using [Docker - Offload](/offload/). +- If nested virtualization is not supported, Docker recommends subscribing to and using Docker Offload. ## Use Docker Offload -Docker Offload lets you offload container workloads to a high-performance, fully -hosted cloud environment, enabling a seamless hybrid experience. +[Docker Offload](/offload/) lets you offload container workloads to a high-performance, fully hosted cloud environment, +enabling a seamless hybrid experience. -Docker Offload is useful in virtual desktop environments where nested -virtualization isn't supported. In these environments, Docker Desktop defaults -to using Docker Offload to ensure you can still build and run containers without -relying on local virtualization. +Docker Offload is useful in virtual desktop environments where nested virtualization isn't supported. In these +environments, Docker Desktop can use Docker Offload to ensure you can still build and run containers without relying on +local virtualization. Docker Offload decouples the Docker Desktop client from the Docker Engine, allowing the Docker CLI and Docker Desktop Dashboard to interact with diff --git a/content/manuals/enterprise/security/hardened-desktop/settings-management/settings-reference.md b/content/manuals/enterprise/security/hardened-desktop/settings-management/settings-reference.md index 6826ff292cde..b483806509c0 100644 --- a/content/manuals/enterprise/security/hardened-desktop/settings-management/settings-reference.md +++ b/content/manuals/enterprise/security/hardened-desktop/settings-management/settings-reference.md @@ -906,13 +906,37 @@ deployment of AI features in security-conscious organizations. |---------------|-----------------|----------| | `false` | `true`, `false` | Boolean | -- **Description:** Enable [Docker Offload](/offload/) in Docker Desktop. +- **Description:** Enable Docker Offload integration features and functionality. When enabled, users see the Docker Offload toggle in the Docker Desktop header. - **OS:** {{< badge color=blue text="All" >}} -- **Use case:** Offload building and running containers to the cloud. +- **Use case:** Control Docker Offload availability and whether users can change the setting. - **Configure this setting with:** - - **Beta** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - **Docker Offload** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) - Settings Management: `enableCloud` setting in the [`admin-settings.json` file](/manuals/enterprise/security/hardened-desktop/settings-management/configure-json-file.md) - - Settings Management: **Enable Docker Cloud** setting in the [Admin Console](/manuals/enterprise/security/hardened-desktop/settings-management/configure-admin-console.md) + - Settings Management: **Enable Docker Offload** setting in the [Admin Console](/manuals/enterprise/security/hardened-desktop/settings-management/configure-admin-console.md) + +> [!NOTE] +> +> This setting is only available when Docker Offload capability is enabled for +> the organization. + +#### Enable Docker Offload GPU Support + +| Default value | Accepted values | Format | +|---------------|-----------------|----------| +| `false` | `true`, `false` | Boolean | + +- **Description:** Enable GPU support for Docker Offload features. +- **OS:** {{< badge color=blue text="All" >}} +- **Use case:** Enable GPU-accelerated workloads in Docker Offload. +- **Configure this setting with:** + - **Docker Offload** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) + - Settings Management: `enableCloudGPUSupport` setting in the [`admin-settings.json` file](/manuals/enterprise/security/hardened-desktop/settings-management/configure-json-file.md) + - Settings Management: **Enable Docker Offload GPU Support** setting in the [Admin Console](/manuals/enterprise/security/hardened-desktop/settings-management/configure-admin-console.md) + +> [!NOTE] +> +> This setting requires Docker Offload to be enabled first and is only available when GPU support capability is enabled +> for the organization. ### Enable Wasm @@ -1046,17 +1070,6 @@ you relax this in a controlled way. See ECI Configuration for more info. The following settings aren’t shown in the Docker Desktop GUI. You can only configure them using Settings Management with the Admin Console or the `admin-settings.json` file. -### Enable Docker Cloud GPU Support - -| Default value | Accepted values | Format | -|---------------|-----------------|----------| -| `true` | `true`, `false` | Boolean | - -- **Description:** Enable GPU support for Docker Cloud features. -- **OS:** {{< badge color=blue text="All" >}} -- **Configure this setting with:** - - Settings Management: **Enable Docker Cloud GPU Support** setting in the [Admin Console](/manuals/enterprise/security/hardened-desktop/settings-management/configure-admin-console.md - ### Block `docker load` | Default value | Accepted values | Format | diff --git a/content/manuals/offload/_index.md b/content/manuals/offload/_index.md index cea387365598..c829e7f9c9a5 100644 --- a/content/manuals/offload/_index.md +++ b/content/manuals/offload/_index.md @@ -27,13 +27,13 @@ grid: icon: tune link: /offload/configuration/ -- title: Usage - description: Learn about Docker Offload usage and how to monitor your cloud resources. +- title: Usage and billing + description: Learn about Docker Offload usage and billing, and how to monitor your cloud resources. icon: monitor_heart link: /offload/usage/ - title: Optimize - description: Improve performance, caching, and cost efficiency in Docker Offload. + description: Improve performance and cost efficiency in Docker Offload. icon: speed link: /offload/optimize/ @@ -55,7 +55,9 @@ aliases: Docker Offload is a fully managed service that lets you offload building and running containers to the cloud using the Docker tools you already know. It -provides cloud infrastructure for fast, consistent builds and compute-heavy +enables developers to work efficiently in virtual desktop infrastructure (VDI) +environments or systems that don't support nested virtualization, while also +providing cloud infrastructure for fast, consistent builds and compute-heavy workloads like running LLMs or machine learning pipelines. In the following topics, learn about Docker Offload, how to set it up, use it diff --git a/content/manuals/offload/about.md b/content/manuals/offload/about.md index 8f6c9a804a14..2c83c9a58dc4 100644 --- a/content/manuals/offload/about.md +++ b/content/manuals/offload/about.md @@ -3,18 +3,18 @@ title: About Docker Offload linktitle: About weight: 15 description: Learn about Docker Offload, its features, and how it works. -keywords: cloud, build, remote builder +keywords: cloud, offload, vdi, on-demand gpu, gpu --- Docker Offload is a fully managed service for building and running containers in the cloud using the Docker tools you already know, including Docker Desktop, the Docker CLI, and Docker Compose. It extends your local development workflow into a -scalable, cloud-powered environment, so you can offload compute-heavy tasks, -accelerate builds, and securely manage container workloads across the software -lifecycle. +scalable, cloud-powered environment, enabling developers to work efficiently even +in virtual desktop infrastructure (VDI) environments or systems that don't support +nested virtualization. Docker Offload also supports GPU-accelerated instances, allowing you to -containerize and run compute-intensive workloads such as Docker Model Runner and +containerize and run compute-intensive workloads such as running models and other machine learning or data processing tasks that benefit from GPU. ## Key features @@ -22,20 +22,17 @@ other machine learning or data processing tasks that benefit from GPU. Docker Offload includes the following capabilities to support modern container workflows: -- Cloud-based builds: Execute builds on remote, fully managed BuildKit instances - GPU acceleration: Use NVIDIA L4 GPU-backed environments for machine learning, media processing, and other compute-intensive workloads. - Ephemeral cloud runners: Automatically provision and tear down cloud environments for each container session. -- Shared build cache: Speed up build times across machines and teammates with a - smart, shared cache layer. - Hybrid workflows: Seamlessly transition between local and remote execution using Docker Desktop or CLI. - Secure communication: Use encrypted tunnels between Docker Desktop and cloud environments with support for secure secrets and image pulling. - Port forwarding and bind mounts: Retain a local development experience even when running containers in the cloud. -- VDI-friendly: Use Docker Offload in virtual desktop environments or systems that +- VDI-friendly: [Use Docker Desktop](../desktop/setup/vm-vdi.md) in virtual desktop environments or systems that don't support nested virtualization. ## Why use Docker Offload? @@ -44,7 +41,6 @@ Docker Offload is designed to support modern development teams working across local and cloud environments. It helps you: - Offload heavy builds and runs to fast, scalable infrastructure -- Accelerate feedback loops in development and testing - Run containers that require more resources than your local setup can provide - Build and run AI apps with instant access to GPU-powered environments - Use Docker Compose to manage complex, multi-service apps that need cloud @@ -61,39 +57,16 @@ local tools. Docker Offload replaces the need to build or run containers locally by connecting Docker Desktop to secure, dedicated cloud resources. -### Building with Docker Offload - -When you use Docker Offload for builds, the `docker buildx build` command sends -the build request to a remote BuildKit instance in the cloud, instead of -executing it locally. Your workflow stays the same, only the execution -environment changes. - -The build runs on infrastructure provisioned and managed by Docker: - -- Each cloud builder is an isolated Amazon EC2 instance with its own EBS volume -- Remote builders use a shared cache to speed up builds across machines and - teammates -- Build results are encrypted in transit and sent to your specified destination - (such as a registry or local image store) - -Docker Offload manages the lifecycle of builders automatically. There's no need to -provision or maintain infrastructure. - -> [!NOTE] -> -> Docker Offload builders are currently hosted in the United States East region. Users in -> other regions may experience increased latency. - ### Running containers with Docker Offload -When you use Docker Offload to run containers, a Docker Desktop creates a secure +When you use Docker Offload to build or run containers, a Docker Desktop creates a secure SSH tunnel to a Docker daemon running in the cloud. Your containers are started and managed entirely in that remote environment. Here's what happens: 1. Docker Desktop connects to the cloud and triggers container creation. -2. Docker Offload pulls the required images and starts containers in the cloud. +2. Docker Offload builds or pulls the required images and starts containers in the cloud. 3. The connection stays open while the containers run. 4. When the containers stop running, the environment shuts down and is cleaned up automatically. @@ -105,7 +78,7 @@ using environments such as virtual desktops, cloud-hosted development machines, or older hardware. Docker Offload also supports GPU-accelerated workloads. Containers that require -GPU access can run on cloud instances provisioned with NVIDIA L4 GPUs for +GPU access can run on cloud instances provisioned with NVIDIA GPUs for efficient AI inferencing, media processing, and general-purpose GPU acceleration. This enables compute-heavy workflows such as model evaluation, image processing, and hardware-accelerated CI tests to run seamlessly in the @@ -115,11 +88,11 @@ Despite running remotely, features like bind mounts and port forwarding continue to work seamlessly, providing a local-like experience from within Docker Desktop and the CLI. -Docker Offload provisions an ephemeral cloud environment for each session. The -environment remains active while you are interacting with Docker Desktop or -actively using containers. If no activity is detected for about 5 minutes, the -session shuts down automatically. This includes any containers, images, or -volumes in that environment, which are deleted when the session ends. +Docker Offload automatically transitions between active and idle states based on +usage. You're only charged when actively building or running containers. When +idle for more than 5 minutes, the session ends and resources are cleaned up. For +details about how this works and how to configure idle timeout, see [Active and +idle states](configuration.md#understand-active-and-idle-states). ## What's next diff --git a/content/manuals/offload/configuration.md b/content/manuals/offload/configuration.md index 0af088a11bfd..2d7aed59a52d 100644 --- a/content/manuals/offload/configuration.md +++ b/content/manuals/offload/configuration.md @@ -3,102 +3,73 @@ title: Configure Docker Offload linktitle: Configure weight: 20 description: Learn how to configure build settings for Docker Offload. -keywords: cloud, configuration, settings, cloud builder, GPU, disk allocation, private resources, firewall +keywords: cloud, configuration, settings, offload, gpu --- -To use Docker Offload, you must start it in Docker Desktop. For more details, -see the [Docker Offload quickstart](/offload/quickstart/). +You can configure Docker Offload settings at different levels depending on your role. Organization owners can manage +settings for all users in their organization, while individual developers can configure their own Docker Desktop +settings. -Settings for the cloud builders in Docker Offload can be further configured, in -addition to settings for an entire organization, through **Offload settings** in -the Docker Offload dashboard. +## Manage settings for your organization -> [!NOTE] -> -> To view usage and configure billing for Docker Offload, see [Docker Offload -> usage and billing](/offload/usage/). - -## Offload settings - -The **Offload settings** page in Docker Home lets you configure disk -allocation, private resource access, and firewall settings for your cloud -builders in your organization. +For organization owners, you can manage Docker Offload settings for all users in your organization. For more details, +see [Manage Docker products](../admin/organization/manage-products.md). To view usage and configure billing for Docker +Offload, see [Docker Offload usage and billing](/offload/usage/). -To view the **Offload settings** page: +## Configure settings in Docker Desktop -1. Go to [Docker Home](https://app.docker.com/). -2. Select the account for which you want to manage Docker Offload. -3. Select **Offload** > **Offload settings**. +For developers, you can manage Docker Offload settings in Docker Desktop. To manage settings: -The following sections describe the available settings. +1. Open the Docker Desktop Dashboard and sign in. +2. Select the settings icon in the Docker Desktop Dashboard header. +3. In **Settings**, select **Docker Offload**. -### Disk allocation + Here you can: -The **Disk allocation** setting lets you control how much of the available -storage is dedicated to the build cache. A lower allocation increases storage -available for active builds. + - Toggle **Enable Docker Offload**. When enabled, you can start Offload sessions. + - Select **Idle timeout**. This is the duration of time between no activity and Docker Offload entering idle mode. + For details about idle timeout, see [Understand active and idle states](#understand-active-and-idle-states). + - Check **Enable GPU support**. When enabled, workloads can use cloud GPU if available. -Adjust the **Disk allocation** slider to specify the percentage of storage used -for build caching. - -Any changes take effect immediately. - -> [!TIP] -> -> If you build very large images, consider allocating less storage for caching. +### Understand active and idle states -### Build cache space +Docker Offload automatically transitions between active and idle states to help +you control costs while maintaining a seamless development experience. -Your subscription includes the following Build cache space: +#### When your session is active -| Subscription | Build cache space | -|--------------|-------------------| -| Personal | N/A | -| Pro | 50GB | -| Team | 100GB | -| Business | 200GB | +Your Docker Offload environment is active when you're building images, running +containers, or actively interacting with them, such as viewing logs or +maintaining an open network connection. During active state: -To get more Build cache space, [upgrade your subscription](/manuals/subscription/change.md). +- Usage is charged +- A remote Docker Engine is connected to your local machine +- All container operations execute in the cloud environment -### Private resource access +#### When your session is idle -Private resource access lets cloud builders pull images and packages from -private resources. This feature is useful when builds rely on self-hosted -artifact repositories or private OCI registries. +When there's no activity, Docker Offload transitions to idle state. During idle +state: -For example, if your organization hosts a private [PyPI](https://pypi.org/) -repository on a private network, Docker Build Cloud would not be able to access -it by default, since the cloud builder is not connected to your private network. +- You are not charged for usage +- The remote connection is suspended +- No containers are running in the cloud -To enable your cloud builders to access your private resources, enter the host -name and port of your private resource and then select **Add**. +The idle transition delay can be configured in Docker Desktop settings, ranging +from 10 seconds to 1 hour. This setting determines how long Docker Offload +waits after detecting inactivity before transitioning to idle state. -#### Authentication +#### How your session is preserved -If your internal artifacts require authentication, make sure that you -authenticate with the repository either before or during the build. For internal -package repositories for npm or PyPI, use [build -secrets](/manuals/build/building/secrets.md) to authenticate during the build. -For internal OCI registries, use `docker login` to authenticate before building. +If your session has been idle for less than 5 minutes and you resume activity, +your previous containers and images are preserved and remain available. This +allows you to pick up right where you left off. -Note that if you use a private registry that requires authentication, you will -need to authenticate with `docker login` twice before building. This is because -the cloud builder needs to authenticate with Docker to use the cloud builder, -and then again to authenticate with the private registry. - -```console -$ echo $DOCKER_PAT | docker login docker.io -u --password-stdin -$ echo $REGISTRY_PASSWORD | docker login registry.example.com -u --password-stdin -$ docker build --builder --tag registry.example.com/ --push . -``` - -### Firewall - -Firewall settings let you restrict cloud builder egress traffic to specific IP -addresses. This helps enhance security by limiting external network egress from -the builder. - -1. Select **Enable firewall: Restrict cloud builder egress to specific public IP address**. -2. Enter the IP address you want to allow. -3. Select **Add** to apply the restriction. +However, if the idle period exceeds 5 minutes, a new session starts with a +clean environment and any containers, images, or volumes from the previous +session are deleted. +> [!NOTE] +> +> Transitioning from active to idle and back to active within 5 minutes will be +> charged as continuous usage. \ No newline at end of file diff --git a/content/manuals/offload/images/hourglass-icon.png b/content/manuals/offload/images/hourglass-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..64f989fd0f5044e8f5f35e9f02481d2158ef8273 GIT binary patch literal 1446 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 -This quickstart helps you get started with Docker Offload. Docker Offload lets -you build and run container images faster by offloading resource-intensive tasks -to the cloud. It provides a cloud-based environment that mirrors your local -Docker Desktop experience. +[Docker Offload](./about.md) lets you build and run containers in the cloud while using your local Docker Desktop tools +and workflow. This means faster builds, access to powerful cloud resources like GPUs, and a seamless development +experience. -## Step 1: Sign up and subscribe to Docker Offload for access - -To access Docker Offload, you must [sign -up](https://www.docker.com/products/docker-offload/) and subscribe. - -## Step 2: Start Docker Offload +This quickstart covers the steps developers need to get started with Docker Offload. > [!NOTE] > -> After subscribing to Docker Offload, the first time you start Docker Desktop -> and sign in, you may be prompted to start Docker Offload. If you start Docker -> Offload via this prompt, you can skip the following steps. Note that you can -> use the following steps to start Docker Offload at any time. +> If you're an organization owner, to get started you must [sign up](https://www.docker.com/products/docker-offload/) +> and subscribe your organization to use Docker Offload. After subscribing, see the following: +> +> - [Manage Docker products](../admin/organization/manage-products.md) to learn how to manage access for the developers +> in your organization. +> - [Usage and billing](./usage.md) to learn how set up billing and monitor usage. + +## Prerequisites + +- You must have [Docker Desktop](/desktop/) installed. Docker Offload works with Docker Desktop version 4.50 or later. +- You must have access to Docker Offload. Your organization owner must [sign + up](https://www.docker.com/products/docker-offload/) your organization. +- You must have committed usage available or on-demand usage enabled for your organization. This is set up by your + organization owner. For more details, see [Docker Offload usage and billing](/offload/usage/). +## Step 1: Verify access to Docker Offload + +To access Docker Offload, you must be part of an organization that has subscribed to Docker Offload. As a developer, you +can verify this by checking if the Docker Offload toggle appears in the Docker Desktop Dashboard header. + +1. Start Docker Desktop and sign in. +2. In the Docker Desktop Dashboard header, look for the Docker Offload toggle. + +![Offload toggle](./images/offload-toggle.png) + +If you see the Docker Offload toggle, you have access to Docker Offload and can proceed to the next step. If you don't +see the Docker Offload toggle, check if Docker Offload is disabled in your [Docker Desktop +settings](./configuration.md), and then contact your administrator to verify that your organization has subscribed to +Docker Offload and that they have enabled access for your organization. + +## Step 2: Start Docker Offload + +You can start Docker Offload from the CLI or in the header of the Docker Desktop Dashboard. The following steps describe +how to start Docker Offload using the CLI. 1. Start Docker Desktop and sign in. 2. Open a terminal and run the following command to start Docker Offload: @@ -35,23 +58,22 @@ up](https://www.docker.com/products/docker-offload/) and subscribe. $ docker offload start ``` -3. When prompted, select your account to use for Docker Offload. This account - will consume Docker Offload usage. + > [!TIP] + > + > To learn more about the Docker Offload CLI commands, see the [Docker Offload CLI + > reference](/reference/cli/docker/offload/). -4. When prompted, select whether to enable GPU support. If you choose to enable - GPU support, Docker Offload will run in an instance with an NVIDIA L4 GPU, - which is useful for machine learning or compute-intensive workloads. +3. If you are a member of multiple organizations that have access to Docker Offload, you have the option to select a + profile. The selected organization is responsible for any usage. - > [!NOTE] - > - > Enabling GPU support consumes more budget. For more details, see [Docker - > Offload usage](/offload/usage/). -When Docker Offload is started, you'll see a cloud icon ({{< inline-image -src="./images/cloud-mode.png" alt="Offload mode icon" >}}) -in the Docker Desktop Dashboard header, and the Docker Desktop Dashboard appears purple. -You can run `docker offload status` in a terminal to check the status of -Docker Offload. +4. If GPU-accelerated instances are enabled for your organization, you have the option to select **GPU Supported**, or + **CPU-only support**. + +When Docker Offload is started, you'll see a cloud icon +({{< inline-image src="./images/cloud-mode.png" alt="Offload mode icon" >}}) +in the Docker Desktop Dashboard header, and the Docker Desktop Dashboard appears purple. You can run +`docker offload status` in a terminal to check the status of Docker Offload. ## Step 3: Run a container with Docker Offload @@ -73,19 +95,30 @@ $ docker run --rm --gpus all hello-world If Docker Offload is working, you'll see `Hello from Docker!` in the terminal output. -## Step 4: Stop Docker Offload +## Step 4: Monitor your Offload usage + +When Docker Offload is started and you have started session (for example, you've ran a container), then you can see +current session duration estimate in the Docker Desktop Dashboard footer next to the hourglass icon +({{< inline-image src="./images/hourglass-icon.png" alt="Offload session duration" >}}). + +Also, when Docker Offload is started, you can view detailed session information by selecting **Offload** > **Insights** +in the left navigation of the Docker Desktop Dashboard. -When you're done using Docker Offload, you can stop it. When stopped, you build -images and run containers locally. +## Step 5: Stop Docker Offload + +Docker Offload automatically [idles](./configuration.md#understand-active-and-idle-states) after a period of inactivity. You can stop it at +any time. To stop Docker Offload: ```console $ docker offload stop ``` +When you stop Docker Offload, the cloud environment is terminated and all running containers and images are removed. +When Docker Offload has been idle for around 5 minutes, the environment is also terminated and all running containers +and images are removed. + To start Docker Offload again, run the `docker offload start` command. ## What's next -- [Configure Docker Offload](configuration.md). -- Try [Docker Model Runner](../ai/model-runner/_index.md) or - [Compose](../ai/compose/models-and-compose.md) to run AI models using Docker Offload. \ No newline at end of file +Configure your idle timeout in Docker Desktop. For more information, see [Configure Docker Offload](./configuration.md). \ No newline at end of file diff --git a/content/manuals/offload/troubleshoot.md b/content/manuals/offload/troubleshoot.md index 802063cb0385..be34fd17797f 100644 --- a/content/manuals/offload/troubleshoot.md +++ b/content/manuals/offload/troubleshoot.md @@ -13,7 +13,7 @@ Docker Offload requires: - An active internet connection - No restrictive proxy or firewall blocking traffic to Docker Cloud - Beta access to Docker Offload -- Docker Desktop 4.43 or later +- Docker Desktop 4.50 or later Docker Desktop uses Offload to run both builds and containers in the cloud. If builds or containers are failing to run, falling back to local, or reporting @@ -22,8 +22,8 @@ session errors, use the following steps to help resolve the issue. 1. Ensure Docker Offload is enabled in Docker Desktop: 1. Open Docker Desktop and sign in. - 2. Go to **Settings** > **Beta features**. - 3. Ensure that **Docker Offload** is checked. + 2. Go to **Settings** > **Docker Offload**. + 3. Ensure that **Enable Docker Offload** is toggled on. 2. Use the following command to check if the connection is active: diff --git a/content/manuals/offload/usage.md b/content/manuals/offload/usage.md index d061f765e84d..dcc0161db143 100644 --- a/content/manuals/offload/usage.md +++ b/content/manuals/offload/usage.md @@ -10,78 +10,59 @@ keywords: cloud, usage, cloud minutes, shared cache, top repositories, cloud bui > [!NOTE] > -> All free trial usage granted for the Docker Offload Beta expire after 90 -> days from the time they are granted. To continue using Docker Offload after -> your usage expires, you can enable on-demand usage at [Docker Home +> All free trial usage granted for the Docker Offload Beta expire after 90 days from the time they are granted. To +> continue using Docker Offload Beta after your usage expires, you can enable on-demand usage at [Docker Home > Billing](https://app.docker.com/billing). -## Docker Offload billing +## Understand usage and billing models + +Docker Offload offers two usage models to fit different team needs and usage patterns: + +- Committed usage: This provides a committed amount of cloud compute time for your organization. +- On-demand usage: This provides pay-as-you-go flexibility. You can enable or disable on-demand usage in + [Billing](#manage-billing). + +## Manage billing For Docker Offload, you can view and configure billing on the **Docker Offload** page in [Docker Home Billing](https://app.docker.com/billing). On this page, you can: -- View your included usage +- View your committed usage - View rates for cloud resources -- Enable or disable on-demand usage +- Manage on-demand billing, including setting a monthly limit +- Track your organization's Docker Offload usage - Add or change payment methods -For more general information about billing, see [Billing](../billing/_index.md). +You must be an organization owner to manage billing. For more general information about billing, see +[Billing](../billing/_index.md). -## Docker Offload overview +## Monitor your usage -The Docker Offload overview page in Docker Home provides visibility into -how you or your team is using cloud resources to build and run containers. +The **Offload overview** page in Docker Home provides visibility into +how you are using cloud resources to build and run containers. -To view the **Overview** page: +To monitor your usage: 1. Sign in to [Docker Home](https://app.docker.com/). -2. Select the account for which you want to manage Docker Offload. -3. Select **Offload** > **Overview**. - -The following sections describe the available widgets on **Overview**. - -### Offload minutes - -This widget shows the total number of offload minutes used over time. Offload -minutes represent the time spent running builds and containers in the Offload -environment. You can use this chart to: +2. Select the account for which you want to monitor usage. +3. Select **Offload** > **Offload overview**. -- Track your Offload usage trends over time. -- Spot spikes in usage, which may indicate CI changes or build issues. -- Estimate usage against your subscription limits. +The following widgets are available: -### Build cache usage +- My recent sessions: This widget shows your total session time as well as a break down of your most recent sessions' + duration. +- My top 10 images: This widget shows the top 10 images used in Docker Offload in run sessions. It provides insight into + which images are most frequently used, helping you understand your container usage patterns. +- My active sessions: This widget displays any currently active Docker Offload sessions. -This widget displays data about cache re-use across all builds, helping you -understand how effectively Docker Offload is using the build cache. It -provides insight into: +### View recent activity -- The percentage of cache hits vs. misses. -- How much estimated build time is saved by reusing cache layers. -- Opportunities to improve cache efficiency by tuning your Dockerfiles or build - strategy. +The **Recent activity** page in Docker Home provides detailed information about your recent Docker Offload sessions. +This includes session ID, start date and time, duration, and number of containers. -### Top repositories built +To view the **Recent activity** page: -This widget highlights the repositories with the highest build activity for -Docker Offload. This widget helps you understand which projects consume the most -cloud resources and how efficiently they're being built. - -It includes both aggregated metrics and per-repository details to give you a -comprehensive view. - -Use this widget to: - -- Identify build hotspots: See which repositories are consuming the most build - time and resources. -- Spot trends: Monitor how build activity evolves across your projects. -- Evaluate efficiency: Check which repositories benefit most from cache re-use. -- Target improvements: Flag repositories with low cache hits or high failure - rates for optimization. - -### Top 10 images - -This widget shows the top 10 images used in Docker Offload in run sessions. It -provides insight into which images are most frequently used, helping you -understand your team's container usage patterns. +1. Sign in to [Docker Home](https://app.docker.com/). +2. Select the account for which you want to manage Docker Offload. +3. Select **Offload** > **Recent activity**. \ No newline at end of file diff --git a/content/reference/cli/docker/offload/accounts.md b/content/reference/cli/docker/offload/accounts.md deleted file mode 100644 index 4d8fd8b3ee6b..000000000000 --- a/content/reference/cli/docker/offload/accounts.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -datafolder: offload-cli -datafile: docker_offload_accounts -title: docker offload accounts -layout: cli ---- - -{{< summary-bar feature_name="Docker Offload" >}} diff --git a/data/offload-cli/docker_offload.yaml b/data/offload-cli/docker_offload.yaml index ca4877c0f0c8..51ed3be2a80e 100644 --- a/data/offload-cli/docker_offload.yaml +++ b/data/offload-cli/docker_offload.yaml @@ -4,14 +4,12 @@ usage: docker offload pname: docker plink: docker.yaml cname: - - docker offload accounts - docker offload diagnose - docker offload start - docker offload status - docker offload stop - docker offload version clink: - - docker_offload_accounts.yaml - docker_offload_diagnose.yaml - docker_offload_start.yaml - docker_offload_status.yaml diff --git a/data/offload-cli/docker_offload_accounts.yaml b/data/offload-cli/docker_offload_accounts.yaml deleted file mode 100644 index 828e9359ef8e..000000000000 --- a/data/offload-cli/docker_offload_accounts.yaml +++ /dev/null @@ -1,12 +0,0 @@ -command: docker offload accounts -short: Prints available Docker Offload accounts -usage: docker offload accounts -pname: docker offload -plink: docker_offload.yaml -options: [] -deprecated: false -hidden: false -experimental: false -experimentalcli: false -kubernetes: false -swarm: false diff --git a/data/offload-cli/docker_offload_start.yaml b/data/offload-cli/docker_offload_start.yaml index 1c0a24d0fb62..25a818c81d54 100644 --- a/data/offload-cli/docker_offload_start.yaml +++ b/data/offload-cli/docker_offload_start.yaml @@ -26,6 +26,26 @@ options: experimentalcli: false kubernetes: false swarm: false + - option: idle-timeout + value_type: duration + default_value: "" + description: How long before the engine idles + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false + - option: timeout + value_type: duration + default_value: 10s + description: How long to wait for the engine to be ready + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false deprecated: false hidden: false experimental: false diff --git a/data/offload-cli/docker_offload_status.yaml b/data/offload-cli/docker_offload_status.yaml index 2b07a346be49..8d64ce094f13 100644 --- a/data/offload-cli/docker_offload_status.yaml +++ b/data/offload-cli/docker_offload_status.yaml @@ -4,6 +4,17 @@ usage: docker offload status [OPTIONS] pname: docker offload plink: docker_offload.yaml options: + - option: format + shorthand: f + value_type: string + default_value: pretty + description: "Format of output (default: pretty, one of: pretty|json)" + deprecated: false + hidden: false + experimental: false + experimentalcli: false + kubernetes: false + swarm: false - option: watch shorthand: w value_type: bool diff --git a/data/offload-cli/docker_offload_version.yaml b/data/offload-cli/docker_offload_version.yaml index f98288bdc3bb..4376cbf8117c 100644 --- a/data/offload-cli/docker_offload_version.yaml +++ b/data/offload-cli/docker_offload_version.yaml @@ -1,5 +1,5 @@ command: docker offload version -short: Prints the Docker Offload CLI version +short: Prints the version usage: docker offload version [OPTIONS] pname: docker offload plink: docker_offload.yaml diff --git a/data/summary.yaml b/data/summary.yaml index 5e40cfe7ce4f..0d595b7d8c03 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -151,7 +151,7 @@ Docker CLI OpenTelemetry: requires: Docker Engine [26.1.0](/manuals/engine/release-notes/26.1.md#2610) and later Docker Offload: availability: Beta - requires: Docker Desktop 4.43 and later + requires: Docker Desktop 4.50 and later docker compose alpha: availability: Experimental Docker Debug: From d7447dc24b60256ba2b6cefae21c067b508765c0 Mon Sep 17 00:00:00 2001 From: Craig Osterhout Date: Fri, 31 Oct 2025 14:27:46 -0700 Subject: [PATCH 2/4] add summary bar Signed-off-by: Craig Osterhout --- content/manuals/offload/configuration.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/manuals/offload/configuration.md b/content/manuals/offload/configuration.md index 2d7aed59a52d..cf6b9bf726d3 100644 --- a/content/manuals/offload/configuration.md +++ b/content/manuals/offload/configuration.md @@ -6,6 +6,8 @@ description: Learn how to configure build settings for Docker Offload. keywords: cloud, configuration, settings, offload, gpu --- +{{< summary-bar feature_name="Docker Offload" >}} + You can configure Docker Offload settings at different levels depending on your role. Organization owners can manage settings for all users in their organization, while individual developers can configure their own Docker Desktop settings. From 5e1617fdd2c3d71bbb8717af7d624eb72eb68c65 Mon Sep 17 00:00:00 2001 From: Craig Osterhout Date: Mon, 3 Nov 2025 08:35:38 -0800 Subject: [PATCH 3/4] beta->ea Signed-off-by: Craig Osterhout --- content/manuals/offload/_index.md | 4 ++-- content/manuals/offload/troubleshoot.md | 2 +- content/reference/cli/docker/offload/_index.md | 4 ++-- data/summary.yaml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/manuals/offload/_index.md b/content/manuals/offload/_index.md index c829e7f9c9a5..b1531cec6493 100644 --- a/content/manuals/offload/_index.md +++ b/content/manuals/offload/_index.md @@ -7,8 +7,8 @@ params: sidebar: group: Products badge: - color: blue - text: Beta + color: violet + text: Early Access grid: diff --git a/content/manuals/offload/troubleshoot.md b/content/manuals/offload/troubleshoot.md index be34fd17797f..faa4e1282584 100644 --- a/content/manuals/offload/troubleshoot.md +++ b/content/manuals/offload/troubleshoot.md @@ -12,7 +12,7 @@ Docker Offload requires: - Authentication - An active internet connection - No restrictive proxy or firewall blocking traffic to Docker Cloud -- Beta access to Docker Offload +- Access to Docker Offload - Docker Desktop 4.50 or later Docker Desktop uses Offload to run both builds and containers in the cloud. diff --git a/content/reference/cli/docker/offload/_index.md b/content/reference/cli/docker/offload/_index.md index 532a4edc59d6..636807493d4a 100644 --- a/content/reference/cli/docker/offload/_index.md +++ b/content/reference/cli/docker/offload/_index.md @@ -6,8 +6,8 @@ layout: cli params: sidebar: badge: - color: blue - text: Beta + color: violet + text: Early Access --- {{< summary-bar feature_name="Docker Offload" >}} \ No newline at end of file diff --git a/data/summary.yaml b/data/summary.yaml index 0d595b7d8c03..2a58be786d14 100644 --- a/data/summary.yaml +++ b/data/summary.yaml @@ -150,7 +150,7 @@ Docker Build Cloud: Docker CLI OpenTelemetry: requires: Docker Engine [26.1.0](/manuals/engine/release-notes/26.1.md#2610) and later Docker Offload: - availability: Beta + availability: Early Access requires: Docker Desktop 4.50 and later docker compose alpha: availability: Experimental From 7254c0c7aadd433e1d90a499a95029d7fe02f25e Mon Sep 17 00:00:00 2001 From: Craig Osterhout Date: Mon, 3 Nov 2025 08:46:16 -0800 Subject: [PATCH 4/4] remove gpu Signed-off-by: Craig Osterhout --- .../admin/organization/manage-products.md | 13 ------------- .../settings-management/settings-reference.md | 19 ------------------- content/manuals/offload/about.md | 16 ++-------------- content/manuals/offload/configuration.md | 3 +-- content/manuals/offload/quickstart.md | 19 +++++-------------- 5 files changed, 8 insertions(+), 62 deletions(-) diff --git a/content/manuals/admin/organization/manage-products.md b/content/manuals/admin/organization/manage-products.md index 4c16712e5bce..5d5dc544fe51 100644 --- a/content/manuals/admin/organization/manage-products.md +++ b/content/manuals/admin/organization/manage-products.md @@ -127,19 +127,6 @@ Management](/manuals/enterprise/security/hardened-desktop/settings-management/_i visible but locked. Use when Docker Offload is not approved for organizational use. - **User defined**: No enforced default. Users choose whether to enable or disable Docker Offload in their Docker Desktop settings. -1. If GPU support is enabled for your organization's subscription, configure the - **Enable Docker Offload GPU Support** setting to control whether GPU support - is available in Docker Desktop. You can configure this setting in five - states: - - **Always enabled**: GPU support is always enabled and users cannot disable it. - - **Enabled**: GPU support is enabled by default but users can disable it in Docker Desktop - settings. - - **Disabled**: GPU support is disabled by default but users can enable it in Docker Desktop - settings. - - **Always disabled**: GPU support is disabled and users cannot enable it. The option is - visible but locked. - - **User defined**: No enforced default. Users choose whether to enable or disable GPU support in their - Docker Desktop settings. 1. Select **Save**. For more details on Settings Management, see the [Settings diff --git a/content/manuals/enterprise/security/hardened-desktop/settings-management/settings-reference.md b/content/manuals/enterprise/security/hardened-desktop/settings-management/settings-reference.md index b483806509c0..fbfc78d24dc6 100644 --- a/content/manuals/enterprise/security/hardened-desktop/settings-management/settings-reference.md +++ b/content/manuals/enterprise/security/hardened-desktop/settings-management/settings-reference.md @@ -919,25 +919,6 @@ deployment of AI features in security-conscious organizations. > This setting is only available when Docker Offload capability is enabled for > the organization. -#### Enable Docker Offload GPU Support - -| Default value | Accepted values | Format | -|---------------|-----------------|----------| -| `false` | `true`, `false` | Boolean | - -- **Description:** Enable GPU support for Docker Offload features. -- **OS:** {{< badge color=blue text="All" >}} -- **Use case:** Enable GPU-accelerated workloads in Docker Offload. -- **Configure this setting with:** - - **Docker Offload** settings in [Docker Desktop GUI](/manuals/desktop/settings-and-maintenance/settings.md) - - Settings Management: `enableCloudGPUSupport` setting in the [`admin-settings.json` file](/manuals/enterprise/security/hardened-desktop/settings-management/configure-json-file.md) - - Settings Management: **Enable Docker Offload GPU Support** setting in the [Admin Console](/manuals/enterprise/security/hardened-desktop/settings-management/configure-admin-console.md) - -> [!NOTE] -> -> This setting requires Docker Offload to be enabled first and is only available when GPU support capability is enabled -> for the organization. - ### Enable Wasm | Default value | Accepted values | Format | diff --git a/content/manuals/offload/about.md b/content/manuals/offload/about.md index 2c83c9a58dc4..08f6139dff6c 100644 --- a/content/manuals/offload/about.md +++ b/content/manuals/offload/about.md @@ -3,7 +3,7 @@ title: About Docker Offload linktitle: About weight: 15 description: Learn about Docker Offload, its features, and how it works. -keywords: cloud, offload, vdi, on-demand gpu, gpu +keywords: cloud, offload, vdi --- Docker Offload is a fully managed service for building and running containers in @@ -13,17 +13,13 @@ scalable, cloud-powered environment, enabling developers to work efficiently eve in virtual desktop infrastructure (VDI) environments or systems that don't support nested virtualization. -Docker Offload also supports GPU-accelerated instances, allowing you to -containerize and run compute-intensive workloads such as running models and -other machine learning or data processing tasks that benefit from GPU. + ## Key features Docker Offload includes the following capabilities to support modern container workflows: -- GPU acceleration: Use NVIDIA L4 GPU-backed environments for machine learning, - media processing, and other compute-intensive workloads. - Ephemeral cloud runners: Automatically provision and tear down cloud environments for each container session. - Hybrid workflows: Seamlessly transition between local and remote execution @@ -42,7 +38,6 @@ local and cloud environments. It helps you: - Offload heavy builds and runs to fast, scalable infrastructure - Run containers that require more resources than your local setup can provide -- Build and run AI apps with instant access to GPU-powered environments - Use Docker Compose to manage complex, multi-service apps that need cloud resources - Maintain consistent environments without managing custom infrastructure @@ -77,13 +72,6 @@ support nested virtualization. This makes Docker Offload ideal for developers using environments such as virtual desktops, cloud-hosted development machines, or older hardware. -Docker Offload also supports GPU-accelerated workloads. Containers that require -GPU access can run on cloud instances provisioned with NVIDIA GPUs for -efficient AI inferencing, media processing, and general-purpose GPU -acceleration. This enables compute-heavy workflows such as model evaluation, -image processing, and hardware-accelerated CI tests to run seamlessly in the -cloud. - Despite running remotely, features like bind mounts and port forwarding continue to work seamlessly, providing a local-like experience from within Docker Desktop and the CLI. diff --git a/content/manuals/offload/configuration.md b/content/manuals/offload/configuration.md index cf6b9bf726d3..cc788151413a 100644 --- a/content/manuals/offload/configuration.md +++ b/content/manuals/offload/configuration.md @@ -3,7 +3,7 @@ title: Configure Docker Offload linktitle: Configure weight: 20 description: Learn how to configure build settings for Docker Offload. -keywords: cloud, configuration, settings, offload, gpu +keywords: cloud, configuration, settings, offload --- {{< summary-bar feature_name="Docker Offload" >}} @@ -31,7 +31,6 @@ For developers, you can manage Docker Offload settings in Docker Desktop. To man - Toggle **Enable Docker Offload**. When enabled, you can start Offload sessions. - Select **Idle timeout**. This is the duration of time between no activity and Docker Offload entering idle mode. For details about idle timeout, see [Understand active and idle states](#understand-active-and-idle-states). - - Check **Enable GPU support**. When enabled, workloads can use cloud GPU if available. ### Understand active and idle states diff --git a/content/manuals/offload/quickstart.md b/content/manuals/offload/quickstart.md index e8c275cd109e..153e083d104d 100644 --- a/content/manuals/offload/quickstart.md +++ b/content/manuals/offload/quickstart.md @@ -3,13 +3,13 @@ title: Docker Offload quickstart linktitle: Quickstart weight: 10 description: Learn how to use Docker Offload to build and run your container images faster, both locally and in CI. -keywords: cloud, quickstart, Docker Desktop, gpu, offload +keywords: cloud, quickstart, Docker Desktop, offload --- {{< summary-bar feature_name="Docker Offload" >}} [Docker Offload](./about.md) lets you build and run containers in the cloud while using your local Docker Desktop tools -and workflow. This means faster builds, access to powerful cloud resources like GPUs, and a seamless development +and workflow. This means faster builds, access to powerful cloud resources, and a seamless development experience. This quickstart covers the steps developers need to get started with Docker Offload. @@ -66,10 +66,6 @@ how to start Docker Offload using the CLI. 3. If you are a member of multiple organizations that have access to Docker Offload, you have the option to select a profile. The selected organization is responsible for any usage. - -4. If GPU-accelerated instances are enabled for your organization, you have the option to select **GPU Supported**, or - **CPU-only support**. - When Docker Offload is started, you'll see a cloud icon ({{< inline-image src="./images/cloud-mode.png" alt="Offload mode icon" >}}) in the Docker Desktop Dashboard header, and the Docker Desktop Dashboard appears purple. You can run @@ -87,12 +83,6 @@ To verify that Docker Offload is working, run a container: $ docker run --rm hello-world ``` -If you enabled GPU support, you can also run a GPU-enabled container: - -```console -$ docker run --rm --gpus all hello-world -``` - If Docker Offload is working, you'll see `Hello from Docker!` in the terminal output. ## Step 4: Monitor your Offload usage @@ -106,8 +96,9 @@ in the left navigation of the Docker Desktop Dashboard. ## Step 5: Stop Docker Offload -Docker Offload automatically [idles](./configuration.md#understand-active-and-idle-states) after a period of inactivity. You can stop it at -any time. To stop Docker Offload: +Docker Offload automatically +[idles](./configuration.md#understand-active-and-idle-states) after a period of +inactivity. You can stop it at any time. To stop Docker Offload: ```console $ docker offload stop