本节摘要:「bridge」「host」「none」是 --network 选项的常备义项,决定容器以什么身份上网:默认网桥、直接共享宿主机网络栈、或彻底断网。本节逐个词条讲隔离面、性能特征与适用场景,并点破"默认 bridge 与自定义 bridge 行为不同"这一高频认知坑。
网络部从"身份"讲起。容器跑起来就面临一个根本问题:它在网络世界里是谁?--network 选项的不同义项给出不同答案,选错了轻则端口绕远路,重则隔离失效。先盘点现有网络,再逐词条展开。
$ docker network ls NETWORK ID NAME DRIVER SCOPE 4c8a1e2f9b0d bridge bridge local 7f2d3c8a1b0e host host local 0a9b8c7d6e5f none null local
装好即有三张内置网络:bridge 是默认网桥,容器不加 --network 时都落在这里;host 与 none 是特殊模式的名字占位。DRIVER 列表示该网络由哪种驱动实现,后续自定义网络也会出现在这份清单里。

各模式的命令形态:
$ docker run -d --network bridge nginx:1.25 # 默认,写不写一样 $ docker run -d --network host nginx:1.25 # 直接占宿主机 80 端口 $ docker run --rm --network none debian:12-slim ping -c 1 docker.io ping: bad address 'docker.io' # 断网实锤
host 模式的读法要点:容器不再有自己的地址,80 就是宿主机的 80,-p 端口映射完全失效也无须使用;代价是容器与宿主机、以及其他 host 模式容器之间再无端口隔离,两个服务都想要 80 端口时必冲突。none 模式常见于安全要求高的批处理:生成报告、跑离线计算,网络面直接归零。macvlan 需要预先规划网段与网关,让容器在物理网络上领到自己的地址,适合"必须像台普通机器"的老系统迁移,配置由网络管理员参与,不是应用团队的日常选项。
$ docker run -d --name webA nginx:1.25 $ docker run --rm debian:12-slim ping -c 1 webA ping: bad address 'webA'
容器名 webA 解析失败——这不是故障,是默认 bridge 的设计:它年头久远,行为保持"兼容优先",不接入内置 DNS。同一实验在自定义网络里的结果完全不同,这正是下一节的主角。这里先把结论立住:新组网一律从自定义网络开始,默认 bridge 只当它是"没有组网"。
⚠️ 常见坑:给 host 模式容器配 -p 映射,docker 不报错但映射静默无效——host 模式根本没有映射这回事。看到"端口怎么都不通"的 host 容器,先检查是不是把两种模式的用法混在了一条命令里。
bridge 模式下 -p 是出网的门,此处补全它的两件配套:docker port 查映射现状,-P(大写)交给 Docker 随机分配宿主机端口。
$ docker run -d --name webP -P nginx:1.25 b3f8a1c2d4e5 $ docker port webP 80/tcp -> 0.0.0.0:32768 $ docker ps --filter name=webP --format '{{.Ports}}' 0.0.0.0:32768->80/tcp, [::]:32768->80/tcp
-P 把镜像 EXPOSE 声明的端口全部映射到宿主机随机高位端口,第二行输出里的 [::]:32768 表示 IPv6 侧同样绑定。随机映射适合临时验证"服务本身通不通",不该进生产——端口号每次重启都换,防火墙规则与监控配置都追不上。固定端口用小写 -p;查映射用 docker port,它与 inspect 的 NetworkSettings.Ports 字段等价,但顺手得多。
| 写法 | 行为 | 适用 |
|---|---|---|
-p 8080:80 |
宿主机固定 8080 进容器 80 | 生产固定端口 |
-p 127.0.0.1:8080:80 |
只绑回环,外网摸不到 | 仅本机调试 |
-P |
全部 EXPOSE 端口随机高位映射 | 临时验证 |
none 模式有一招进阶用法:先断网启动做安全初始化,再用 network connect 原地接入——运行中容器更换网络身份,用的就是这对 connect/disconnect(6.2 展开):
$ docker run -d --name initjob --network none busybox:1.36 sleep 300 $ docker network inspect bridge --format '{{range .Containers}}{{.Name}} {{end}}' $ docker network connect bridge initjob $ docker exec initjob ping -c 1 8.8.8.8 64 bytes from 8.8.8.8: seq=0 ttl=115 time=12.3 ms
connect 之前 inspect bridge 的 Containers 列表里没有 initjob;connect 之后它领到网桥地址,ping 通外网。"先最小权限启动、再按需扩权"的思路,在安全敏感的初始化任务里很受用。
容器要不要被外面访问?要,bridge 加 -p(极致性能场景才考虑 host);容器要不要主动出去?要,bridge 或 host,都不要就 none;容器之间要不要按名字互访?要,自定义网络(下一节),别赖在默认 bridge。三问过完,模式基本锁定;macvlan 只在容器必须拥有物理网地址时由网络管理员牵头启用,应用团队记它的名字即可。
身份确定之后,下一节正式组网:让容器在自定义网络里按名字握手。