---
title: "Execution environments overview"
description: "Compare the CircleCI execution environments: Docker, Linux VM, macOS, Windows, GPU, and Arm VM, and learn how images and resource classes apply."
platform: "Cloud, Server"
doc_version: "Server"
last_updated: "2026-10-26"
---

> For current CircleCI product defaults, deprecated patterns, and Cloud/Server differences, see [AGENTS.md](https://circleci.com/docs/AGENTS.md).
>
> For the complete documentation index and site structure, see [llms.txt](https://circleci.com/docs/llms.txt).

# Execution environments overview

CircleCI offers several execution environments:

*   Docker
    
*   Linux VM (virtual machine)
    
*   Windows
    
*   Arm VM
    

Each job defined in your project configuration is run in a separate execution environment, either a Docker container or a virtual machine.

## Executors

For each job in your project config, you will specify an execution environment by assigning it an **executor**. An **executor** defines the underlying technology or environment in which to run a job, and which image to use to suit your job.

It is possible to specify a different executor and image for each job in your [Configuration File](https://circleci.com/docs/reference/configuration-reference/).

### Images, containers, and virtual machines

An _image_ is a packaged system that has the instructions for creating a running environment.

A _container_ or _virtual machine_ is the term used for a running instance of an image.

For example:

*   Jobs that require Docker images (`docker`) may use an image for Node.js, Python, etc. The [Pre-built CircleCI Docker Image](https://circleci.com/docs/guides/server/execute/circleci-images/) (convenience images) will help you get started. CircleCI convenience images are not a full operating system, so they generally make building your software more efficient.
    
*   Jobs that require a complete Linux virtual machine (VM) image (`machine`) use an image that your system administrator manages.
    

### Resource class

When you configure an executor it is recommended that you also specify a resource class to specify compute resource size (CPU and RAM).

*   For an overview of resource classes, see the [Resource Class Overview](https://circleci.com/docs/guides/server/execute/resource-class-overview/) page.
    

## Docker

**Legacy images with the prefix "CircleCI/" are [deprecated](https://discuss.circleci.com/t/legacy-convenience-image-deprecation/41034)** on December 31, 2021. For faster builds, upgrade your projects with [next-generation convenience images](https://circleci.com/blog/announcing-our-next-generation-convenience-images-smaller-faster-more-deterministic/).

To access the Docker execution environment, use the `docker` executor and specify an image. For a full list of convenience images, which are built by CircleCI, see the [CircleCI Developer Hub](https://circleci.com/developer/images?imageType=docker).

```yml
jobs:
  build: # name of your job
    docker: # executor type
      - image: cimg/base:stable # primary container will run the latest, production-ready base image

    steps:
        # Commands run in the primary container
```

Find out more about the Docker execution environment on the [Using Docker](https://circleci.com/docs/guides/server/execute/using-docker/) page.

## Linux VM

To access the Linux VM execution environment, use the `machine` executor and specify a Linux image. For a full list of `machine` images, see the [CircleCI Developer Hub](https://circleci.com/developer/images?imageType=machine).

<Tabs>
<Tab title="Cloud">

```yml
jobs:
  build: # name of your job
    machine: # executor type
      image: ubuntu-2404:current

    steps:
        # Commands run in a Linux virtual machine environment
```

</Tab>
<Tab title="Server">

```yml
jobs:
  build: # name of your job
    machine:
      image: default # executor type
    steps:
      # Commands run in a Linux virtual machine environment
```

</Tab>
</Tabs>

Find out more about the Linux VM execution environment on the [Using Linux Virtual Machines](https://circleci.com/docs/guides/server/execute/using-linuxvm/) page.

## Windows

To access the Windows execution environment, you can either:

*   Use the Windows orb and specify one of the default executors.
    
*   Use the `machine` executor and specify a Windows image.
    

For a full list of `machine` images, see the [CircleCI Developer Hub](https://circleci.com/developer/images?imageType=machine).

<Tabs>
<Tab title="Cloud with orb">

```yml
version: 2.1

orbs:
  win: circleci/windows@4.1.1 # The Windows orb gives you everything you need to start using the Windows executor

jobs:
  build: # name of your job
    executor: win/server-2022 # use one of the executors defined within the windows orb

    steps:
      # Commands are run in a Windows virtual machine environment
      - checkout
      - run: Write-Host 'Hello, Windows'
```

</Tab>
<Tab title="Cloud">

```yaml
version: 2.1

jobs:
  build: # name of your job
    resource_class: 'windows.medium'
    machine:
      image: 'windows-server-2022-gui:current'
      shell: 'powershell.exe -ExecutionPolicy Bypass'
    steps:
      # Commands are run in a Windows virtual machine environment
        - checkout
        - run: Write-Host 'Hello, Windows'
```

</Tab>
<Tab title="Server">

```yml
version: 2.1

jobs:
  build: # name of your job
    machine:
      image: windows-default
    steps:
      # Commands are run in a Windows virtual machine environment
        - checkout
        - run: Write-Host 'Hello, Windows'
```

</Tab>
</Tabs>

Find out more about the Windows execution environment on the [Using the Windows Execution Environment](https://circleci.com/docs/guides/server/execute/using-windows/) page. See [the Windows orb page on the developer hub](https://circleci.com/developer/orbs/orb/circleci/windows) for the list of options available in the Windows orb.

## Arm VM

To access the Arm VM execution environment, use the `machine` executor as detailed below, and specify either the `arm.medium` or the `arm.large` resource class. For a full list of `machine` images, see the [CircleCI Developer Hub](https://circleci.com/developer/images?imageType=machine).

<Tabs>
<Tab title="Cloud">

```yml
# .circleci/config.yml
version: 2.1

jobs:
  build-medium:
    machine:
      image: ubuntu-2404:current
    resource_class: arm.medium
    steps:
      - run: uname -a
      - run: echo "Hello, Arm!"

  build-large:
    machine:
      image: ubuntu-2404:current
    resource_class: arm.large
    steps:
      - run: uname -a
      - run: echo "Hello, Arm!"

workflows:
  build:
    jobs:
      - build-medium
      - build-large
```

</Tab>
<Tab title="Server">

Arm resources on CircleCI Server are only available on installations that use AWS EC2.

```yml
# .circleci/config.yml
version: 2.1

jobs:
  build-medium:
    machine:
      image: arm-default
    resource_class: arm.medium
    steps:
      - run: uname -a
      - run: echo "Hello, Arm!"

  build-large:
    machine:
      image: arm-default
    resource_class: arm.large
    steps:
      - run: uname -a
      - run: echo "Hello, Arm!"

workflows:
  build:
    jobs:
      - build-medium
      - build-large
```

</Tab>
</Tabs>

Find out more about the Arm VM execution environment on the [Using the Arm VM Execution Environment](https://circleci.com/docs/guides/server/execute/using-arm/) page.

## Self-hosted runner

CircleCI provides the ability to have self-hosted runners:

*   [Container Runner](https://circleci.com/docs/runner/container-runner/) using Kubernetes.
    
*   [Machine Runner](https://circleci.com/docs/runner/runner-overview/#machine-runner-use-case) using Linux, Windows, and macOS virtual machines.
    

## Port ranges

When using a machine executor, if a port range is hard coded, avoid the range in `/proc/sys/net/ipv4/ip_local_reserved_ports`. Port range 32768 - 60999 is used by the TCP stack to allocate ephemeral ports for connections. Ports in that range may have already been allocated by a previous connection, so collisions are possible.

## Next steps

*   Read more about [Pre-built CircleCI Convenience Images](https://circleci.com/docs/guides/server/execute/circleci-images/) for the Docker execution environment.