在 docker 上启用实时恢复并不能让容器保持活动状态

Ash*_*ani 5 ubuntu service docker snapcraft docker-daemon

我阅读了启用实时恢复,但是当我尝试它时。

\n
ubuntu@ip-10-0-0-230:~$ cat /etc/docker/daemon.json \n{\n  "live-restore": true\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我以分离模式启动了一个 nginx 容器。

\n
sudo docker run -d  nginx\nc73a20d1bb620e2180bc1fad7d10acb402c89fed9846f06471d6ef5860f76fb5 \n\n\n$sudo docker ps\n\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              \n \nc73a20d1bb62        nginx               "nginx -g \'daemon of\xe2\x80\xa6"   5 seconds ago       Up 4 \nseconds\n
Run Code Online (Sandbox Code Playgroud)\n

然后我停止了dockerd

\n
sudo systemctl stop snap.docker.dockerd.service\n
Run Code Online (Sandbox Code Playgroud)\n

我检查了没有容器在运行

\n
ps aux | grep nginx\n
Run Code Online (Sandbox Code Playgroud)\n

之后,我重新启动了 docker 服务,仍然没有任何容器。

\n

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

\n

Yan*_*ann 7

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

\n\n
\n

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

\n
\n\n

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

\n\n
\n

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

\n
\n\n

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

\n\n

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

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

    \n\n
    sudo systemctl reload docker\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
\n\n

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

\n\n

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

\n\n

实时恢复

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n
sudo snap remove docker --purge\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
\n

重启后实时恢复

\n\n

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

\n
\n\n

还有关于停机时间:

\n\n
\n

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

\n\n

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

\n\n

在 Linux 上,您可以通过更改 来修改 kernel\xe2\x80\x99s 缓冲区大小/proc/sys/fs/pipe-max-size

\n
\n

  • @Ashwani 我添加了一个示例(按顺序执行步骤)并且它有效。也许我们所处的环境不一样。我已经从[官方网站](https://docs.docker.com/install/linux/docker-ce/ubuntu/)安装了Docker。我注意到您有“snap.docker.dockerd.service”,也许可以尝试官方安装?因为 [docker-snap](https://github.com/docker/docker-snap) 不再由 Docker, Inc. 维护。 (2认同)