必须同时指定--subnet和--gateway,否则网关可能不在子网内导致通信失败;--subnet需CIDR格式,--gateway须在子网范围内且非网络/广播地址;网关信息位于inspect输出的IPAM.Config中。

docker network create 怎么指定子网和网关
必须用 --subnet 和 --gateway 两个参数一起传,缺一不可。Docker 不会自动推导网关地址,哪怕你只漏掉 --gateway,它也会用默认的 .1(比如 172.18.0.1),但这个地址可能不在你指定的子网范围内,导致容器无法通信。
常见错误现象:docker run 启动容器后 ping 不通宿主机、容器间 curl 超时、docker exec -it 进去后没有默认路由。
-
--subnet必须是 CIDR 格式,例如192.168.100.0/24,不能写成192.168.100.0/255.255.255.0 -
--gateway必须落在--subnet范围内,且不能是网络地址或广播地址(如192.168.100.0或192.168.100.255) - 如果宿主机已有同网段路由,Docker 可能静默失败或创建成功但实际不通——建议先
ip route show | grep 192.168.100检查冲突
示例命令:
docker network create --driver bridge \ --subnet 192.168.100.0/24 \ --gateway 192.168.100.1 \ mynet
为什么 docker network inspect 看不到 gateway 字段
因为 docker network inspect 默认只显示基础配置,网关信息藏在 IPAM.Config 里。直接看顶层字段会误以为没生效。
使用场景:排查容器连不上外网、验证自定义网关是否被真正采纳。
- 运行
docker network inspect mynet后,重点找"IPAM": {"Config": [{"Subnet": "...", "Gateway": "..."}]}这一层 - 如果
Gateway是空字符串或缺失,说明创建时没传--gateway,或者 Docker 版本太老( - Docker Desktop for Mac/Windows 的内置 DNS(
192.168.65.1)和自定义网关无关,别混淆
容器启动后 /etc/resolv.conf 里的 nameserver 是哪来的
不是来自宿主机,也不是来自 --gateway,而是 Docker Daemon 自己注入的,默认是 127.0.0.11(内建 DNS 服务)。除非你显式用 --dns 覆盖,否则改子网/网关对 DNS 解析完全没影响。
容易踩的坑:以为改了网关就能让容器走公司内部 DNS,结果 nslookup google.com 依然超时——那是因为防火墙或上游 DNS 服务器拒绝了来自 127.0.0.11 的请求,不是网络配置问题。
- 若需指定 DNS,必须在
docker run时加--dns 10.0.0.53,或在/etc/docker/daemon.json中配置"dns"全局项 -
--dns和--network可共存,但--dns优先级更高 - 容器内
/etc/resolv.conf是只读挂载,手动改无效
自定义子网和宿主机网卡 IP 冲突怎么办
冲突不报错,但会导致部分流量被内核路由表劫持,现象是容器能 ping 通网关,却无法访问宿主机上监听在 0.0.0.0 的服务(比如宿主机的 nginx:8080)。
根本原因是 Linux 内核优先匹配最精确路由,而 Docker 创建的 br-xxx 网桥会添加一条 192.168.100.0/24 dev br-xxx scope link,如果宿主机某张网卡(如 eth0)也配了 192.168.100.10/24,就会打架。
- 检查命令:
ip route | grep 192.168.100,看是否有两条同前缀路由 - 临时解决:删掉宿主机冲突 IP,用
ip addr flush dev eth0(慎用) - 长期方案:选一个宿主机完全不用的网段,比如
172.29.0.0/16或10.200.0.0/16 - Docker 默认桥接网络(
bridge)的子网可提前在/etc/docker/daemon.json中设为"default-address-pools": [{"base": "172.29.0.0/16", "size": 24}],避免每次手敲
子网规划这事,真得动手前先扫一遍 ip addr 和 ip route,不然等跑起来再调,比修 bug 还磨人。










