代码之家  ›  专栏  ›  技术社区  ›  simbro

Docker Swarm主机无法解析其他节点上的主机

  •  2
  • simbro  · 技术社区  · 7 年前

    我遵循这一非常优秀的教程: https://github.com/binblee/springcloud-swarm

    当我将堆栈部署到包含单个节点(仅管理器节点)的Docker swarm时,它可以完美地工作。

    docker stack deploy -c all-in-one.yml springcloud-demo
    

    我有四个docker容器,其中一个是Eureka service discovery,其他三个容器都已成功注册。

    java.net.UnknownHostException: eureka: Name does not resolve
    

    这是我的撰写文件:

    version: '3'
    services:
      eureka:
        image: demo-eurekaserver
        ports:
          - "8761:8761"
    
      web:
        image: demo-web
        environment:
          - EUREKA_SERVER_ADDRESS=http://eureka:8761/eureka
    
      zuul:
        image: demo-zuul
        environment:
          - EUREKA_SERVER_ADDRESS=http://eureka:8761/eureka
        ports:
          - "8762:8762"
    
      bookservice:
        image: demo-bookservice
        environment:
          - EUREKA_SERVER_ADDRESS=http://eureka:8761/eureka
    

    https://docs.docker.com/engine/swarm/ingress/ :

    所有节点都参与一个入口路由网。布线网格 允许群中的每个节点接受已发布的 在节点上运行。

    这是 docker服务ls

    manager:~/springcloud-swarm/compose$ docker service ls
    
    ID                  NAME                           MODE                REPLICAS            IMAGE                                                  PORTS
    rirdysi0j4vk        springcloud-demo_bookservice   replicated          1/1                 demo-bookservice:latest
    936ewzxwg82l        springcloud-demo_eureka        replicated          1/1                 demo-eurekaserver:latest   *:8761->8761/tcp
    lb1p8nwshnvz        springcloud-demo_web           replicated          1/1                 demo-web:latest
    0s52zecjk05q        springcloud-demo_zuul          replicated          1/1                 demo-zuul:latest           *:8762->8762/tcp
    

    以及 docker stack ps springcloud演示 :

    manager:$ docker stack ps springcloud-demo
    ID                  NAME                             IMAGE                      NODE            DESIRED STATE       CURRENT STATE        
    o8aed04qcysy        springcloud-demo_web.1           demo-web:latest            workernode      Running             Running 2 minutes ago
    yzwmx3l01b94        springcloud-demo_eureka.1        demo-eurekaserver:latest   managernode     Running             Running 2 minutes ago
    rwe9y6uj3c73        springcloud-demo_bookservice.1   demo-bookservice:latest    workernode      Running             Running 2 minutes ago
    iy5e237ca29o        springcloud-demo_zuul.1          demo-zuul:latest           managernode     Running             Running 2 minutes ago
    

    更新:

    我成功地添加了另一个主机,但现在无法添加第三个主机。我尝试了几次,遵循相同的步骤(安装docker、打开必要的端口、加入swarm),但是节点找不到具有容器主机名的Eureka服务器)。

    更新2:

    在测试端口是否已打开时,我检查了防火墙配置:

    workernode:~$ sudo ufw status
    Status: active
    
    To                         Action      From
    --                         ------      ----
    8080                       ALLOW       Anywhere
    4789                       ALLOW       Anywhere
    7946                       ALLOW       Anywhere
    2377                       ALLOW       Anywhere
    8762                       ALLOW       Anywhere
    8761                       ALLOW       Anywhere
    22                         ALLOW       Anywhere
    

    managernode:~$ telnet xx.xx.xx.xx 2377
    
    Trying xx.xx.xx.xx...
    telnet: Unable to connect to remote host: Connection refused
    
    4 回复  |  直到 7 年前
        1
  •  14
  •   Community Mohan Dere    5 年前

    让我们把解决办法分成几部分。每个部分都试图让您了解解决方案,并相互关联。

    码头集装箱网络

    每当我们在不指定网络的情况下创建一个容器时,docker就会将其附加到默认的网桥网络。 According to this, . 服务发现在默认网络中不可用。为了使服务发现正常工作,我们应该创建一个用户定义的网络,因为它提供隔离、DNS解析和 many more features. docker run 命令。

    creates its own bridge network. 它具有用户定义网络的所有属性。

    默认情况下,这些网桥网络是不可连接的,但它们允许本地计算机中的docker容器连接到它们。

    Docker swarm网络

    Docker swarm swarm mode routing mesh 每当我们在没有指定外部网络的情况下向其部署服务时,它就会连接到入口网络。

    指定外部覆盖网络时,可以注意到创建的覆盖网络将仅对管理器可用,而不在工作节点中,除非创建了服务并将其复制到该服务中。默认情况下,它们也不可附加,并且不允许swarm服务之外的其他容器连接到它们。因此,在将容器连接到swarm外部之前,不需要将网络声明为可连接。

    码头工人

    因为没有 pre defined/official limit on no of worker/manager nodes ,您应该能够从第三个节点进行连接。一种可能性是该节点可以作为工作节点连接,但是如果覆盖网络不可连接,则可以尝试在该节点中部署受工作节点限制的容器。

    而且,您不能直接在工作节点中部署服务。所有服务都部署在manager节点中,它负责根据提供的配置和模式复制和扩展服务。

    防火墙

    如中所述 Getting started with swarm mode

    • 用于群集管理通信的TCP端口2377
    • 用于节点间通信的TCP和UDP端口7946
    • 覆盖网络流量的UDP端口4789
    • 加密覆盖网络的ip协议50(ESP)

    这些端口应该被列为节点间通信的白名单。大多数防火墙需要重新加载一旦你做了改变。这可以通过将reload选项传递给防火墙来实现,并且在Linux发行版之间有所不同。 ufw needs commit if rules are added in file .

    除了白名单上面的端口。您可能需要将docker0、docker\u gw\u bridge、br-123456 ip地址和网络掩码设置为16的白名单。否则服务发现将无法在同一主机上工作。i、 e如果您正在尝试连接到 eureka 在里面 在哪里 尤里卡 服务相同 192.168.0.12 Refer this (NO ROUTE TO HOST network request from container to host-ip:port published from other container)

    Java

    java.net.MalformedURLException 以及类似的例外。我有我的 own experience the solution 也。这里ping正确解决了,但是javarmi抛出了一个错误。因此,您可以在连接到用户定义的网络时定义自己的自定义别名。

    Docker服务发现

    默认情况下,可以使用容器名称解析为服务。除此之外,还可以将服务解析为 <container_name>.<network_name> . 当然,您也可以定义别名。甚至你也可以把它当作 <alias_name>.<network_name> .

    解决方案

    mention the external network as defined here 同时对防火墙进行更改。

    因为你没有提供第三台服务器的详细情况。我假设您正试图在那里部署一个容器,由于网络不可连接,docker overlay network拒绝了该容器。

        2
  •  2
  •   Patricio Napoli    7 年前

    您需要为服务创建一个网络,如下所示:

    version: '3'
    services:
      eureka:
        image: demo-eurekaserver
        networks:
          - main
        ports:
          - "8761:8761"
    
      web:
        image: demo-web
        networks:
          - main
        environment:
          - EUREKA_SERVER_ADDRESS=http://eureka:8761/eureka
    
      zuul:
        image: demo-zuul
        networks:
          - main
        environment:
          - EUREKA_SERVER_ADDRESS=http://eureka:8761/eureka
        ports:
          - "8762:8762"
    
      bookservice:
        image: demo-bookservice
        networks:
          - main
        environment:
          - EUREKA_SERVER_ADDRESS=http://eureka:8761/eureka
    
    networks:
      main:
        driver: overlay
        attachable: true
    

    这个 attachable: true 以便您可以从另一个撰写文件连接到此网络(如果不是这样,您可以将其删除)

        3
  •  2
  •   simbro    7 年前

    我终于找到了答案。

    我将compose文件的版本更新为“3.3”,因为根据文档,“endpoint\u mode:dnsrr”仅在版本3.3中可用。

    有了这个改变,我就可以工作了。

    感谢大家花时间来研究我的问题,试图解决它。

        4
  •  1
  •   Community Mohan Dere    5 年前

    我的问题是docker网络入侵。我解决了这个开放端口在我的主机和专有网络。

    https://docs.docker.com/network/overlay/#customize-the-docker_gwbridge-interface

    您需要以下端口开放,以便与参与覆盖网络的每个Docker主机进行通信:

    用于群集管理通信的TCP端口2377