Как использовать команду docker compose alpha scale для масштабирования сервисов

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь использовать команду docker compose alpha scale для масштабирования сервисов, определённых в проекте Docker Compose. Мы начнём с подготовки простого проекта Docker Compose, который включает установку Docker Compose, создание базового веб-приложения и определение его Dockerfile и зависимостей.

После настройки проекта вы изучите, как масштабировать один сервис с помощью docker compose alpha scale, масштабировать несколько сервисов одновременно, а также масштабировать сервис без запуска его зависимостей. Этот практический опыт продемонстрирует гибкость и мощь команды scale для управления количеством запущенных экземпляров ваших сервисов.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555071{{"Как использовать команду docker compose alpha scale для масштабирования сервисов"}} docker/ls -.-> lab-555071{{"Как использовать команду docker compose alpha scale для масштабирования сервисов"}} docker/ps -.-> lab-555071{{"Как использовать команду docker compose alpha scale для масштабирования сервисов"}} docker/rm -.-> lab-555071{{"Как использовать команду docker compose alpha scale для масштабирования сервисов"}} docker/build -.-> lab-555071{{"Как использовать команду docker compose alpha scale для масштабирования сервисов"}} end

Подготовка простого проекта Docker Compose

На этом шаге мы подготовим простой проект Docker Compose. Поскольку Docker Compose не предустановлен в среде LabEx, мы сначала установим его. Затем мы создадим простое веб-приложение и файл Docker Compose для его определения и запуска.

Сначала установим Docker Compose. Мы загрузим бинарный файл Docker Compose и сделаем его исполняемым.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Теперь проверим установку, посмотрев версию Docker Compose.

docker-compose --version

В выводе вы должны увидеть установленную версию Docker Compose.

Далее мы создадим простое веб-приложение. Мы будем использовать базовое приложение на Python Flask. Создадим директорию для нашего проекта и перейдём в неё.

mkdir my-web-app
cd my-web-app

Внутри директории my-web-app создадим файл app.py со следующим содержимым:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, Docker Compose!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')

Это простое приложение Flask, которое возвращает "Hello, Docker Compose!" при обращении.

Теперь нам нужен Dockerfile для сборки Docker-образа нашего приложения Flask. Создадим файл Dockerfile в директории my-web-app со следующим содержимым:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

Этот Dockerfile использует slim-образ Python 3.9, устанавливает рабочую директорию, копирует и устанавливает зависимости из requirements.txt, копирует код приложения, открывает порт 5000 и указывает команду для запуска приложения.

Нам также понадобится файл requirements.txt для зависимости Flask. Создадим файл requirements.txt в директории my-web-app со следующим содержимым:

Flask==2.2.2

Наконец, создадим файл docker-compose.yml для определения нашего сервиса. Создадим файл docker-compose.yml в директории my-web-app со следующим содержимым:

version: "3.8"

services:
  web:
    build: .
    ports:
      - "5000:5000"

Этот файл docker-compose.yml определяет сервис с именем web. Он указывает Docker Compose собрать образ, используя Dockerfile в текущей директории (.), и пробросить порт 5000 хоста на порт 5000 контейнера.

Теперь соберём и запустим сервис с помощью Docker Compose. Убедитесь, что вы находитесь в директории ~/project/my-web-app.

docker-compose up -d

Эта команда соберёт образ (если он ещё не собран), создаст контейнер для сервиса web и запустит его в detached-режиме (-d).

Вы можете проверить, запущен ли контейнер, с помощью команды docker ps.

docker ps

Вы должны увидеть контейнер для сервиса my-web-app-web-1 в состоянии "running".

Чтобы проверить работу приложения, можно обратиться к нему с помощью curl.

curl http://localhost:5000

Вы должны увидеть вывод "Hello, Docker Compose!".

Масштабирование сервиса с помощью docker compose alpha scale

На этом шаге мы научимся масштабировать сервис с помощью команды docker compose alpha scale. Масштабирование сервиса означает увеличение или уменьшение количества работающих экземпляров (контейнеров) для этого сервиса. Это полезно для обработки возросшей нагрузки или обеспечения высокой доступности.

