Включение живого восстановления на docker не поддерживает контейнеры живыми - PullRequest
2 голосов
/ 08 января 2020

Я прочитал Включить Live Restore , но когда я попробовал.

ubuntu@ip-10-0-0-230:~$ cat /etc/docker/daemon.json 
{
  "live-restore": true
}

Я запустил контейнер nginx в отдельном режиме.

sudo docker run -d  nginx
c73a20d1bb620e2180bc1fad7d10acb402c89fed9846f06471d6ef5860f76fb5 


$sudo docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              

c73a20d1bb62        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 4 
seconds

Затем я остановил dockerd

sudo systemctl stop snap.docker.dockerd.service

и проверил, что не работает контейнер

ps aux | grep nginx

После этого я перезапустил службу docker и все равно не было любой контейнер.

Любая идея? Как работает это «включить живое восстановление»?

1 Ответ

2 голосов
/ 08 января 2020

Из документации после изменения daemon.json (добавление "live-restore": true) необходимо:

Перезапустить демон Docker. На Linux вы можете избежать перезапуска (и избежать простоев для ваших контейнеров), перезагрузив демон Docker. Если вы используете systemd, то используйте команду systemctl reload docker. В противном случае отправьте сигнал SIGHUP процессу dockerd.

Вы также можете сделать это, но это не рекомендуется:

Если вы предпочитаете, вы можете запустить процесс dockerd вручную с флагом --live-restore. Этот подход не рекомендуется, поскольку он не настраивает среду, которую systemd или другой менеджер процессов будут использовать при запуске процесса Docker. Это может вызвать неожиданное поведение.

Похоже, что вы не выполнили этот шаг . Вы сказали, что внесли изменения в daemon.json и сразу запустили контейнер, а затем остановили dockerd.

Чтобы заставить работать функциональность Live Restore, выполните все шаги в правильном порядке:

  1. Измените daemon.json, добавив "live-restore": true
  2. Перезагрузите Docker демон с помощью команды:

    sudo systemctl reload docker
    

Затем попробуйте функциональность с вашим примером (запустив контейнер и сделать демона недоступным).

Я проверял, и это работает, если вы выполните следующие шаги в следующем порядке:

LiveRestore

Протестировано с Docker version 19.03.2, build 6a30dfc и Ubuntu 19.10 (Eoan Ermine)

Вы установили Docker через оснастку : snap.docker.dockerd.service

К сожалению, не рекомендуется, поскольку модель оснастки не полностью совместима с Docker. Кроме того, docker -snap больше не поддерживается Docker, In c. Пользователи сталкиваются с некоторыми проблемами, когда они устанавливают Docker с помощью оснастки, см. 1 2

. Необходимо удалить установку оснастки Docker, чтобы избежать любых возможных проблем с установкой через эта команда:

sudo snap remove docker --purge

Затем установите Docker официальным способом и после этого попробуйте функциональность Live Restore, выполнив вышеуказанные шаги.

Также будьте осторожны при перезапуске демона, в документации сказано, что:

Оперативное восстановление при перезапуске

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

Также о времени простоя:

Влияние оперативного восстановления на работающие контейнеры

Если демон долгое время не работает, запущенные контейнеры могут заполнить журнал FIFO, который обычно читает демон. Полный журнал блокирует контейнеры от регистрации большего количества данных. Размер буфера по умолчанию составляет 64 КБ. Если буферы заполнены, вы должны перезапустить демон Docker, чтобы flu sh их.

На Linux, вы можете изменить размер буфера ядра, изменив /proc/sys/fs/pipe-max-size.

...