首页 > 解决方案 > 套接字端口未在 Docker Swarm 集群中打开(已确定根本原因)

问题描述

我有以下设置

现在这些容器在启动时打开套接字端口,我观察到它成功地创建了一些时间它失败了。

ServerSocketFactory.getDefault().createServerSocket(serverPort)

如果两个容器都在一个节点上启动它最成功,但是当容器在不同节点上创建时它几乎每次都失败。

在对网络问题进行故障排除之前,容器至少应该创建套接字。

此容器无法打开套接字

root@bd48643080b2:/opt/apache/apache-karaf-4.1.5# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8101            0.0.0.0:*               LISTEN      61/java
tcp        0      0 127.0.0.1:1099          0.0.0.0:*               LISTEN      61/java
tcp        0      0 0.0.0.0:41551           0.0.0.0:*               LISTEN      61/java
tcp        0      0 127.0.0.11:44853        0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:44444           0.0.0.0:*               LISTEN      61/java

以下容器能够在端口 4550 上创建它,但有时反之亦然

root@38d26c7dde1a:/opt/apache/apache-karaf-4.1.5# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:37347           0.0.0.0:*               LISTEN      61/java
tcp        0      0 0.0.0.0:8101            0.0.0.0:*               LISTEN      61/java
tcp        0      0 0.0.0.0:4550            0.0.0.0:*               LISTEN      61/java
tcp        0      0 127.0.0.11:37575        0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:1099          0.0.0.0:*               LISTEN      61/java
tcp        0      0 127.0.0.1:35321         0.0.0.0:*               LISTEN      61/java
tcp        0      0 0.0.0.0:44444           0.0.0.0:*               LISTEN      61/java

已确定根本原因: 由于我正在创建两个服务,因此在创建第一个服务时,我将第二个服务作为主机名提供给第一个服务以继续验证状态,因此 java 在主机名上抛出错误,例如“karaf2-service”

java.net.UnknownHostException: karaf2-service: Name or service not known
        at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
        at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)

现在我不能在 etc/hosts 中添加 karaf2-service 的条目,所以套接字不会抱怨,因为我不知道哪个 IP 将分配给 docker-swarm 服务?在覆盖网络中,我们主要使用服务名称进行通信。

有什么建议可以解决这个问题???

标签: dockerdocker-swarmapache-karaf

解决方案


最简单的方法是检查容器启动是否可以访问其他服务,如果不能,请等待几秒钟然后重试。

有多种工具可以做到这一点,例如等待它:https ://github.com/vishnubob/wait-for-it


推荐阅读