Docker创建了两个破坏我的互联网访问的网桥

时间:2017-05-15 20:11:49

标签: linux networking docker

我面临一个非常奇怪的问题:

这是我的配置:

  • docker 17-ce
  • ubuntu 16.04。

我在两个不同的地方与不同的互联网提供商合作。

首先,一切正常,我可以开箱即用的Docker并且可以毫无问题地访问互联网。

但是第二个地方我在Docker运行时无法访问互联网, 更加精确,而docker创建的两个虚拟briges已经启动

在这个地方,互联网连接操作非常紧张,我可以在8.8.8.8 ping谷歌dns,但几乎所有的DNS请求都失败了,大部分时间在几秒钟后互联网连接完全失效。

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

起初我认为我可以通过更改默认网桥ip来解决这个问题,但这根本无法解决问题。

关键是docker守护程序的 - bip 选项会更改默认docker bridge docker0 的IP,但docker还会创建另一个名为 br-1a0208f108d9 ,不反映传递给 - bip 选项的设置。

我猜这第二座桥会给我的网络带来麻烦,因为它与我的wifi适配器配置重叠。

我很难尝试诊断这一点。

我的问题是:

  • 我如何确定我的假设是正确的,并且第二个布里奇特与我的wifi适配器冲突
  • 这第二座桥是什么?很容易找到关于 docker0 网桥的文档,但我找不到与第二座网桥相关的任何内容 br-1a0208f108d9
  • 完全相同的设置如何在一个地方而不是另一个地方工作。

有了这个麻烦,我觉得我非常接近升级我的码头工作知识但在此之前我必须增加我的网络管理知识。

希望你能提供帮助。

3 个答案:

答案 0 :(得分:5)

我在阅读完这篇文章后设法解决了这个问题:

https://success.docker.com/Architecture/Docker_Reference_Architecture%3A_Designing_Scalable%2C_Portable_Docker_Container_Networks

第二个docker bridge 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

与自定义泊坞网络冲突。

解决方案只是更改自定义泊坞网络的IP。

答案 1 :(得分:1)

您必须告诉Docker使用其他子网。编辑/etc/docker/daemon.json并使用类似这样的内容:

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

获取信息有点困难,但是看起来bip选项控制分配给docker0接口的IP和子网,而default-address-pools控制用于分配地址的地址。 br-*个界面。您可以省略bip,在这种情况下它将从池中获取分配,而bip不必驻留在池中,如上所示。

size是分配给每个Docker网络的子网的大小。例如,如果您的base/24,并且您还将size设置为24,那么您将能够创建一个完全的Docker网络,并且可能只能运行一个Docker容器。如果您尝试重新启动,则会收到消息could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network,这表明您池中的IP地址已用完。

在上面的示例中,我分配了一个/22(1024个地址),每个网络/容器从该池中获取一个/26(64个地址)。 1024÷64 = 16,因此使用此配置,您最多可以运行16个Docker网络(因此,最多可以同时运行16个容器,如果其中一些共享同一网络,则可以运行更多)。由于我一次很少有超过两个或三个正在运行的容器,所以这对我来说很好。

在我的示例中,我使用RFC 3330中列出的198.18.0.0/15子网的一部分(但在RFC 2544中有完整记录),该子网保留用于性能测试。这些地址不太可能出现在真实的Internet上,也没有专业的网络提供商也不会在其专用网络中使用这些子网,所以我认为它们是与Docker一起使用的不错选择,因为冲突的可能性很小。但是从技术上讲,这是对该IP范围的滥用,因此,如果您还选择使用这些子网,请注意将来可能发生的冲突。

默认值listed in the documentation为:

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

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

答案 2 :(得分:0)

在我的情况下,我不会应用Clement解决方案,因为当容器交付给许多不受影响的服务器时,我与我的dev pc仅存在网络冲突。 我认为该问题应按照建议的here解决。 我尝试了这种解决方法:

  1. 我用“ docker-compose down”停止了容器,该容器破坏了桥梁

  2. 我处于“不良”网络上时启动了容器,因此容器使用了另一个网络

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