Команда docker compose alpha scale позволяет установить желаемое количество реплик для конкретного сервиса. Подкоманда alpha указывает, что это новая функция в Docker Compose.

Убедитесь, что вы находитесь в директории ~/project/my-web-app, где расположен ваш файл docker-compose.yml.

В настоящее время у нас запущен один экземпляр сервиса web. Мы можем проверить это, выведя список работающих контейнеров и отфильтровав их по имени сервиса.

docker ps --filter "name=my-web-app-web"

Вы должны увидеть только один контейнер в списке.

Теперь давайте масштабируем сервис web до 3 экземпляров. Мы используем команду docker compose alpha scale, за которой следует имя сервиса и желаемое количество реплик.

docker compose alpha scale web=3

Эта команда запустит два новых контейнера для сервиса web, доведя общее количество экземпляров до 3.

После выполнения команды вы можете снова проверить работающие контейнеры, чтобы увидеть масштабированные экземпляры.

docker ps --filter "name=my-web-app-web"

Теперь вы должны увидеть три контейнера в списке, каждый с разным ID и именем (например, my-web-app-web-1, my-web-app-web-2, my-web-app-web-3).

Команда docker compose alpha scale — это удобный способ динамически регулировать количество реплик сервиса без изменения файла docker-compose.yml и повторного запуска docker compose up.

Чтобы уменьшить количество экземпляров сервиса, вы можете использовать ту же команду с меньшим числом. Например, чтобы вернуться к 1 экземпляру:

docker compose alpha scale web=1

Это остановит и удалит дополнительные контейнеры, оставив только один работающий экземпляр.

Давайте снова масштабируем до 3 экземпляров для следующего шага.

docker compose alpha scale web=3

Одновременное масштабирование нескольких сервисов

На этом шаге мы научимся масштабировать несколько сервисов одновременно с помощью команды docker compose alpha scale. Это полезно, когда в вашем приложении есть несколько сервисов, которые нужно масштабировать вместе для обработки возросшей нагрузки или поддержания сбалансированной архитектуры.

Для демонстрации добавим еще один простой сервис в наш файл docker-compose.yml. Мы создадим простой сервис Nginx для обслуживания статического контента.

Сначала создадим директорию для статического контента Nginx.

mkdir static

Внутри директории static создадим простой HTML-файл index.html со следующим содержимым:

<!doctype html>
<html>
  <head>
    <title>Static Content</title>
  </head>
  <body>
    <h1>Hello from Nginx!</h1>
  </body>
</html>

Теперь обновим файл docker-compose.yml в директории ~/project/my-web-app, добавив сервис Nginx. Откроем файл с помощью nano.

nano docker-compose.yml

Добавим следующее определение сервиса после сервиса web:

nginx:
  image: nginx:latest
  ports:
    - "80:80"
  volumes:
    - ./static:/usr/share/nginx/html

Обновленный файл docker-compose.yml должен выглядеть так:

version: "3.8"

services:
  web:
    build: .
    ports:
      - "5000:5000"

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./static:/usr/share/nginx/html

Это добавляет сервис nginx, который использует образ nginx:latest, пробрасывает порт 80 хоста на порт 80 контейнера и монтирует директорию ./static в корневую веб-директорию Nginx (/usr/share/nginx/html).

Сохраним файл docker-compose.yml и выйдем из nano (Ctrl+X, Y, Enter).

Теперь запустим новый сервис. Поскольку мы изменили файл docker-compose.yml, нужно снова выполнить docker compose up. Флаг -d запускает контейнеры в detached-режиме.

docker compose up -d

Docker Compose создаст и запустит сервис nginx. Сервис web уже должен быть запущен с предыдущего шага.

Можно проверить работу обоих сервисов с помощью docker ps.

docker ps

Вы должны увидеть контейнеры для my-web-app-web-1, my-web-app-web-2, my-web-app-web-3 и my-web-app-nginx-1.

