Docker swarm 部署需要时间并导致容器终止服务

Docker swarm deployment takes time and causes container to kill the service

我一直在试验 docker。作为其中的一部分,我一直在使用一个简单的 spring-boot 应用程序,

https://github.com/siva54/simpleusercontrol

当我在一个简单的 docker 容器中 运行 应用程序时,我看到应用程序日志显示以下行,

2017-07-03 02:27:25.388 INFO 5 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 4963 ms

但是当我运行和docker swarm做同样的事情时,应用程序占用了更长的时间,

2017-07-03 00:32:56.483 INFO 5 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 48699 ms

应用程序也没有启动,而是在日志中(docker 日志 <>),我确实看到了一个字符串值 "Killed"。我猜这可能是由于时间太长, docker 上的超时设置可能会终止该服务。

任何人都可以帮我设置超时或修复应用程序,以免花费那么多时间。

请在下面找到 link 了解更多信息,

Docker 版本:Docker 版本 17.06.0-ce,构建 02c1d87

Docker文件 (https://github.com/siva54/simpleusercontrol/blob/master/Dockerfile)

Docker 撰写 (https://github.com/siva54/simpleusercontrol/blob/master/docker-compose.yml)

如果有人想试用我的应用程序,您可以使用 "siva54/simpleusercontrol" 提取该图像。

如果您可以启动应用程序并找到适合您的 link (localhost:8080/swagger-ui.html#/),那应该可以。

以下用于运行群,

初始化集群

docker swarm init

运行 申请

docker stack deploy -c docker-compose.yml app1

下面的都习惯了运行没有swarm,

docker run siva54/simpleusercontrol

所有这些都是在使用 vagrant 创建的图像上完成的。

这里有两件事让我印象深刻。

  1. 日志中的 Killed 消息通常是由 Linux 内核 OOM 杀手生成的。我会检查主机上 dmesg 的输出,可能还会检查 docker ps -adocker service lsdocker stack ls 以查看它们是否显示任何调度或退出代码错误。这可能表明主机没有足够的内存(例如,如果主机只有 512 MB 内存,则应用程序 + 主机 OS 可能超出限制)。
  2. docker-compose.yml 您 link 定义了 128 MB 的内存限制。但是当我 运行 从该图像启动一个常规容器时,它正在使用大约 345 MB 只是闲置。我猜测 128 MB 的限制导致 JVM 垃圾收集器超时工作,导致应用程序启动时间变慢。它也可能是 OOM 杀手杀死应用程序的原因。我会尝试将内存限制提高到 512 MB。