每当我运行apt-get upgrade时,如果docker-engine可以升级,它会在升级后重新启动服务。这将导致容器重新启动。
其中一个容器需要在启动期间进行手动干预,其他容器正在收集时间关键数据,因此只在非常特定的时间重启容器。
如何将docker-engine服务排除在这些自动重启之外?
据我所知,例如mongodb在apt-get upgrade后不会重新启动mongod,为什么docker不能做同样的事情?
我不是完全确定 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
apt-get upgrade -d
),最小化升级所需的时间,然后在停机窗口期间开始升级。您还可以将docker-engine软件包保持不变,以便它不会被dselect自动升级,只需按下该软件包名称上的=即可。做这件事的正确方法似乎是在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
和相关软件包的标准升级,这似乎经常发生,到目前为止,这对我来说一直很有效。
sudo apt-mark docker-machine hold
这句话。是docker-machine还是docker-engine? - Daniel F