【问题标题】:All containers inside a digital ocean droplet stop数字海滴内的所有容器都停止
【发布时间】:2016-03-17 13:09:25
【问题描述】:

我有一个 Digital Ocean droplet,我在其中运行 4 个容器,每个容器都有一个小型 python 应用程序。

有时(一两周一次),所有容器都会停止工作。这不是由它们内部的 python 应用程序引起的。

我制作了一个 systemd 计时器,它每 30 分钟执行一次 bash 脚本来检查容器是否正在运行,如果没有,则启动它们。 计时器工作了好几天,它从来不需要重新启动容器。

但是,有一天我 ssh 到我的 droplet 并看到容器已停止 - 并且 systemctl list-timers --all 告诉我计时器从系统计时器中消失了!它已经不存在了!

容器检查脚本正在写入日志,并且在容器停止的同时日志也停止了。

问题:

  1. 如何确定是什么阻止了我的容器?

  2. 系统计时器怎么可能就消失了?

  3. 我该如何解决这个问题?

我是唯一一个可以 ssh 到那个 droplet 的人,所以其他人不能搞砸。

【问题讨论】:

  • 你知道你的容器是否能在重启后存活下来吗?也就是说,它们是与 systemd 单元相关联,还是您手动运行它们? CoreOS 会在检测到需要的安全或关键更新时自行重启,因此如果您的系统没有自动重启,重启可以解释神秘消失的原因。
  • 不,它们无法在重新启动后存活,我手动运行它们。如何将它们与系统单元相关联,以便它们能够在重新启动后继续存在?
  • 我在下面添加了一个答案。希望对您有所帮助!

标签: docker digital-ocean systemd coreos


【解决方案1】:

当新版本的操作系统可用时,CoreOS 集群会自行重启。这意味着如果您在 CoreOS 机器上手动启动一个进程,它可能会在某个时候消失。

好消息是,有一种标准方法可以在 CoreOS 上运行进程,当机器运行时会恢复正常 - 也就是说,您可以使用 systemd 单元。 CoreOS 在这里描述了单位是什么以及如何使用它们:https://coreos.com/docs/launching-containers/launching/getting-started-with-systemd/

简而言之,您可以通过三个步骤创建自己的单位:

将具有特殊格式的文件放在 /etc/systemd/system 中 - 最简单的可能类似于

[Unit]
Description=MyApp
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker run mycontainer

[Install]
WantedBy=multi-user.target

然后,您需要设置您的系统,以便它可以读取该文件(并运行您的容器)

$ sudo systemctl enable foo.service
$ sudo systemctl start hello.service

链接中的文档有更多详细信息(我强烈建议您在继续之前先看一下它 - 它很短!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2018-05-15
    • 1970-01-01
    • 2018-01-03
    • 2016-02-21
    相关资源
    最近更新 更多