Ограничение использования ресурсов хоста в Docker составляет без роя

Я просто хочу ограничить ресурсы некоторых контейнеров Docker в файле файле-докере. Причина проста: на хосте работает несколько приложений/служб. Поэтому я хочу избежать, чтобы один контейнер мог использовать, например. всю память, которая вредит другим контейнерам.

Из документов, которые я узнал, это можно сделать, используя resources. Но это выше deploy. Поэтому я должен написать свой файл для создания докеры, как в следующем примере:

  php:
    image: php:7-fpm
    restart: always
    volumes:
      - ./www:/www
    deploy:
      resources:
        limits:
          memory: 512M

Это дало мне предупреждение:

ПРЕДУПРЕЖДЕНИЕ. Некоторые службы (php) используют ключ "deploy", который будет игнорироваться. Compose не поддерживает развертывание конфигурации - используйте docker stack deploy для развертывания в рой.

И это кажется правдой: docker stats подтверждает, что контейнер может использовать весь ram от хоста.

В документации написано:

Укажите конфигурацию, связанную с развертыванием и запуском служб. Это только вступает в силу при развертывании в рой с развертыванием стека докеров и игнорируется приложением docker-compose up и docker-compose.

Но мне не нужна кластеризация. По-видимому, нет другого способа ограничить ресурсы, используя файл-докер-композитор. Почему невозможно указать какой-то тэг memory, такой как start-parameter в docker run?

Пример: docker run --memory=1g $imageName

Это отлично работает для одного контейнера. Но я не могу использовать это (по крайней мере, не нарушая чистое разделение проблем), так как мне нужно использовать два разных контейнера.

Изменить: временное решение Temp

Я узнал, что я могу использовать mem_limit непосредственно после понижения с версии 3 до версии 2 (размещение version: '2' сверху). Но в настоящее время мы находимся на версии 3.1, поэтому это не долгое решение. И документы говорят, что deploy.resources является новой заменой для тегов v2, таких как mem_limit.

Когда-нибудь, версия 2 устарела. Таким образом, управление ресурсами больше не возможно с последними версиями, по крайней мере, без роя? Кажется, ухудшение для меня, не может верить в это...

Ответ 1

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

Документация Docker содержит здесь "примечание" https://docs.docker.com/engine/swarm/swarm-tutorial/#three-networked-host-machines

Ответ 2

Так как многие пользователи Docker Compose жаловались на эту несовместимость compose v3 vs v2, команда разработала режим совместимости.

Вы можете сохранить ту же структуру развертывания, которую вы указали, и она не будет проигнорирована, просто добавив флаг --compatibility в команду docker-compose (docker-compose --compatibility up), как описано здесь. Я проверил это с версией 3.5 и проверил статистику докера и могу подтвердить, что это работает.