防止在apt-get升级期间重启Docker-Engine

5
我在Ubuntu 14.04上遇到了问题。
每当我运行apt-get upgrade时,如果docker-engine可以升级,它会在升级后重新启动服务。这将导致容器重新启动。
其中一个容器需要在启动期间进行手动干预,其他容器正在收集时间关键数据,因此只在非常特定的时间重启容器。
如何将docker-engine服务排除在这些自动重启之外?
据我所知,例如mongodb在apt-get upgrade后不会重新启动mongod,为什么docker不能做同样的事情?
3个回答

4

我不是完全确定 MongoDB 的作用,但我非常确定它在更新时会自行重启。

Docker 引擎的问题不在于它没有自动重启,实际上它会在更新后自动重启,您可以通过运行以下命令进行验证:

sudo service docker status

只是它不会重新启动正在运行的容器。我不太清楚为什么要这样做,因为理论上它应该能够在服务重启后将正在运行的容器带回来,但出于某种原因,它没有这样做。

有两种方法可以解决这个问题。

第一种简单的方法是排除docker-engine的更新,并在发现可用时手动进行更新。

sudo apt-mark hold docker-engine
sudo apt-get upgrade

如果有更新并且更新被保留,您应该会看到一条通知。
...
The following packages were kept back:
docker-engine
...

如果您有容器,升级时无法重新启动它们,您应该选择这个方案。

然而,如果您可以承担重启它们的成本,您可以采用第二种方法。您可以在启动容器时设置重启策略,如下所示:

sudo docker run --restart=always -d image-name

当重新启动docker-engine时,容器也会随之启动。这意味着,在更新时,以此方式启动的容器会自动启动。

啊,好的,我忘记了重启的问题,因为在升级之前我会手动关闭所有东西,然后重启执行一个脚本,启动所有的容器。我想我需要sudo apt-mark docker-machine hold这句话。是docker-machine还是docker-engine? - Daniel F

1
这是deb包中预/后安装脚本的设计和构建软件包的人员的决定(尽管在apt.dockerproject.org上分析最新的jessie版本构建时,我没有看到停止控制文件,只有注册和启动)。最好的建议是在不能容忍任何停机时间时不要运行系统升级。通过在升级之前仅进行下载(apt-get upgrade -d),最小化升级所需的时间,然后在停机窗口期间开始升级。您还可以将docker-engine软件包保持不变,以便它不会被dselect自动升级,只需按下该软件包名称上的=即可。

1

做这件事的正确方法似乎是在Docker守护程序中使用live-restore选项:

https://docs.docker.com/config/containers/live-restore/

对于 Linux Docker 服务器(似乎您正在此处运行),您可以通过在 /etc/docker/daemon.json 中添加以下内容来启用守护进程的实时恢复:

{
  "live-restore": true
}

然后运行此命令以重新加载配置,而无需重新启动任何容器:

sudo service docker reload

完成后,您的apt upgrade不应该在重新加载升级守护程序时关闭任何容器,并且不应该引起任何问题,只要升级不是主要版本

最后一个警告非常重要,因为在容器运行时跨越主要版本边界升级docker守护程序可能会使其无法重新附加到容器上,这意味着您需要手动重新启动它们。我建议在升级之前观察新版本和任何主要版本,计划一些停机时间并停止容器。

总的来说,如果您使用此版本,则应更加注意和警惕您的版本和配置,因为版本和配置的同步将不会在升级时为您处理。

但对于docker-ce和相关软件包的标准升级,这似乎经常发生,到目前为止,这对我来说一直很有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接