---
title: "Cloud server with Containers Ready"
sidebar_label: "Containers Ready"
sidebar_position: 10
toc_max_heading_level: 3
description: "How to create a cloud server for working with Docker and Docker Compose"
---

import EditIcon from '@selectel/docux/icons/edit'
import CheckIcon from '@selectel/docux/icons/check'
import Tabs from '@theme/Tabs'
import TabItem from '@theme/TabItem'
import {TabItemLabel} from '@selectel/docux/components'
import {CustomTable} from '@selectel/docux/components'
import Formbricks from '@theme/MDXComponents/Formbricks'
import CopyIcon from '@selectel/docux/icons/copy'
import CreateServer from '@site/i18n/en/docusaurus-plugin-content-docs/current/_partials/cloud-servers/applications/create-server-for-apps.mdx'

# Cloud server with Containers Ready

You can use the Containers Ready application to work with Docker Compose files; it includes:

* Docker — a containerization platform for developing and running applications;
* plugins for running Docker Compose;
* Portainer — a graphical interface for monitoring and managing Docker containers, images, and Docker networks.

A Selectel mirror is used as the Docker Registry repository for stable image operation.

You can [create a cloud server with a pre-installed Containers Ready application](#create-cloud-server-with-containers-ready). In Russia, the application runs on a cloud server with the pre-configured [SelectOS 1 64-bit](https://selectos.selectel.ru/news/mega/) operating system. In other [countries](/infrastructure/locations/#country) — Ubuntu 22.04.

Before creating a cloud server with an application, read the [software license agreements](https://423.selcdn.ru/kb/license-agreements-for-application-images-LANG.pdf) included in the image.

## Minimum resource requirements \{#minimum-requirements}

<CustomTable>
  <table>
    <tbody>
      <tr>
        <th>vCPU count</th><td>2</td>
      </tr>

      <tr>
        <th>RAM</th><td>2 GB</td>
      </tr>

      <tr>
        <th>Boot volume</th><td>20 GB</td>
      </tr>
    </tbody>
  </table>
</CustomTable>

## Create a cloud server with Containers Ready \{#create-cloud-server-with-containers-ready}

:::info

Portainer with a TLS certificate runs on port `9443`, and without a TLS certificate — on port `9000`.

:::

For Containers Ready to work, the cloud server must be accessible from the internet. To do this, you must create a private subnet and attach a public floating IP address when creating the server.

To set up Containers Ready and the Portainer configuration, when creating a server you must specify user data — custom operating system configuration parameters. You can define one of two sets of parameters:

* with a TLS certificate issued for Portainer;
* without a TLS certificate issued for Portainer.

After the server with Containers Ready is created, a free [TLS certificate from Let’s Encrypt®](/certificates-manager/certificates/lets-encrypt.mdx) will be automatically issued for the domain you specify. To issue the certificate, you need to add an A record for the domain and specify the server's public floating IP address as the record value. You can add the domain to [Selectel DNS Hosting (actual](/dns-hosting/)).

1. Optional: [create a public floating IP address](#create-floating-ip).

2. Optional: [add an A record for the domain](#add-a-record).

3. [Create a cloud server with Containers Ready](#create-containers-ready-server).

### 1. Optional: create a public floating IP address \{#create-floating-ip}

Create a public floating IP address so the cloud server with Containers Ready can be accessed from the internet.

Use the [Create a public floating IP address](/cloud-servers/cloud-networks/public-floating-ip-addresses.mdx#create-public-floating-ip) section of the [Public Floating IP addresses](/cloud-servers/cloud-networks/public-floating-ip-addresses.mdx) guide.

### 2. Optional: add an A record for the domain⁠ \{#add-a-record}

[Add a resource record](/dns-hosting/records/add-record.mdx) to access the cloud server with Containers Ready by domain.

Specify:

* [resource record type](/dns-hosting/records/add-record.mdx#record-types) in the group — A;
* record value — the public floating IP address you [created in step 1](#create-floating-ip).

### 3. Create a cloud server with Containers Ready \{#create-containers-ready-server}

<CreateServer AppNameInPanel="Cloud Containers Ready" MinConfig="2 vCPU, RAM starting from 2 GB and a boot disk size starting from 20 GB" OptionalVolumes="Optional: add an additional" VolumeSize="Specify the size of the network disk in GB or TB" />

<div style={{paddingLeft:'2em'}}>
  <Tabs queryString="add-user-data">
    <TabItem value="tls" default>
      <TabItemLabel>
        Creating a server with TLS certificate issuance
      </TabItemLabel>

      ```yaml
      #cloud-config

      write_files:
      - path: "/opt/containers/docker-compose.yaml"
        permissions: "0644"
        content: |
          version: "3.9"
          name: test
          services:
            web:
              container_name: web
              image: "busybox"
              env_file: "/opt/containers/.env"
            db:
              container_name: db
              image: "busybox"
              env_file: "/opt/containers/.env"

      - path: "/opt/containers/.env"
        permissions: "0644"
        content: |
          ENV_VARIABLE: example.com

      - path: "/opt/gomplate/values/user-values.yaml"
        permissions: "0644"
        content: |
          portainer_password: "<administrator_password>"
          portainer_use_le: true
          portainer_domain: "<example.com>"
          portainer_le_email: "<root@example.com>"
      ```

      Specify:

      * in the `content:` code block for the `docker-compose.yaml` file, specify the contents of the Docker Compose file;
      * in the `content:` code block for the `.env` file, specify the contents of the file. If you do not need the file, delete the code block;
      * `<administrator_password>` — Portainer administrator password (the default login is `Admin`);
      * `portainer_use_le: true` — parameter for automatic TLS certificate issuance from Let’s Encrypt®;
      * `<example.com>` — the domain for accessing Portainer that you [added earlier](#add-a-record);
      * `<root@example.com>` — Portainer administrator email for account creation and receiving Let’s Encrypt® notifications.
    </TabItem>

    <TabItem value="no-tls">
      <TabItemLabel>
        Creating a server without TLS certificate issuance
      </TabItemLabel>

      ```yaml
      #cloud-config

      write_files:
      - path: "/opt/containers/docker-compose.yaml"
        permissions: "0644"
        content: |
          version: "3.9"
          name: test
          services:
            web:
              container_name: web
              image: "busybox"
              env_file: "/opt/containers/.env"
            db:
              container_name: db
              image: "busybox"
              env_file: "/opt/containers/.env"

      - path: "/opt/containers/.env"
        permissions: "0644"
        content: |
          ENV_VARIABLE: example.com

      - path: "/opt/gomplate/values/user-values.yaml"
        permissions: "0644"
        content: |
          portainer_password: "<administrator_password>"
      ```

      Specify:

      * in the `content:` code block for the `docker-compose.yaml` file, specify the contents of the Docker Compose file;
      * in the `content:` code block for the `.env` file, specify the contents of the file. If you do not need the file, delete the code block;
      * `<administrator_password>` — Portainer administrator password (the default login is `Admin`).
    </TabItem>
  </Tabs>
</div>

<Formbricks />
