# Add hosts

## Overview

Sandboxes support VMs and containers natively. Use the following points to determine if you should use one or the other.

You should use VMs if...

* You need control how many CPUs the host gets
* The host needs to be externally accessible ([see networking documentation](https://docs.instruqt.com/reference/platform/networking))

You should use containers if...

* You want to make loading times as short as possible (they are generally faster to deploy)
* You have a lightweight application with minimal resource requirements

## Add VMs to sandboxes

You can use the web UI or Instruqt CLI to add VMs to a sandbox.

{% tabs %}
{% tab title="🌐 Web UI" %}

1. Select a track.
2. In the *Sandbox* section, click **Edit**.&#x20;
3. In the *Your hosts* section, click **+ Add a host**.&#x20;
4. Select **Virtual machine**.
5. Enter a hostname.
6. Select **Preset image** or **Choose your own**.&#x20;
   * If you select **Preset image**, select the preset you wish to use.
   * If you select **Choose your own**, provide a GCP image and machine type ([see docs](https://docs.instruqt.com/sandboxes/hosts/create-a-custom-vm-image)).&#x20;
7. Define any additional settings you need.
   * Shell
   * External ingress
   * SSL certificate
   * Nested virtualization
8. Click **Save host**.
   {% endtab %}

{% tab title="💻 Instruqt CLI" %}
Within a track's `config.yml` file, VM hosts are defined like so:

```markdown
virtualmachines:
- name: <hostname>
  image: <gcp_project>/<image_name>
  machine_type: <machine_size>
```

{% endtab %}
{% endtabs %}

## Add containers to sandboxes

You can use the web UI or Instruqt CLI to add containers to a sandbox.

{% tabs %}
{% tab title="🌐 Web UI" %}

1. Select a track.
2. In the *Sandbox* section, click **Edit**.&#x20;
3. In the *Your hosts* section, click **+ Add a host**.&#x20;
4. Select **Container**.
5. Enter a hostname.
6. Select **Preset image** or **Choose your own**.&#x20;
   * If you select **Preset image**, select the preset you wish to use.
   * If you select **Choose your own**, provide a custom image ([see docs](https://docs.instruqt.com/sandboxes/hosts/custom-container-images)).&#x20;
7. Define any additional settings you need.
   * Entrypoint
   * Cmd
   * Ports
   * Shell
8. Click **Save host**.
   {% endtab %}

{% tab title="💻 Instruqt CLI" %}
Within a track's `config.yml` file, container hosts are defined like so:

```markdown
containers:
- name: <hostname>
  image: <container_image>
  memory: <memory_ammount_mb>
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
Each sandbox is subject to a limit of **15 containers and website services combined** at any given time. This limitation helps ensure optimal performance and resource allocation for all users.
{% endhint %}
