Docker:子网客户端无法ping通其他子网

47次阅读
没有评论

问题描述

在使用Docker创建了两个容器,分别位于不同的子网中。具体地,问题是在一个Ubuntu 18.04主机上创建了两个内部网络(subnet),分别为192.168.2.0/24和172.16.1.0/24。容器R1位于192.168.2.0/24子网,IP地址为192.168.2.100;容器PC1位于172.16.1.0/24子网,IP地址为172.16.1.2。但是问题在于PC1无法ping通R1的接口192.168.2.100,尽管R1已经设置了net.ipv4.ip_forward = 1。所使用的Docker版本为18.06.1-ce。

解决方案

请注意以下操作可能涉及版本差异,确保在执行之前做好备份。

方案1:移除–internal选项

问题的关键在于创建网络时使用了--internal选项,这会导致该网络对其他Docker网络不可达。解决方案是将该选项移除。

以下是执行的步骤:

  1. 重新创建网络netR,去掉–internal选项。
    bash
    sudo docker network create --subnet=192.168.2.0/24 netR
  2. 将R1容器连接到修改后的netR网络。
    bash
    sudo docker network connect --ip="172.16.1.254" netR R1

方案2:检查IP转发

确认R1容器的IP转发已经正确设置。进入R1容器,编辑/etc/sysctl.conf文件,确保net.ipv4.ip_forward被设置为1。

  1. 进入R1容器。
    bash
    sudo docker exec -it R1_ipsec /bin/bash
  2. 编辑sysctl.conf文件并确认net.ipv4.ip_forward的值。
    bash
    vim /etc/sysctl.conf
    # 确保以下行存在并且设置为1
    net.ipv4.ip_forward=1
  3. 保存并退出编辑器。
  4. 应用新的配置。
    bash
    sysctl -p

方案3:检查防火墙规则

检查防火墙规则是否阻止了PC1与R1之间的通信。在R1容器上检查iptables规则,确认没有阻止PC1与R1的通信。

  1. 进入R1容器。
    bash
    sudo docker exec -it R1_ipsec /bin/bash
  2. 查看iptables规则。
    bash
    iptables -L
  3. 确保没有阻止PC1与R1之间的通信的规则存在,如果有,需要适当修改iptables规则以允许通信。

方案4:升级Docker版本

有时问题可能与Docker版本有关,考虑升级到最新的Docker版本,以获得更好的稳定性和功能支持。

总结

在解决这个问题时,需要确认网络创建选项、IP转发设置、防火墙规则等方面的配置。检查并修复可能的问题,以确保PC1和R1之间的通信正常。如果问题仍然存在,可以考虑升级到最新的Docker版本,以获得更好的稳定性和功能支持。

正文完