问题描述
在使用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
文件:
- 使用SSH登录到SLES系统。
- 打开终端,并使用root权限运行以下命令来编辑
/etc/hosts
文件:
bash
sudo vi /etc/hosts - 在文件中查找类似以下行的条目:
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
是主机的实际主机名。 - 保存并关闭文件。
步骤2:检查IPv6设置
如果在步骤1中修改了/etc/hosts
文件,但问题仍然存在,那么可能是IPv6设置导致的。我们可以尝试禁用IPv6来解决这个问题。
- 打开终端,并使用root权限运行以下命令来编辑
/etc/sysctl.conf
文件:
bash
sudo vi /etc/sysctl.conf - 在文件的末尾添加以下行:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1 - 保存并关闭文件。
- 运行以下命令以使更改生效:
bash
sudo sysctl -p
步骤3:重新启动Docker服务
如果在步骤1和步骤2中的任何一步之后修改了主机的网络设置,我们需要重新启动Docker服务以使更改生效。
- 打开终端,并使用root权限运行以下命令来重新启动Docker服务:
bash
sudo systemctl restart docker
步骤4:重新测试端口可访问性
完成上述步骤后,我们可以重新测试容器的端口可访问性。
- 打开终端,并使用以下命令测试容器的端口可访问性:
bash
curl -d http://localhost:port/api
其中port
是容器的端口号。 - 如果命令成功执行并返回预期的输出,则表示容器的端口可访问性已解决。
注意:如果问题仍然存在,请确保SLES系统上没有其他防火墙或网络配置导致端口不可访问。
总结
通过检查主机的网络配置,禁用IPv6并重新启动Docker服务,我们可以解决SLES系统上Docker swarm网络和端口可访问性的问题。如果问题仍然存在,请确保没有其他防火墙或网络配置导致端口不可访问。