From 0c10c08403bb0aadc66d4cc6eda7c1b7d1e408fa Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Wed, 30 Oct 2024 16:53:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B5=D0=B7=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=82=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=20docker-compose?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docker/Healthcheck в docker-compose.md | 43 +++++++++++++ ...апуск нескольких реплик в docker-compose.md | 34 ++++++++++ .../Ограничение ресурсов в docker-compose.md | 55 ++++++++++++++++ .../Установка Docker и Docker Compose.md | 2 +- .../nginx/Балансировка нагрузки в Nginx.md | 63 +++++++++++++++++++ meta/zero/00 Docker Compose.md | 15 +++++ meta/zero/00 Docker.md | 2 +- meta/zero/00 Nginx.md | 3 +- 8 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 dev/devops/docker/Healthcheck в docker-compose.md create mode 100644 dev/devops/docker/Запуск нескольких реплик в docker-compose.md create mode 100644 dev/devops/docker/Ограничение ресурсов в docker-compose.md create mode 100644 dev/devops/nginx/Балансировка нагрузки в Nginx.md create mode 100644 meta/zero/00 Docker Compose.md diff --git a/dev/devops/docker/Healthcheck в docker-compose.md b/dev/devops/docker/Healthcheck в docker-compose.md new file mode 100644 index 00000000..03ce5c58 --- /dev/null +++ b/dev/devops/docker/Healthcheck в docker-compose.md @@ -0,0 +1,43 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-10-30 +--- +Для проверки работоспособности запущенного контейнера можно задать команду `healthcheck`. Контейнер не будет считаться полностью запущенным, пока не выполнится проверка работоспособности. Это особенно полезно при запуске нескольких контейнеров, которые зависят друг от друга. Например, если один контейнер должен быть готов до того, как будет запущен другой. + +Пример конфигурации: +```yaml +services: + database: + image: postgres:latest + container_name: database + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 5s + retries: 3 + + webapp: + image: my-webapp:latest + container_name: webapp + depends_on: + database: + condition: service_healthy + ... +``` + +В этом примере контейнер с веб-приложением (`webapp`) зависит от контейнера с базой данных (`database`). Команда healthcheck для базы данных проверяет, готова ли PostgreSQL принимать подключения (`pg_isready`), и контейнер будет считаться здоровым только после успешного выполнения этой проверки. +*** +## Мета информация +**Область**:: [[../../../meta/zero/00 Docker Compose|00 Docker Compose]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-10-30]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/devops/docker/Запуск нескольких реплик в docker-compose.md b/dev/devops/docker/Запуск нескольких реплик в docker-compose.md new file mode 100644 index 00000000..04a50542 --- /dev/null +++ b/dev/devops/docker/Запуск нескольких реплик в docker-compose.md @@ -0,0 +1,34 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-10-30 +--- +Добавив всего пару строк в конфигурацию, вы можете запустить несколько экземпляров вашего приложения ([[../../architecture/highload/Горизонтальное масштабирование|Горизонтальное масштабирование]]). + +``` +services: + my-service: + ... + ports: + - 8080-8082:8080 + deploy: + replicas: 3 +``` + +> [!Note] Балансировка нагрузки +> Docker не выполняет автоматическое распределение нагрузки между репликами, поэтому важно настроить балансировку с помощью внешних инструментов, таких как nginx ([[../nginx/Балансировка нагрузки в Nginx|Балансировка запросов на Nginx]]). Это необходимо для того, чтобы равномерно распределять запросы между репликами и обеспечить более стабильную работу приложения. + +*** +## Мета информация +**Область**:: [[../../../meta/zero/00 Docker Compose|00 Docker Compose]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-10-30]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/devops/docker/Ограничение ресурсов в docker-compose.md b/dev/devops/docker/Ограничение ресурсов в docker-compose.md new file mode 100644 index 00000000..bf46a11c --- /dev/null +++ b/dev/devops/docker/Ограничение ресурсов в docker-compose.md @@ -0,0 +1,55 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-10-30 +--- +Используя ограничения на CPU и RAM, вы можете проводить локальное нагрузочное тестирование и наблюдать, как сервис будет работать в условиях, близких к реальным. + +Синтаксис ограничения ресурсов в файле docker-compose.yml может отличаться в зависимости от версии файла, указанной в первой строке. Вот пример для версии 3.7: + +```yaml +version: ‘3.7’ + +services: + my-service: + ... + deploy: + resources: + limits: + cpus: '2' + memory: '256M' +``` + +Важно помнить, что ограничение памяти контейнера не означает автоматического ограничения памяти для JVM. По умолчанию JVM использует не более 1/4 от доступной памяти системы, но не менее 128 MB. Таким образом, если контейнеру выделено 512 MB памяти, Java будет использовать только 128 MB, что приведет к неэффективному использованию оставшихся ресурсов. Чтобы этого избежать, следует явно задавать объем доступной памяти для JVM. + +Кроме того, в Docker можно использовать не только `limits` для задания максимального количества ресурсов, но и `reservations` для задания минимальных гарантированных ресурсов, которые будут выделены для контейнера. Например: + +```yaml +services: + my-service: + ... + deploy: + resources: + limits: + cpus: '2' + memory: '256M' + reservations: + cpus: '1' + memory: '128M' +``` + +Параметры `reservations` позволяют гарантировать минимально необходимое количество ресурсов для стабильной работы приложения, что особенно полезно при работе в условиях ограниченных вычислительных мощностей. +*** +## Мета информация +**Область**:: [[../../../meta/zero/00 Docker Compose|00 Docker Compose]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-10-30]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/devops/docker/Установка Docker и Docker Compose.md b/dev/devops/docker/Установка Docker и Docker Compose.md index 7043faad..eb5819c2 100644 --- a/dev/devops/docker/Установка Docker и Docker Compose.md +++ b/dev/devops/docker/Установка Docker и Docker Compose.md @@ -45,7 +45,7 @@ Docker Compose 2.2.3 *** ## Мета информация -**Область**:: [[../../../meta/zero/00 Docker|00 Docker]] +**Область**:: [[../../../meta/zero/00 Docker|00 Docker]], [[../../../meta/zero/00 Docker Compose|00 Docker Compose]] **Родитель**:: **Источник**:: **Автор**:: diff --git a/dev/devops/nginx/Балансировка нагрузки в Nginx.md b/dev/devops/nginx/Балансировка нагрузки в Nginx.md new file mode 100644 index 00000000..4c09bad4 --- /dev/null +++ b/dev/devops/nginx/Балансировка нагрузки в Nginx.md @@ -0,0 +1,63 @@ +--- +aliases: + - Балансировка запросов на Nginx +tags: + - maturity/🌱 +date: 2024-10-30 +--- +Блок `upstream` используется для указания списка серверов, между которыми nginx будет распределять входящие запросы, тем самым обеспечивая [[../../../../../_inbox/Балансировка нагрузки|балансировку нагрузки]]. В блоке `upstream` перечисляются серверы, между которыми будет распределяться нагрузка. + +```nginx +upstream myapp { + server server1.example.com; + server server2.example.com; + server server3.example.com; +} +``` + +Затем настройте блок `server`, чтобы перенаправлять запросы к вашему блоку `upstream`. В блоке `server` используйте директиву `proxy_pass` внутри `location`, как показано ниже: + +```nginx +server { + listen 80; + + location / { + proxy_pass http://myapp; + } +} +``` +## Метод балансировки +Nginx поддерживает несколько методов балансировки нагрузки, включая round-robin (по умолчанию), least-connected и ip-hash. Вы можете выбрать нужный метод, добавив соответствующую директиву в блок `upstream`. + +```nginx +upstream myapp { + least_conn; + server server1.example.com; + server server2.example.com; + server server3.example.com; +} +``` +## Резервные сервера +Чтобы повысить отказоустойчивость, можно добавить резервные серверы, к которым будут перенаправляться запросы, если основные серверы недоступны: + +```nginx +upstream myapp { + server server1.example.com; + server server2.example.com; + server server3.example.com; + server backup.example.com backup; +} +``` +*** +## Мета информация +**Область**:: [[../../../meta/zero/00 Nginx|00 Nginx]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-10-30]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/meta/zero/00 Docker Compose.md b/meta/zero/00 Docker Compose.md new file mode 100644 index 00000000..ab83fe8a --- /dev/null +++ b/meta/zero/00 Docker Compose.md @@ -0,0 +1,15 @@ +--- +aliases: + - Docker Compose +date: 2024-10-30 +parents: + - "[[00 Docker|00 Docker]]" +tags: + - type/zero-link +--- + +- [[../../dev/devops/docker/Установка Docker и Docker Compose|Установка Docker и Docker Compose]] +## Полезное +- [[../../dev/devops/docker/Ограничение ресурсов в docker-compose|Ограничение ресурсов в docker-compose]] +- [[../../dev/devops/docker/Запуск нескольких реплик в docker-compose|Запуск нескольких реплик в docker-compose]] +- [[../../dev/devops/docker/Healthcheck в docker-compose|Healthcheck в docker-compose]] \ No newline at end of file diff --git a/meta/zero/00 Docker.md b/meta/zero/00 Docker.md index d95db0ca..1736538f 100644 --- a/meta/zero/00 Docker.md +++ b/meta/zero/00 Docker.md @@ -11,7 +11,7 @@ title: Docker Обычно docker запускается от root пользователя. -- [Установка Docker и DockerCompose](../../../../_inbox/Установка%20Docker%20и%20DockerCompose.md) +- [[../../dev/devops/docker/Установка Docker и Docker Compose|Установка Docker и Docker Compose]] - [Команды Docker](Команды%20Docker.md) - [Dockerfile](../../dev/devops/docker/Dockerfile.md) - [Docker Network](../../dev/devops/docker/Docker%20Network.md) diff --git a/meta/zero/00 Nginx.md b/meta/zero/00 Nginx.md index 7a39c1c3..73758e1e 100644 --- a/meta/zero/00 Nginx.md +++ b/meta/zero/00 Nginx.md @@ -29,12 +29,13 @@ ps aux | grep nginx - [Оптимизация работы соединений Nginx](Оптимизация%20работы%20соединений%20Nginx.md) - [Кэширование на стороне Nginx](../../dev/devops/nginx/Кэширование%20на%20стороне%20Nginx.md) - [Кэширование статики в Nginx](../../dev/devops/nginx/Кэширование%20статики%20в%20Nginx.md) -- [Балансировка запросов на Nginx](Балансировка%20запросов%20на%20Nginx.md) +- [Балансировка нагрузки в Nginx](../../dev/devops/nginx/Балансировка%20нагрузки%20в%20Nginx.md) - [GZIP сжатие в Nginx](../../dev/devops/nginx/GZIP%20сжатие%20в%20Nginx.md) ## Дополнительные материалы - [Оптимизация NGINX](https://struchkov.dev/blog/ru/nginx-optimization/) - [Масштабируемая конфигурация nginx](https://highload.guide/blog/scalable-configuration-nginx.html) +- [[../../dev/devops/nginx/Балансировка нагрузки в Nginx|Балансировка запросов на Nginx]] ## Заметки - Есть какой-то модуль, который позволяет отправлять события в [00 Kafka](00%20Kafka.md) \ No newline at end of file