docker - Marathon 不会启动 docker 容器

标签 docker mesos marathon mesosphere

我有一个 1/1 主/从设置,从有 8GB RAM 8 个 CPU。我正在尝试使用 marathon 部署一个具有 1gb mem 和 1 cpu 的 docker 容器,但它只是卡在等待

我相信这通常是由于 marathon 没有获得任务所需的资源造成的 当我查看日志时,我看到

Sending 1 offers to framework 8bb1a298-cc23-426e-ad43-d440a2a560c4-0000 (marathon) at [email protected]:52016 I0127 23:07:37.396546 2471 master.cpp:3297] Processing DECLINE call for offers: [ 5271fcb3-4d77-4b12-af85-d94fd9172514-O127 ] for framework 8bb1a298-cc23-426e-ad43-d440a2a560c4-0000 (marathon) at [email protected]:52016 I0127 23:07:37.396917 2466 hierarchical.cpp:744] Recovered cpus(​):6; mem(​):5968; disk(​):156020; ports(​):[31000-31056, 31058-32000] (total: cpus(​):8; mem(​):6992; disk(​):156020; ports(​):[31000-32000], allocated: cpus(​):2; mem(​):1024; ports(*):[31057-31057]) on slave 8bb1a298-cc23-426e-ad43-d440a2a560c4-S0 from framework 8bb1a298-cc23-426e-ad43-d440a2a560c4-0000

看来马拉松正在拒绝它收到的报价?日志中的下一行说 mesos 正在回收提供的资源,它的回收看起来对我的任务来说足够了吗?

关于如何进一步解决这个问题有什么想法吗?

编辑:所以必须进一步深入研究并找到马拉松日志。

如果我们不在 marathon docker 部分中输入任何端口映射信息,则部署基本上可以正常工作。 docker 容器部署成功,我可以从其主机成功 ping 它,但无法从其他地方访问它。

如果我们将容器端口设置为 8081(这是 docker 容器公开的应用程序监听的端口),我们将在部署过程中取得进一步进展,但容器内的应用程序无法构建并出现错误

Error: listen EADDRINUSE :::8081 at Object.exports._errnoException (util.js:856:11) at exports._exceptionWithHostPort (util.js:879:20) at Server._listen2 (net.js:1234:14) at listen (net.js:1270:10) at Server.listen (net.js:1366:5) at EventEmitter.listen (/usr/src/app/node_modules/express/lib/application.js:617:24) at Object. (/usr/src/app/index.js:16:18) at Module._compile (module.js:425:26) at Object.Module._extensions..js (module.js:432:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:313:12) at Function.Module.runMain (module.js:457:10) at startup (node.js:138:18) at node.js:974:3

所以我认为我们比以前进步了,但我们仍然遇到一些端口问题。我不知道为什么容器可以在没有端口设置的 marathon 中成功构建,但在有端口设置的 marathon 中却不能成功构建

最佳答案

有几件事需要检查:

  1. 你的奴隶:ps aux | grep sbin/mesos-slave 应包含类似以下内容:

    --containerizers=docker,mesos --executor_registration_timeout=5分钟

  2. 再次在从属设备上检查是否有 Docker 守护进程正在运行:

    ps aux | grep“docker 守护进程”

  3. 确保您已将 Docker 网络(在 Marathon 中)配置为 BRIDGE。使用 HOST 模式,您可能会与主机上已使用的端口发生冲突。这将允许映射 slave:32001 -> docker:8080

    ...
    "network": "BRIDGE",
    "portMappings": [
      {
        "containerPort": 8080,
        "hostPort": $PORT0,
        "protocol": "tcp"
      }
    ],
    ...
    
  4. 当任务在 Marathon 中启动时,您将看到类似 myapp.a72db5b0-ca16-11e5-ba5f-fea9945fabaf 的应用 ID。使用 Mesos CLI (pip install mesos.cli mesos.interface) 获取日志。有一个类似于 Unix 的 tail 的命令,用于获取 stdout 日志(-f 跟随日志):

    mesos tail -f -i myapp.a72db5b0-ca16-11e5-ba5f-fea9945fabaf
    

    stderr:

    mesos tail -f -i myapp.a72db5b0-ca16-11e5-ba5f-fea9945fabaf stderr
    

    -i 允许您从非事件任务获取日志(以防任务快速崩溃)。如果您在 Marathon 中没有捕获 ID,请使用 mesos ps -i

  5. 如果任务未开始,则可能是资源不足或 Marathon 出现问题。将浏览器导航到 http://{marathon URI:8080]/logging 并增加任务分配的详细程度。然后检查马拉松日志。

关于docker - Marathon 不会启动 docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35050202/

相关文章:

mesos - Marathon 以状态 1 退出

docker - 不允许使用 docker + systemctl 操作 systemctl

jenkins - Docker 中的 Docker 权限错误

docker - GKE中发生节点自动伸缩时如何获取通知

docker - 如何在马拉松规范上设置 docker run 参数

docker - 使用 Docker Compose 构建 Apache Mesos 集群

docker - 在Docker v.18.09.3中,如何在停止docker之前使用SystemD运行docker命令

kubernetes - 对于应用程序开发人员来说,在 Kubernetes 中运行应用程序意味着什么?

docker - 在 BRIDGE 模式下运行 Chronos docker 镜像

docker - 设置Mesos/Marathon给定的Docker容器名称