Creating an instance group from a Container Optimized Image with multiple Docker containers
You can create an instance group based on a image Container Optimized Image with multiple Docker containers inside.
We will use the Docker Compose specification to create Docker containers.
Alert
When creating instance groups, keep the limits in mind. Not to disrupt the component Instance Groups, do not update or delete manually created resources: target group Network Load Balancer, VMs, and disks. Instead of this, change or delete the entire group.
Getting started
If you do not have the Yandex Cloud CLI yet, install and initialize it.
The folder used by default is the one specified when creating the CLI profile. To change the default folder, use the yc config set folder-id <folder_ID> command. You can also specify a different folder for any command using --folder-name or --folder-id. If you access a resource by its name, the search will be limited to the default folder. If you access a resource by its ID, the search will be global, i.e., through all folders based on access permissions.
Set up your environment
-
Create a service account named
group-coiand assign theeditorrole to it:Management consoleCLIAPI- In the management console
, select the folder where you want to create your service account. - In the list of services, select Identity and Access Management.
- Click Create service account.
- Enter the name:
group-coi. - To assign the service account the
editorrole for the current folder, click Add role and selecteditor. - Click Create.
-
Create a service account:
yc iam service-account create --name group-coiResult:
id: ajeabccde01d******** folder_id: b0g12ga82bcv******** created_at: "2023-03-13T14:32:18.900092Z" name: group-coi -
Assign the role to the service account:
yc resource-manager folder add-access-binding b0g12ga82bcv******** \ --role editor \ --subject serviceAccount:ajeabccde01d********
Use the Create method for the
ServiceAccountresource. - In the management console
-
Create a network named
yc-auto-networkand a subnet in the same availability zone:Management consoleCLIAPI- In the management console
, select the folder where you want to create your network. - Select Virtual Private Cloud.
- Click Create network.
- Specify
yc-auto-networkas the network name. - Select the Create subnets option.
- Click Create network.
-
Create a network:
yc vpc network create --name yc-auto-networkResult:
id: enpabce123hd******** folder_id: b0g12ga82bcv******** created_at: "2023-03-13T14:57:15Z" name: yc-auto-network -
Create a subnet in the
ru-central1-aavailability zone:yc vpc subnet create --network-id enpabce123hd******** --range 192.168.1.0/24 --zone ru-central1-aResult:
id: e1lnabc23r1c******** folder_id: b0g12ga82bcv******** created_at: "2023-03-13T16:23:12Z" network_id: enpabce123hd******** zone_id: ru-central1-a v4_cidr_blocks: - 192.168.1.0/24
- In the management console
Create an instance group from a Container Optimized Image with multiple Docker containers
-
Get the ID of the latest version of the public Container Optimized Image.
A Container Optimized Image in Container Registry may get updates and modifications that come with new releases. This will not automatically update the VM image to the latest version. To create an instance group with the latest Container Optimized Image version, manually check whether it is available:
CLIYandex Cloud Marketplaceyc compute image get-latest-from-family container-optimized-image --folder-id standard-imagesResult:
id: <latest_COI_version_ID> folder_id: standard-images ...- Go to the Cloud Marketplace page and select the image with the configuration you need:
- Under Product IDs, copy the
image_idvalue.
-
Save the specification of the instance group created from a Container Optimized Image with multiple Docker containers to the
specification.yamlfile:name: group-coi-containers # Instance group name, unique within the folder. service_account_id: ajeabccde01d******** # Service account ID. instance_template: service_account_id: ajeabccde01d******** # ID of the service account for accessing private Docker images. platform_id: standard-v3 # Platform ID. resources_spec: memory: 2G # Amount of RAM. cores: 2 # Number of vCPUs. boot_disk_spec: mode: READ_WRITE # Disk access mode: read and write. disk_spec: image_id: <latest_COI_version_ID> type_id: network-hdd # Disk type. size: 32G # Disk size. It must be at least 30 GB. network_interface_specs: - network_id: enpabce123hd******** # Network ID. subnet_ids: - e1lnabc23r1c******** # Subnet ID. primary_v4_address_spec: { one_to_one_nat_spec: { ip_version: IPV4 # IPv4 specification for public access to the VM. } } metadata: # Values to write to the VM metadata. docker-compose: |- # VM metadata key that indicates the use of a Docker Compose specification. version: '3.7' services: app1: container_name: nginx image: "nginx" ports: - "80:80" restart: always app2: container_name: redis image: "redis" restart: always ssh-keys: | # Parameter for providing an SSH key to the VM. yc-user:ssh-ed25519 ABC...d01 user@desktop.ru # Username for connecting to the VM. deploy_policy: # Instance deployment policy for the group. max_unavailable: 1 max_expansion: 0 scale_policy: # Instance scaling policy for the group. fixed_scale: size: 2 allocation_policy: # Policy for allocating instances across availability zones. zones: - zone_id: ru-central1-aNote
You can provide an SSH key in the VM metadata using the
ssh-keysparameter or in theuser-datakey with the user metadata. This tutorial uses the first option. -
Create an instance group named
group-coi-containersusing thespecification.yamlspecification:CLIAPIRun this command:
yc compute instance-group create --file=specification.yamlResult:
done (48s) id: cl0q12abcd4e******** folder_id: b0g12ga82bcv******** ... target_size: "2" service_account_id: ajeabccde01d******** status: ACTIVEUse the CreateFromYaml method for the
InstanceGroupresource. -
Make sure the instance group based on a Container Optimized Image with multiple Docker containers has been created:
Management consoleCLIAPI- In the management console
, select the folder where you created the instance group. - Navigate to Compute Cloud.
- Navigate to Instance groups.
- Click
group-coi-containers.
yc compute instance-group list-instances group-coi-containersResult:
+----------------------+---------------------------+----------------------------------+-------------+------------------------+----------------+ | INSTANCE ID | NAME | EXTERNAL IP | INTERNAL IP | STATUS | STATUS MESSAGE | +----------------------+---------------------------+----------------------------------+-------------+------------------------+----------------+ | fhmabcv0de12******** | cl0q12abcs4g********-fmar | 84.201.155.117 | 10.130.0.14 | RUNNING_ACTUAL [2h35m] | | | fhmab0cdqj12******** | cl0q12abcs4g********-fqeg | 84.252.131.221 | 10.130.0.47 | RUNNING_ACTUAL [2h35m] | | +----------------------+---------------------------+----------------------------------+-------------+------------------------+----------------+View the list of created VM instances using the List method for the
InstanceGroupresource. - In the management console
Check the instance group with a Container Optimized Image and multiple Docker containers
-
Connect to one of the VM instances over SSH.
CLIssh yc-user@84.201.155.117Result:
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-54-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage Last login: Mon Mar 13 15:23:28 2023 from 123.456.789.101 -
View the list of Docker containers running on the VM:
CLIsudo docker ps -aResult:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c0a125a1765a redis "docker-entrypoint.s…" About a minute ago Up About a minute 6379/tcp redis 01288d7e382f nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp nginx