一.docker网络类型
bridge | 默认类型,docer启动后宿主机默认创建docker0,默认创建的容器的IP与docker0在一个网段 |
host | 容器与宿主机共享网络,与宿主机一模一样,无独立的network namespace |
none | 容器没有可用IP,只有一个环回口网卡lo,无法与外界通信,network namespace是独立的 |
container | 与指定的容器使用一模一样的network namespace,网卡配置相同 |
自定义 | 自定义network名字,实际是bridge类型,如--net lnmp,同一个lnmp同一个网段,从docker0里面重新划分一个子网 |
二.修改默认分配的容器IP网段与宿主机路由查看
docker启动默认有两个IP网段,可为容器分配IP,分配的IP默认是与docker0一个网段
172.17.0.0/16 dev docker0
172.18.0.0/16 dev br-6d7ae1d4f0cb
可以自定义容器的默认IP网段,/etc/docker/daemon.json,如定义容器的ip网段为10.10.0.0/16,注意daemon.json的每一类参数最后是逗号,分割的,上一类参数后面添加逗号后再添加内容
修改后重启docker,systemctl restart docker,重启后172.17.0.0/16 dev docker0变为10.10.0.0/24 dev docker0
三.验证
bridge:默认类型,docer启动后宿主机默认创建docker0,默认创建的容器的IP与docker0在一个网段
host:容器与宿主机共享网络,与宿主机一模一样,无独立的network namespace
none:容器没有可用IP,只有一个环回口网卡lo,无法与外界通信,network namespace是独立的
container:与指定的容器使用一模一样的network namespace,网卡配置相同
自定义:自定义network名字,实际是bridge类型,如--net lnmp,同一个lnmp同一个网段,从docker0里面重新划分一个子网
路由查看
四.故障排查
问题现象:本地办公室电脑的客户端访问云上容器的web服务访问不到,容器web服务正常,云上安全组和本地防火墙都放行web服务的端口,排查宿主机的路由,发现了问题,云上容器返回本地电脑的路由匹配到了172.17.0.0/16走docker0了,没有走宿主机的eth0,出不去了。
这是为什么呢?因为默认路由查找的方式要遵循最长掩码匹配原则,试着分析一下
返回172.17.16.229/24的路由,在宿主机路由表中匹配,没匹配到172.17.16.229/32主机路由......没匹配到172.17.16.0/24路由......匹配到了172.17.0.0/16,匹配到后,路由出口是docker0,不是eth0。
解决方式一:宿主机添加路由
解决方式二:更改容器IP,需要重启docker
/etc/docker/daemon.json增加分配给容器IP的网段,默认是172.17.0.0/16 如改为172.19.0.0/16,更改后,原来使用172.17.0.0/16网段的容器,IP也会也会随着更改,因为容器的服务端口是端口映射的,所以的服务没影响。