Хочешь, чтобы твой API обрабатывал больше запросов? Или нужно поднять несколько воркеров параллельно? Всё это можно сделать одной командой:
docker compose up --scale <сервис>=<кол-во>
Как это работает
Команда "--scale" запускает несколько контейнеров одного сервиса по конфигурации "docker-compose.yml":
docker compose up --scale api=3
Создаст 3 независимых контейнера api, которые используют один и тот же образ, переменные, порты и т.д.
Варианты использования
Пример docker-compose.yml:
version: "3.8"
services:
api:
image: myapp:latest
build: .
ports:
- "8000"
Важно: если nginx поднят в докере и в одной сети с апи, то порт не должен быть жёстко задан как "8000:8000", иначе только один контейнер сможет его занять. Используй:
ports:
- "8000"
А в nginx конфиге:
upstream backend {
server api:8000;
server api:8001;
server api:8002;
}
Обычно внутри Docker все контейнеры сервиса находятся под одним именем (например, api), и Docker DNS сам решает, кому из них отдать запрос (round-robin). Если же nginx вне докер сети, то в docker-compose.yml нужно прописать все порты:
ports:
- "8001:8000"
- "8002:8000"
- "8003:8000"
И затем настроить nginx конфиг так:
upstream backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Теперь Nginx равномерно распределяет входящие запросы между 3 контейнерами, которые слушают на разных портах.
Ограничения и подводные камни
1) Порты: нужно либо жестко прописывать порты для каждого инстанса, либо не прописывать порты жестко вообще при масштабировании;
2) Состояние контейнеров не сохраняется — это одинаковые инстансы, а не кластеры;
3) Не путай с кластеризацией — это просто локальное масштабирование;
Про полноценную кластеризацию через Docker Swarm будет в одном из следующих постов :)
LinuxCamp | #devops #docker