Docker创建了两个桥接网络导致我的互联网访问出现问题。

13

我遇到了一个很奇怪的问题:

这是我的配置:

  • docker 17-ce
  • ubuntu 16.04。

我在两个不同的地方工作,使用不同的互联网服务提供商。

在第一个地方,一切都正常运行,我可以直接运行docker,并且能够正常访问互联网。

但是在第二个地方,当docker运行时,更准确地说是在docker创建的两个虚拟桥接器处于激活状态时,我无法访问互联网。

在这个地方,互联网连接非常奇怪,我可以ping谷歌dns的8.8.8.8,但几乎所有的dns请求都失败了,而且很多时候几秒钟后互联网连接就完全断开了。

(第一个地方和第二个地方之间唯一的区别是互联网服务提供商)。

起初,我以为可以通过更改默认网络桥接器IP来解决这个问题,但这根本没有解决问题。

重点是docker daemon的--bip选项可以更改默认docker桥接器docker0的IP,但是docker还会创建另一个名为br-1a0208f108d9的桥接器,它不反映传递给--bip选项的设置。

我想这第二个桥接器可能会干扰我的网络,因为它与我的wifi适配器配置重叠了。

我正在努力尝试诊断这个问题。

我的问题是:

  • 如何确保我的假设是正确的,而这第二个桥接器正在与我的wifi适配器冲突?
  • 这第二个桥接器是什么?关于docker0桥接器,很容易找到文档,但是我找不到任何与这第二个桥接器br-1a0208f108d9有关的东西。
  • 相同的设置如何在一个地方工作,在另一个地方却无法正常运行?

我觉得这个问题让我离提高我的Docker知识更近了一步,但在此之前,我需要增加我的网络管理知识。

希望您能帮助我。


我也遇到了同样的问题。起初我毫不知情,Docker是罪魁祸首。 - Isuru
3个回答

9
我阅读了以下内容后成功解决了这个问题:https://success.docker.com/Architecture/Docker_Reference_Architecture%3A_Designing_Scalable%2C_Portable_Docker_Container_Networks
第二个 Docker 桥 br-1a0208f108d9 是由 Docker 创建的,因为我正在使用一个包含另一个自定义网络创建的 Docker-compose 文件。 这个网络使用了一个固定的 IP 范围:
networks:
  my_network:
    driver: bridge
    ipam:
      config:
      - subnet: 172.16.0.0/16
        gateway: 172.16.0.1
  • 在我的家里,物理的wifi网络适配器自动使用DHCP分配了地址192.168.0.X。
  • 但是在其他地方,同样的wifi适配器获得了172.16.0.x的地址。

这与自定义docker网络冲突。

解决方案很简单,只需更改自定义docker网络的IP即可。


2

您需要告诉Docker使用不同的子网。编辑/etc/docker/daemon.json并使用类似以下内容:

{
  "bip": "198.18.251.1/24",
  "default-address-pools": [
    {
      "base": "198.18.252.0/22",
      "size": 26
    }
  ]
}

信息有点难以获取,但看起来选项控制分配给docker0接口的IP和子网,而default-address-pools控制用于br-*接口的地址。您可以省略,这样它将从池中获取分配,并且不必驻留在池中,如上所示。 size是为每个Docker网络分配的子网大小。例如,如果您的base/ 24,并且您还将size设置为24,那么您将能够创建一个Docker网络,可能只能运行一个Docker容器。如果您尝试启动另一个容器,则会收到消息“无法在默认值中找到可用的、非重叠的IPv4地址池以分配给网络”,这意味着池中的IP地址已用完。
在上面的例子中,我分配了一个/22(1024个地址),每个网络/容器从该地址池中取出一个/26(64个地址)。 1024 ÷ 64 = 16,因此您可以使用此配置运行多达16个Docker网络(因此最多同时运行16个容器,如果其中一些共享同一网络,则可以运行更多)。由于我很少同时运行两到三个容器,所以对我来说这很好。
在我的示例中,我正在使用RFC 3330中列出的198.18.0.0/15子网的一部分(但在RFC 2544中完全记录),该子网保留用于性能测试。 这些地址不太可能出现在真正的互联网上,也没有专业的网络提供商会在其私有网络中使用这些子网,因此在我看来,它们是与Docker一起使用的不错选择,因为冲突的可能性非常小。 但从技术上讲,这是对IP范围的误用,因此请注意潜在的未来冲突,如果您选择使用这些子网。

文档中列出的默认值如下

{
  "bip": "",
  "default-address-pools": [
    {"base": "172.80.0.0/16", "size": 24},
    {"base": "172.90.0.0/16", "size": 24}
  ]
}

如上所述,默认的空意味着它只会从池中获取分配,就像任何其他网络/容器一样。

0
在我的情况下,我不会应用Clement的解决方案,因为我只有在我的开发PC上遇到网络冲突,而容器被交付给许多未受影响的服务器。 我认为这个问题应该按照这里建议的方式解决。 我尝试了以下解决方法:
  1. 使用“docker-compose down”停止容器,从而销毁桥接

  2. 在我处于“坏”网络时启动容器,以便容器使用另一个网络

从那时起,如果我在任何网络上重新启动容器,它都不会尝试使用“坏”的网络,通常会获取最后使用的网络。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接