首页 > 解决方案 > 在 docker 上启用实时恢复并不能保持容器存活

问题描述

我阅读了Enable 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 服务,但仍然没有任何容器。

任何想法?这个“启用实时恢复”是如何工作的?

标签: dockerubuntuservicesnapcraftdocker-daemon

解决方案


文档中,修改daemon.json(添加"live-restore": true)后,您需要:

重新启动 Docker 守护程序。在 Linux 上,您可以通过重新加载 Docker 守护程序来避免重新启动(并避免容器停机)。如果您使用 systemd,则使用命令 systemctl reload docker。否则,向 dockerd 进程发送 SIGHUP 信号。

您也可以这样做,但不建议这样做:

如果您愿意,可以使用 --live-restore 标志手动启动 dockerd 进程。不推荐这种方法,因为它没有设置 systemd 或其他进程管理器在启动 Docker 进程时将使用的环境。这可能会导致意外行为。

看来您还没有完成这一步。你说你对 进行了修改daemon.json,直接启动了一个容器,然后停止了dockerd.

为了使Live Restore功能正常工作,请按正确的顺序执行所有步骤:

  1. daemon.json通过添加修改"live-restore": true
  2. 使用以下命令重新加载 Docker 守护程序:

    sudo systemctl reload docker
    

然后使用您的示例尝试该功能(启动容器并使守护程序不可用)。

我已经测试过,如果您按顺序执行以下步骤,它就可以工作:

实时恢复

测试Docker version 19.03.2, build 6a30dfcUbuntu 19.10 (Eoan Ermine)

你已经通过snap安装了 Docker :snap.docker.dockerd.service

不幸的是,不建议这样做,因为snap 模型与 Docker 不完全兼容。此外,docker-snap不再由 Docker, Inc 维护。用户在通过 snap 安装 Docker 时会遇到一些问题,请参阅1 2

您应该通过以下命令删除 snap Docker 安装以避免任何潜在的重叠安装问题:

sudo snap remove docker --purge

然后以官方方式安装 Docker,然后Live Restore按照上述步骤 尝试该功能。

重新启动守护程序时也要小心,文档说:

重启时实时恢复

如果守护程序选项(例如网桥 IP 地址和图形驱动程序)未更改,则实时恢复选项仅适用于恢复容器。如果这些守护程序级别的配置选项中的任何一个已更改,则实时恢复可能无法正常工作,您可能需要手动停止容器。

还有关于停机时间:

实时恢复对运行容器的影响

如果守护程序长时间关闭,运行的容器可能会填满守护程序通常读取的 FIFO 日志。完整的日志会阻止容器记录更多数据。默认缓冲区大小为 64K。如果缓冲区已满,您必须重新启动 Docker 守护程序以刷新它们。

在 Linux 上,您可以通过更改/proc/sys/fs/pipe-max-size.


推荐阅读