docker network 命令是管理容器网络的唯一标准接口,涵盖网络隔离、互通与调试;默认 docker network ls 仅显示 local 网络,Swarm 模式下才可见 swarm 作用域 overlay 网络。

docker network 命令不是“可选工具”,而是管理容器网络的唯一标准接口——所有网络隔离、互通、调试都绕不开它,别试图用 ifconfig 或手动改 /etc/hosts 替代。
查网络前先确认你看到的是什么
执行 docker network ls 时,默认只显示本地作用域(SCOPE=local)网络,bridge、host、none 都属于这一类。但如果你启用了 Swarm 模式,overlay 网络会出现在列表里,且 SCOPE=swarm;没开 Swarm 却看不到 overlay,不是命令错了,是根本没创建成功。
常见误判点:
- 用
docker network ls -f driver=bridge过滤时,host和none不会显示——它们不是 bridge 驱动,但也不是“不存在” -
docker0网桥是内核级设备,不等于bridge网络对象;docker network inspect bridge显示的子网可能和ip a show docker0输出的 IP 不一致——后者是宿主机视角的地址,前者是容器视角的默认网段 - 删不掉某个网络?先跑
docker ps --filter network=<network_name> -q</network_name>,有输出就说明还有容器连着它,docker network rm必然失败
自定义 bridge 网络必须指定子网,否则容易冲突
直接 docker network create mynet 会由 Docker 自动分配子网,但下一次创建可能撞上已用网段(比如又分到 172.18.0.0/16,而你另一台机器正用着)。生产环境务必显式指定 --subnet:
docker network create --driver bridge --subnet=192.168.100.0/24 --gateway=192.168.100.1 mynet
注意:
-
--subnet必须是 CIDR 格式,192.168.100.0/24合法,192.168.100.0/255.255.255.0不合法 - 如果宿主机已有
192.168.100.x的物理网卡或路由,容器可能无法访问外网——Docker 不会自动加路由,得自己用ip route补 -
--ip-range可限制容器实际获取 IP 的范围(比如只从192.168.100.100-192.168.100.199分配),避免和静态配置的容器 IP 冲突
--network host 在非 Linux 平台无效,且会绕过端口映射
在 macOS 或 Windows 上跑 docker run --network host nginx,实际行为等价于 --network bridge,因为 Docker Desktop 底层是 Linux VM,host 指的是那个 VM 的网络,不是你的 Mac/Windows 主机。
在真 Linux 上启用 host 模式后:
- 容器内
netstat -tlnp看到的监听端口,就是宿主机上真实打开的端口 -
-p 8080:80这种端口映射完全失效——你得让应用自己监听0.0.0.0:80,否则外部根本连不上 - 容器共享宿主机的
/proc/sys/net,修改net.ipv4.ip_forward会影响整个系统,不是容器私有操作
容器间通信不能只靠 link,该用自定义网络就用
--link 是 Docker 1.10 之前的遗留机制,现在仅用于兼容老脚本。它本质是往容器 /etc/hosts 写记录+设环境变量,不解决 DNS 或动态发现。
正确做法是创建一个自定义网络,然后把多个容器接进去:
docker network create appnet<br>docker run -d --name db --network appnet postgres<br>docker run -d --name web --network appnet nginx
这时 web 容器里可以直接 ping db 或 curl http://db:5432,Docker 内置 DNS 会自动解析——这个机制只在自定义 bridge 网络中生效,default bridge 网络不支持容器名解析。
容易忽略的细节:
- 两个容器即使都在
bridge网络,但如果一个是默认bridge、一个是自定义bridge,它们互相 ping 不通——网络对象之间默认不连通 - 想让容器同时接入多个网络?用
docker network connect,但注意:只有第一个网络决定容器的默认网关,其他网络上的流量要靠路由表控制
docker inspect <container> | jq '.NetworkSettings.Networks'</container> 比猜靠谱得多。

















