Использование ресурсов с помощью остановленных контейнеров Docker

Докер позволяет легко останавливать и перезапускать контейнеры. Он также имеет возможность приостанавливать и затем останавливать контейнеры. Докеры docs заявляют

Когда контейнер выйдет, состояние файловой системы и ее значение выхода сохраняются. Вы можете запускать, останавливать и перезапускать контейнер. Процессы перезапускаются с нуля (их состояние памяти не сохраняется в контейнере), но файловая система так же, как и когда контейнер был остановлен.

Я проверил это, установив контейнер с запуском memcached, написал значение memcache и затем

  • Остановлен, а затем перезапущен контейнер - значение memcached прошло.
  • Приостановлено, а затем приостановлено действие контейнера - значение memcached все еще не установлено

Где-то в документах - я больше не могу найти точный документ - я читал, что остановленные контейнеры не потребляют процессор или память. Однако:

  • Я полагаю, что факт сохранения состояния файловой системы означает, что контейнер все еще занимает некоторое пространство в файловой системе хоста?
  • Есть ли поражение производительности (кроме потребления дискового пространства на хосте), связанное с наличием 10 или 100 столов остановленных контейнеров в системе? Например, затрудняет ли Docker запуск и управление новыми контейнерами?
  • И, наконец, если Paused контейнеры сохраняют свое состояние памяти, когда Unpaused - как продемонстрировано их способностью запоминать memcached ключи - оказывают ли они различное влияние на процессор и память?

Я был бы наиболее обязан всем, кто мог бы прояснить эти проблемы.

Ответы

Ответ 1

Я не эксперт о ядре докера, но я постараюсь ответить на некоторые из этих вопросов.

  • Я полагаю, что сохранение состояния файловой системы означает, что контейнер все еще занимает некоторое место в файле хоста система?

Да. Докер сохраняет все данные контейнера и изображения в /var/lib/docker. По умолчанию для сохранения данных контейнера и изображения используется aufs. Данные каждого слоя сохраняются в /var/lib/docker/aufs/diff. Когда создается новый контейнер, создается новый слой с папкой, и там сохраняются изменения со слоев исходного изображения.

  1. Есть ли поражение производительности (кроме потребления дискового пространства на хосте), связанное с тем, что 10 или 100 столов остановлено контейнеров в системе? Например, делает ли это труднее для Docker для запуска и управления новыми контейнерами?

Насколько я знаю, это не должно быть никакого удара. Когда вы останавливаете контейнер, демон докеров отправляет SIGTERM и SIGKILL ко всему процессу этого контейнера, как описано в документации docker CLI:

Использование: остановка докера [ОПЦИИ] КОНТЕЙНЕР [КОНТЕЙНЕР...]

Остановите запущенный контейнер, отправив SIGTERM, а затем SIGKILL после льготный период

-t, --time = 10 Количество секунд, чтобы дождаться, пока контейнер остановитесь, прежде чем убить его. Значение по умолчанию - 10 секунд.


3. Наконец, если приостановленные контейнеры сохраняют свое состояние памяти, когда     Unpaused - как продемонстрировано их умение запоминать memcached     ключи - оказывают ли они различное влияние на процессор и память?

Как сказал @Usman, докер реализует паузу/остановку, используя морозильник cgroup. Если я не ошибаюсь, когда вы помещаете процесс в морозильник (или его группу), вы блокируете выполнение новой задачи этого процесса из планировщика задач ядра (то есть: он останавливает процесс), но вы не выполняете убить их, и они продолжают потреблять память, которую они используют (хотя ядро ​​может переместить эту память для замены или сплошной диск). И ресурсы ЦП, используемые приостановленным контейнером, я считаю незначительными. Для получения дополнительной информации об этом я бы проверил запрос на тягу этой функции, Проблема докеры # 5948