Теперь масштабируем сервис web до 5 экземпляров и сервис nginx до 2 экземпляров одновременно. Мы можем сделать это, перечислив сервисы и желаемое количество реплик в команде docker compose alpha scale.

docker compose alpha scale web=5 nginx=2

Эта команда масштабирует сервис web до 5 экземпляров и сервис nginx до 2 экземпляров.

После выполнения команды снова проверим работающие контейнеры.

docker ps

Теперь вы должны увидеть 5 контейнеров для сервиса web и 2 контейнера для сервиса nginx.

Это демонстрирует, как можно масштабировать несколько сервисов одной командой docker compose alpha scale, что делает управление масштабированием компонентов приложения более эффективным.

Масштабирование сервиса без запуска зависимостей

На этом шаге мы рассмотрим, как масштабировать конкретный сервис с помощью docker compose alpha scale без запуска его зависимостей. По умолчанию при масштабировании сервиса Docker Compose может также запускать или проверять работу его зависимостей. Однако бывают сценарии, когда требуется масштабировать только один сервис, не затрагивая другие.

Для демонстрации добавим зависимость к нашему сервису web. Мы добавим простой сервис базы данных, хотя в этом примере не будем реализовывать логику работы с БД в веб-приложении. Это нужно только для демонстрации концепции зависимостей.

Откроем файл docker-compose.yml в директории ~/project/my-web-app с помощью nano.

nano docker-compose.yml

Добавим новое определение сервиса для базы данных (например, простой образ postgres) и секцию depends_on для сервиса web.

version: "3.8"

services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./static:/usr/share/nginx/html

  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydatabase

Обновленный файл docker-compose.yml теперь включает сервис db с образом postgres:latest, а сервис web содержит строку depends_on: - db, указывающую на зависимость от сервиса db.

Сохраним файл docker-compose.yml и выйдем из nano (Ctrl+X, Y, Enter).

Теперь запустим сервисы с обновленной конфигурацией.

docker compose up -d

Docker Compose теперь также создаст и запустит сервис db, так как сервис web зависит от него.

Можно проверить работу всех сервисов с помощью docker ps.

docker ps

Вы должны увидеть контейнеры для web, nginx и db.

Теперь представим, что мы хотим масштабировать только сервис web до 4 экземпляров, не запуская и не затрагивая сервис db (если он не был запущен). Команда docker compose alpha scale по умолчанию учитывает зависимости. Однако для этого конкретного сценария, где мы хотим масштабировать только указанный сервис, стандартной команды docker compose alpha scale достаточно, так как она в первую очередь ориентирована на целевой сервис. Отношение depends_on в основном влияет на порядок запуска при использовании docker compose up. При использовании docker compose alpha scale фокус делается на изменении количества экземпляров указанного сервиса.

Масштабируем сервис web до 4 экземпляров.

docker compose alpha scale web=4

Эта команда масштабирует сервис web до 4 экземпляров. Она не будет явно запускать сервис db, если он не был запущен, но так как он был запущен предыдущей командой docker compose up, он останется работать. Ключевой вывод здесь — docker compose alpha scale предназначен для масштабирования указанного сервиса без обязательного запуска его зависимостей, если они не были запущены ранее.

Проверим количество работающих контейнеров сервиса web.

docker ps --filter "name=my-web-app-web"

Вы должны увидеть 4 контейнера для сервиса web. Контейнер сервиса db также должен оставаться запущенным.

Это демонстрирует, что docker compose alpha scale фокусируется на целевом сервисе при масштабировании.

Наконец, остановим все сервисы.

docker compose down

Эта команда остановит и удалит все контейнеры, сети и тома, созданные Docker Compose для этого проекта.

Итоги

В этой лабораторной работе мы научились подготавливать простой проект Docker Compose. Это включало установку Docker Compose в среде LabEx, проверку установки, а затем создание базового веб-приложения на Python Flask. Мы также создали Dockerfile для сборки Docker-образа приложения и файл requirements.txt для перечисления зависимостей приложения. Эта начальная настройка закладывает основу для изучения функциональных возможностей Docker Compose, с особым акцентом на масштабирование сервисов в последующих шагах.