【发布时间】:2016-04-08 09:48:03
【问题描述】:
当我的 Swarm 集群中只有 1 个节点并且尝试在该节点上重新创建我的 Web 应用程序容器时(我想部署我的 Node.JS Web 应用程序的新版本,它是监听 80 端口)
问题是 Swarm 首先停止旧容器,但不删除它,然后尝试创建新容器,因为 Swarm 也会跟踪停止容器的端口限制,它认为我节点上的 80 端口仍在使用中(由停止的容器使用):
Recreating 41910b0283eb_41910b0283eb_41910b0283eb_vagrant_web_1
ERROR: unable to find a node with port 80 available
这个问题可能有两种解决方案:
- 在每次部署之前,我可以执行
docker-compose stop和docker-compose rm来停止并删除每个正在运行的容器 - 这也会为 Swarm 释放端口 80。 - 另一种解决方案是拥有多个节点并放松。当 compose 重新创建你的容器时,Swarm 会自动找到一个没有人使用 80 端口的随机节点,并在另一个节点上启动新容器。
我可以使用解决方案 1。但我想知道当我有多个节点时如何使其工作。
我对 2. 方法的问题是,通常 Web 应用程序需要有一个可用于域注册的修复 IP。如果 Swarm 将我的 Web 应用程序部署到随机选择的节点,那么我该如何解决这个问题?
我可以使用Round-robin DNS,但我不确定它是否会有所帮助,因为在这种情况下,如果我的集群中有 3 个节点,我需要在每个节点上都有一个我的 Web 应用程序实例。但如果是这种情况,那么我不会遇到同样的问题吗? Swarm 会认为有人仍在使用端口 80,因此它不会找到任何具有端口 80 的节点。
如何解决这个问题?
【问题讨论】:
标签: node.js docker dns containers docker-compose