我在 Docker swarm 环境中运行非常轻量级的 Docker 镜像。为此,我将随机端口转发到容器内的目标端口。这是一个示例输出:
y0xxxjj8kvi3 foo-test-1 1/1 strm/helloworld-http:latest *:30001->80/tcp
37f4czmipex0 foo-test-2 1/1 strm/helloworld-http:latest *:30002->80/tcp
qmzjlxt95n8r foo-test-3 1/1 strm/helloworld-http:latest *:30003->80/tcp
...
如您所见,我部署的服务越多,使用的端口就越多。这是否意味着服务数量受到网络堆栈可用端口数量的限制?还有其他更适合的网络模式吗?
目前路由是由 Docker 群路由完成的,但我准备了一个负载均衡器,可以直接使用容器的虚拟 IP 地址将调用转发到容器,但我不确定这是否可以解决问题。哪种网络模式最适合这个?
谢谢!
编辑:我知道考虑到其局限性,Kubernetes 可能更适合这里,但我仍然很好奇用 Docker swarm 来解决这个问题。
理论上每个 IP 地址有 65,535 个端口,但这与 Docker Swarm 无关。
由于您使用 Swarm 作为编排引擎,因此您可以启动其他节点并使用
docker swarm join
让它们加入 Swarm。然后您将有更多可用端口。
但是,您提出这个问题的方式确实引发了有关您的预期用例的问题。我通常只向外部客户端公开少量端口(例如,用于 Web 应用程序的 80 和 443,用于 postgres 的 5432 等)。例如,我可能会使用群体网络来做一些简单的负载平衡。例如,对于 Web 应用程序,我可以运行 nginx 或其他反向代理并将请求转发到“内部”网络;在这种情况下,永远不要将端口暴露给公共网络。