我正在使用Marathon来部署Docker容器化的node.js应用程序。我的Marathon应用规格如下:

 {
  "id": "<some-name>",
  "cmd": null,
  "cpus": 1,
  "mem": 2800,
  "disk": 30720,
  "instances": 1,
  "container": {
    "docker": {
      "image": "<some-docker-registry-IP>:5000/<repo>",
      "network": "BRIDGE",
      "privileged": true,
      "forcePullImage": true,
      "parameters": [
        {
          "key": "net",
          "value": "host"
        }
      ],
      "portMappings": [
        {
          "containerPort": <some-port>,
          "hostPort": <some-port>,
          "protocol": "tcp",
          "name": null
        }
      ]
    },
    "type": "DOCKER"
  }
}

但是,问题在于,一旦内存不足,这将导致重新启动部署了应用程序的服务器。我需要我的服务才能侦听主机的专用IP,这就是为什么我使用--net=host的原因。

是否有可能只是杀死任务以释放内存,以便Marathon可以重新生成它而无需重新启动/关闭服务器?还是有其他方法可以在不使用--net=host的情况下使Docker容器路由到外部?

最佳答案

基本上,我认为您的Node应用程序存在问题,如果它显示内存泄漏行为。那就是我要解决的第一点。

第二个是您应该在应用程序的Docker镜像中使用pm2之类的东西,当遇到问题时,它将负责重新启动应用程序(在容器本身中)。

此外,您可以实现Marathon health endpoint,以便Marathon可以识别该应用程序实际上有问题。

为了达到某种程度的冗余,我强烈建议您至少运行该应用程序的两个实例,并在公共(public)从属节点上使用Mesos DNS和负载均衡器(如marathon-lb),这将负责路由。如果需要,这还允许您使用桥接网络。

09-10 13:31
查看更多