Docker swarm网络和主机上的端口可访问性的理解

130次阅读
没有评论

问题描述

在使用Docker swarm时遇到了网络和端口可访问性的问题。他在一个简单的测试swarm中只有一个节点,所有容器都在同一个地方运行。他设置了一个自定义的Docker网络,容器没有直接映射到主机,而是通过mesh网络进行管理。然而,他发现在Windows机器上和Ubuntu的Linux机器上都可以正常访问容器的发布端口,但在SLES机器上无法访问。他认为这是因为自定义网络没有自动映射到主机网络。他想知道SLES系统的问题可能是什么,以及如何进行调试。

UPDATE:
防火墙似乎不是问题:iptables -L的输出在所有地方都显示为all --anywhere
Ingress模式是激活的(与一个主机没有区别);docker ps显示一个正在监听正确TCP端口的活动容器。

用户还提供了一些其他信息,包括他尝试过的一些解决方法和相关链接。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

步骤1:检查主机的网络配置

首先,我们需要检查SLES系统的网络配置,确保主机的网络设置正确。用户提到了可能是/etc/hosts文件的问题,因为SLES可能没有将localhost映射到127.0.0.1或127.0.1.1,从而破坏了回环机制。我们可以通过以下步骤来检查和修改/etc/hosts文件:

  1. 使用SSH登录到SLES系统。
  2. 打开终端,并使用root权限运行以下命令来编辑/etc/hosts文件:
    bash
    sudo vi /etc/hosts
  3. 在文件中查找类似以下行的条目:
    127.0.0.1 localhost
    如果没有找到这样的条目,或者条目中的IP地址不是127.0.0.1或127.0.1.1,请添加或修改它以确保localhost正确映射到回环地址。例如:
    127.0.0.1 localhost
    127.0.1.1 your_hostname

    其中your_hostname是主机的实际主机名。
  4. 保存并关闭文件。

步骤2:检查IPv6设置

如果在步骤1中修改了/etc/hosts文件,但问题仍然存在,那么可能是IPv6设置导致的。我们可以尝试禁用IPv6来解决这个问题。

  1. 打开终端,并使用root权限运行以下命令来编辑/etc/sysctl.conf文件:
    bash
    sudo vi /etc/sysctl.conf
  2. 在文件的末尾添加以下行:
    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
  3. 保存并关闭文件。
  4. 运行以下命令以使更改生效:
    bash
    sudo sysctl -p

步骤3:重新启动Docker服务

如果在步骤1和步骤2中的任何一步之后修改了主机的网络设置,我们需要重新启动Docker服务以使更改生效。

  1. 打开终端,并使用root权限运行以下命令来重新启动Docker服务:
    bash
    sudo systemctl restart docker

步骤4:重新测试端口可访问性

完成上述步骤后,我们可以重新测试容器的端口可访问性。

  1. 打开终端,并使用以下命令测试容器的端口可访问性:
    bash
    curl -d http://localhost:port/api

    其中port是容器的端口号。
  2. 如果命令成功执行并返回预期的输出,则表示容器的端口可访问性已解决。

注意:如果问题仍然存在,请确保SLES系统上没有其他防火墙或网络配置导致端口不可访问。

总结

通过检查主机的网络配置,禁用IPv6并重新启动Docker服务,我们可以解决SLES系统上Docker swarm网络和端口可访问性的问题。如果问题仍然存在,请确保没有其他防火墙或网络配置导致端口不可访问。

正文完