Docker容器随机创建子网


纸上得来终觉浅,绝知此事要躬行。

Docker容器随机创建子网


  • 今天在服务器上面搭建测试环境,因为是采用的微服务的架构,所以对应很多个 subnet 网络。但是使用 docker-compose 启动之后,发现有一个服务显示 unhealthy 的状态,上去一看对应的健康检查日志,发现对应的后端的 gRPC 服务无法连接。

  • 当时就感觉很奇怪,随即看了下对应几个 subnet 网络的 IP 段。后来发现,其中有两个服务对应的 IP 段是 172.17.0.0/16 的。,而另一个对应的 IP 段是 192.168.0.0/20 的。

  • 但是,查看了 docker 对应的配置,发现如下所示,只有 172.17.0.0/16 的网段可以查看到。很奇怪,另一个怎么看到呢?

docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:2c:3c:de:e8 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  • 随即,使用如下命令一次多创建多个子网段,我们会发现系统会随机使用两个网段的地址进行分配。
for num in `seq -w 20`; do
    echo "Create network: $num"
    docker network create $num
    docker inspect $num | grep IPv4Address
done
  • 对于每个网络,docker 都会保留一个私有 IP 池并保留一系列 IP 地址。默认桥接网络(docker0)占用一个子网地址,这样就剩下 29 个子网地址可供使用。
Networks Type Default Pool Size Numbers
global scope networks 10.[0-255].[0-255].0/24 -
local scope networks 172.[17-31].0.0/16 15
local scope networks 192.168.[0-224].0/20 15
  • 当用户在未指定 --subnet 的情况下创建网络时,docker 将从静态集中选择网络子网。出于不同的原因,一些用户要求能够控制这些默认值,允许用户在守护程序启动时控制默认地址池。
# command line
$ dockerd --default-address-pool scope=local,base=10.10.0.0/16,size=24
# config file
$ vim /etc/docker/daemon.json
{
  "default-address-pools":[
    {
      "scope": "local",
      "base": "172.80.0.0/16",
      "size": 24
    },
    {
      "scope": "global",
      "base": "172.90.0.0/16",
      "size":24
    }
  ]
}

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !