如何在CoreOS中实现Docker容器重启后的自动重启?

41
假设Docker守护程序在操作系统重新启动时由任何类似于init.d或systemd的进程自动重新启动,那么重新启动一个或多个Docker容器的首选方法是什么?例如,我可能有一些Web服务器在反向代理或数据库服务器后面。
假设Docker守护程序由系统进程(如init.d或systemd)自动重新启动,则可以使用以下命令重新启动所有已停止的容器:
docker start $(docker ps -a -q)
要重启特定容器,请使用以下命令:
docker restart 或

1
其实,我对这个问题的确切相反情况很感兴趣:我为一个看起来正常工作的容器设置了restart=always,现在,在docker守护程序重新启动时,我似乎找不到关闭此特定容器的自动重启功能的方法! - tjborromeo
1
糟糕!我读到CoreOS团队更喜欢您使用fleet或systemd来实现重启。 - Richard
是的,似乎意味着我不应该在任何情况下使用docker内置的自动重启功能,因为对于任何你计划管理的设置,你需要灵活定义容器何时应该重新启动(以及docker守护进程何时应该重新启动)。这有点复杂,因为docker inspect命令似乎暗示重启属性一旦启动就是镜像的一部分(类似于暴露的端口)。因此,一旦您定义了自动重启属性,您就无法改变主意:( - tjborromeo
@tjborromeo 我使用 docker rm -f container 命令来移除容器并防止其自动重启。 - Yi Wang
@tjborromeo @YiWang 尝试在 docker run 之后使用 docker update --restart no [CONTAINER] 更改配置。 - Andrew Siplas
6个回答

34

如果使用docker -d -r启动守护进程,它将重新启动在守护进程停止之前正在运行的所有容器。 这将成为下一个版本的默认行为。


这意味着主机操作系统在运行容器时重新启动了,或者可能是系统崩溃了?如果是前者,那么这意味着Docker已经连接到各种关闭/重启信号? - Richard
7
当系统重新启动时,有可能在docker之前就会杀死容器。如果发生这种情况,容器将不会重新启动。Docker没有钩入关机/重启信号。 - creack
这之前是一个正确的答案,但经过审核发现有误。它缺少了 ACTION,可能是 RUN,然而 '-r' 不可用。 - Richard
该命令仍然有效,但现在已默认启用。由于它是一个守护进程标志,因此没有操作可执行。 - creack
8
有人能指引我关于容器在操作系统崩溃后重新启动的文档吗? - Dmitry Polushkin

14

对我来说有效的方法是在容器{run -d ...}命令中添加 --restart='always'


2
根据我对原问题的评论,我不知道在图像启动后如何更改这一点。因此,如果我想暂时禁用重新启动功能,并且最初没有指定'on-failure',我不知道有什么好办法阻止容器自动重新启动 :( 当我使用了我需要给另一个图像使用的端口时,这会造成困扰. . . - tjborromeo
是的,我遇到了一个问题,就是关于--restart='always'命令。因为当我最终想要禁止自动重新启动特定容器时,我怎么也找不到如何关闭该选项,除非删除容器! - tjborromeo
我不希望它总是运行。只有在计算机重启后才运行。我能做到吗? - canbax

14

由于我正在将所有服务迁移到CoreOS,因此现在似乎这是最好的选择。 - Richard
@Richard 即使对你来说是这样,我认为你仍然应该将creack的解决方案标记为最佳答案(对其他操作系统的人更有用)。 - michielbdejong
马克的回答不是错误的。我在提到CoreOS(虽然我没有具体提到它),但这已经被systemd和initd所暗示。自那时以来,已经有了新的更新方法可协同工作。 - Richard
仅仅像@creack的回答那样重新启动容器并不能满足容器启动顺序依赖关系。如果你有这方面的需求,你需要使用systemd服务文件来处理。 - hookenz
看起来这篇文章中的链接已经不存在了,你会被带到快速入门指南页面。我发现 https://coreos.com/os/docs/latest/getting-started-with-systemd.html 很有用。 - CamW

2
对于那些想要自动重启 Docker 容器,但在运行容器时没有指定 --restart 标志(默认为“no”的情况),您可以使用 docker update 命令添加以下三个选项之一:
  • on-failure
  • unless-stopped
  • always
有关详细信息,请参见此文章。对于遇到问题的人们,在考虑使用 always 重启标志的同时,也可以考虑使用 on-failureunless-stopped 选项。

1
我见过的唯一文档是Docker的主机集成文档,但细节方面有些欠缺等问题。
基本上,它建议使用-r=false启动守护进程,并使用systemd(如果你使用的不是CoreOS,则使用upstart)。

这个链接自2015年底以来就失效了,这是它的最新快照:https://web.archive.org/web/20151109053347/http://docs.docker.com/engine/articles/host_integration/ - Naktibalda
谢谢。已更新至 https://docs.docker.com/config/containers/start-containers-automatically/。 - docwhat

-1

使用RestartRestartSec使其正常工作:

# Restart after crash
Restart=on-failure
# Give the service 10 seconds to recover after the previous restart
RestartSec=10s

查看文档


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