Docker Swarm群集中未打开套接字端口(已识别根本原因)

Imr*_*han 6 apache-karaf docker docker-swarm

我有以下设置

  • 两个虚拟机
  • 创建了覆盖网络
  • 创建了两个docker swarm服务

    docker service create --name karaf1-service --replicas 1 --network karaf_net karaf1:2.0.0

    docker service create --name karaf2-service --replicas 1 --network karaf_net karaf2:2.0.0

现在这些容器在开始时打开套接字端口,我观察一段时间它成功地创建它失败的大量时间.

ServerSocketFactory.getDefault().createServerSocket(serverPort)
Run Code Online (Sandbox Code Playgroud)

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

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

这个容器无法打开套接字

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
Run Code Online (Sandbox Code Playgroud)

容器能够在端口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
Run Code Online (Sandbox Code Playgroud)

根本原因已识别: 因为我正在创建两个服务所以在创建第一个服务时,我提供第二个服务作为第一个服务的主机名以保持验证状态,因此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)
Run Code Online (Sandbox Code Playgroud)

现在我无法在etc/hosts中添加karaf2-service的条目,所以socket不要抱怨,因为我不知道哪个IP将被分配给docker-swarm服务?在覆盖网络中,我们主要与服务名称进行通信

有什么建议来解决这个???

Fra*_*ers 0

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

有多种工具可以执行此操作,例如 wait-for-it: https: //github.com/vishnubob/wait-for-it