Start Building for Free
CircleCI.comAcademyBlogCommunitySupport

Execution environments overview

3 months ago3 min read
Cloud
Server v4.x
Server v3.x
On This Page

CircleCI offers several execution environments: Docker (x86 or Arm), Linux VM (virtual machine), macOS, Windows, GPU and Arm VM. Each job defined in your project configuration is run in a separate execution environment, either a Docker container or a virtual machine.

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 best-suit your project.

It is possible to specify a different executor type for every job in your .circleci/config.yml by specifying the executor type and an appropriate image. 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 or Python. The pre-built CircleCI Docker image from the CircleCI Docker Hub will help you get started quickly without learning all about Docker. These images are not a full operating system, so they will generally make building your software more efficient.
  • Jobs that require a complete Linux virtual machine (VM) image (machine) may use an Ubuntu version supported by the list of available machine images.
  • Jobs that require a macOS VM image (macos) may use an Xcode version such as 12.5.1.

Docker

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

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 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

Find out more about the Linux VM execution environment in the Using Linux Virtual Machines page.

macOS

To access the macOS execution environment, use the macos executor and specify an image using the xcode key. For a full list of macOS images, see the CircleCI Developer Hub.

jobs:
  build: # name of your job
    macos: # executor type
      xcode: 14.2.0

    steps:
      # Commands run in a macOS virtual machine environment
      # with Xcode 14.2.0 installed

Find out more about the macOS execution environment on the Using macOS page.

Windows

To access the Windows execution environment, either use the Windows orb and then specify one of the default executor from the orb, or use the machine executor and specify a windows image. For a full list of machine images, see the CircleCI Developer Hub.

Find out more about the Windows execution environment in the Using the Windows Execution Environment page. See the Windows orb page in the developer hub for the list of options available in the Windows orb.

GPU

To access the GPU execution environment, either use the Windows orb and then specify the GPU-enabled executor from the orb, or use the machine executor and specify a Linux or Windows GPU-enabled image. For a full list of machine images, see the CircleCI Developer Hub.

Find out more about the GPU execution environment on the Using the GPU Execution Environment page.

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.

Find out more about the Arm VM execution environment in the Using the Arm VM Execution Environment page. You can also use Arm on Docker.

Self-hosted runner

CircleCI provides the ability to have self-hosted runners with container runner with Kubernetes, as well as in a virtual machine with machine runner on Linux, Windows, and macOS.

Port ranges

When using a machine executor, if a port range is hardcoded, the range in /proc/sys/net/ipv4/ip_local_reserved_ports should be avoided. 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


Suggest an edit to this page

Make a contribution
Learn how to contribute