纸上得来终觉浅,绝知此事要躬行。
今天在服务器上面搭建测试环境,因为是采用的微服务的架构,所以对应很多个
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
}
]
}