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


Answers:


136

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

sudo docker run --restart=always -d myimage

文档摘录

重新启动策略使用Docker运行时的--restart标志,您可以为容器在退出时应如何重启的方式指定重启策略。

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

失败时-仅在退出状态为非零时退出容器。

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

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

$ sudo docker run --restart=always redis

这将以始终为重启策略的方式运行redis容器,以便如果容器退出,则Docker将重新启动它。

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

这将以重新启动策略失败(on-failure)且最大重新启动次数为10的方式运行redis容器。如果redis容器连续以非零退出状态退出10次以上,则Docker将中止尝试重新启动容器的操作。提供最大重启限制仅对失败策略有效。


12
“总是-无论退出状态如何,总是重新启动容器”有点令人困惑。如果您手动退出/停止容器,它将不会重新启动容器,这是我一直在寻找的行为。
w00t 2015年

12
注意:unless-stopped添加了另一个策略。它的行为类似于always但如果容器停止并且系统重新启动或docker daemon重新启动,则容器将不会重新启动。看到这里所有的4个选项中的一个很好的写了blog.codeship.com/...
大卫·莫拉莱斯

4
当然,docker守护程序必须自动启动以支持此功能。
sherrellbc

我认为问题是在“在系统启动时”询问,这意味着在物理或虚拟服务器重新启动后,假设Docker引擎在服务器重新启动后已完全运行,那么容器如何自动重新启动?
根循环

8

Docker的页面说明了如何使用upstart和systemd进行操作。我同意,对于Docker来说似乎不合适。他们的解决方案是运行docker start,它假定您已经创建了容器。我认为您可以docker run --rm在upstart脚本中进行处理(就像从映像中处理全新的进程和容器一样),或者只是让docker daemon在启动时重新启动容器本身(默认情况下,如果您不执行其他任何操作,它将重新启动容器) )。Upstart具有允许轻松启动/停止进程的优点,但是您也可以通过docker的启动/停止来实现!

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


链接已断开... 似乎是一个可能的替换,但它当然没有显示“如何”
Gert van den Berg

谢谢,我已经将链接固定到相似的页面,但是不能确定它表示的内容与原始内容相同。
劳伦斯·凯斯特洛特

6

但这对于Docker来说并不正确。

为什么不?

我为此成功使用了supervisor。

使用您知道的东西,使用有效的东西,使用可以轻松维护和理解的东西。


感谢@EEAA ..这是否意味着您在非守护程序模式下运行它们?这还不是意味着您需要使用它们--rm吗?
Stefan Arentz,2014年

我在前台模式下运行容器,并让supervisor捕获stdout / stderr。我不确定为什么--rm在这里有意义。
EEAA 2014年

@EEAA:关于你的问题:对于一些人来说,docker是进行更换lxcopenvz具有lxc.start.auto = 1vzctl set --onboot yes。ESXi和其他虚拟化解决方案也包含此功能。像劳伦斯一样,我也不认为这种自动启动功能应该以特定于发行版的方式实现,因为码头用户应该能够在每个平台上以相同的知识来解决相同的问题。
丹尼尔·奥尔德

1
正确,Docker是将主机与正在运行的容器分离的一种好方法,因此使用特定于主机的配置会有些倒退。
nijave
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.