题 如何在系统启动时自动启动docker容器?


在系统启动时自动启动docker容器的好方法是什么?

有没有一种在Ubuntu 14.04上执行此操作的首选方法?

我用过 supervisord 在过去自动启动网络应用程序。但这对Docker来说并不合适。


99
2017-10-02 14:25






答案:


显然,当前自动启动Docker容器的方法(来自Docker 1.2)是用 重启政策。这将控制Docker在启动时如何处理容器的启动以及在容器退出时重新启动容器。到目前为止,我已经使用了'always'选项,并且可以确认它使Docker在系统启动时自动启动容器:

sudo docker run --restart=always -d myimage

文档摘录

重启策略使用Docker上的--restart标志运行即可   为容器应该或不应该如何指定重启策略   退出时重新启动。

否 - 退出时不要重新启动容器。

on-failure - 仅当容器以非零方式退出时才重新启动容器   退出状态。

always - 无论退出状态如何,始终重新启动容器。

您还可以指定Docker尝试的最大次数   使用故障时策略时重新启动容器。默认是   Docker将永远尝试重启容器。

$ sudo docker run --restart=always redis

这将运行redis   容器的重启策略总是如此容器   退出,Docker将重启它。

$ sudo docker run --restart=on-failure:10 redis

这将运行   redis容器,其重启策略为on-failure和maximum   重启次数为10.如果redis容器以非零退出退出   状态连续超过10次Docker将中止尝试重启   容器。提供最大重启限制仅适用于   失败政策。


120
2017-12-07 20:18



“总是 - 无论退出状态如何,总是重新启动容器”有点令人困惑。如果您手动退出/停止容器,它将不会重新启动容器,这是我正在寻找的行为。 - w00t
真棒!谢谢,现在试试吧。 - zx1986
注意:另一个政策叫做 unless-stopped 加入。它的行为就像 always 但是如果容器已停止并且系统重新启动或docker守护程序重新启动,则容器将不会重新启动。请参阅此处,了解所有4个选项 blog.codeship.com/... - David Morales
当然, docker 守护进程必须自动启动才能支持此功能。 - sherrellbc


Docker有 这一页 这解释了如何使用upstart和systemd。我同意这对Docker来说似乎不对。他们的解决方案是运行 docker start,假设您已经创建了容器。我想你会做的 docker run --rm 在upstart脚本中(将其视为一个全新的进程和映像中的容器)或者让docker守护进程在启动时重启容器本身(如果你不做任何其他操作,默认情况下会这样做)。 Upstart具有允许轻松启动/停止进程的优势,但您也可以通过docker的启动/停止来实现!

我认为在upstart脚本工作之前强制用户手动创建容器(具有所有正确的端口/卷绑定)是很奇怪的。


7
2017-10-14 04:49





但这对Docker来说并不合适。

为什么不?

我使用supervisord取得了巨大的成功。

使用您所知道的,使用有效的方法,使用您可以轻松维护和理解的内容。


4
2017-10-02 14:27



谢谢@EEAA ..这是否意味着你在非守护进程模式下运行它们?这不意味着你需要运行它们 --rm ? - Stefan Arentz
我以前台模式运行容器,让supervisord捕获stdout / stderr。我不知道为什么 --rm 在这里是相关的。 - EEAA
@EEAA:关于你的问题:对某些人来说, docker 是一个替代品 lxc 要么 openvz 其中有 lxc.start.auto = 1 和 vzctl set --onboot yes。此外,ESXi和其他虚拟化解决方案也包含此功能。与Lawrence一样,我也不认为这样的自动启动功能应该以特定于发行版的方式实现,因为docker用户应该能够在每个平台上以相同的知识解决相同的问题。 - Daniel Alder
是的,Docker是将主机与运行容器分离的好方法,因此使用特定于主机的配置有点倒退。 - nijave