推荐使用 docker 自定义 bridge 网络(如 mynet),通过 docker network create 指定子网与网关,实现容器间基于名称的 dns 解析、地址隔离及可控网段,无需操作宿主机网桥。

Linux 为容器网络配置独立网桥与子网,关键在于区分两类“网桥”:一类是宿主机层面的内核网桥(如 br0),另一类是 Docker 用户自定义 bridge 网络(如 mynet)。两者用途不同,但可协同工作。真正面向容器、推荐生产使用的方案,是创建 Docker 自定义 bridge 网络并指定子网与网关——它不依赖宿主机网桥设备,却能提供隔离、可控、支持 DNS 解析的容器网络环境。
Docker 自定义 bridge 网络(推荐首选)
这是最常用、最可靠的方式,无需手动操作内核网桥,Docker 自动管理底层 veth 和网桥逻辑。
- 用
docker network create明确指定子网和网关:docker network create --subnet=192.168.100.0/24 --gateway=192.168.100.1 mynet
子网必须是 CIDR 格式,网关必须落在该子网内(如192.168.100.1对应/24是合法的)。 - 启动容器时指定网络:
docker run --network mynet --name db postgres
同一网络下的容器可直接用名字通信(如ping db),无需记 IP。 - 已有容器可动态接入:
docker network connect mynet app-container - 验证配置:
docker network inspect mynet查看子网、网关、已连接容器;ip addr show不会显示新网桥设备(它在 Docker 内部虚拟化实现),避免与宿主机br0混淆。
宿主机级网桥(br0)配合容器使用(进阶场景)
当需要容器直接接入物理网络段(例如让容器获得和宿主机同网段的 IP,或统一管理 LXC/Waydroid/libvirt 等多类虚拟化工具时),才需手动配置宿主机网桥(如 br0)。
- 先创建并启用网桥:
sudo ip link add name br0 type bridgesudo ip addr add 192.168.1.100/24 dev br0sudo ip link set br0 up - 将物理网卡(如
enp0s3)桥接到br0,并清空其原 IP:sudo ip link set enp0s3 master br0sudo ip addr flush dev enp0s3sudo ip link set enp0s3 up - Docker 容器本身不直接使用
br0,但可通过--network=host或第三方 CNI 插件接入;更常见的是让其他工具(如 libvirt)绑定到br0,再与 Docker 容器通过物理网络互通。
避坑要点
避免常见错误,让配置稳定可用:
- 默认
docker0网桥不能指定子网或网关,也不支持容器名解析——务必用docker network create创建新网络,而非修改docker0。 - 不要给容器硬编码
--ip,除非业务强依赖固定地址;优先靠网络名通信,Docker DNS 会自动处理解析。 - 子网不能与宿主机已有网段冲突(如宿主机在
192.168.1.0/24,就别设容器网为同一段)。 - 删除网络前,确认无容器连接:
docker ps --filter network=mynet -q有输出则需先停止或断开容器。
为什么不用 host 或 none 模式
host 模式让容器共享宿主机网络栈,端口全局唯一、-p 失效、缺乏隔离;none 模式完全无网络。它们都不提供子网划分能力,也不满足“独立网桥与子网”的核心需求。只有自定义 bridge 网络,才能同时实现地址空间隔离、网段可控、跨容器服务发现这三项关键能力。











