Docker网络模式详解:bridge、host、macvlan
Docker 的网络配置是很多玩家感到困惑的地方。
容器之间怎么通信?容器怎么暴露给局域网?什么时候该用哪种网络模式?
Docker 的四种网络驱动
Docker 提供了四种主要的网络驱动:

对于 NAS 用户来说,前三者最常用,我们重点讲解它们。
Bridge 模式(默认)
Bridge 模式是 Docker 的默认网络模式。Docker 会创建一个虚拟网桥 docker0(类似一个虚拟交换机),所有加入该网络的容器都会被分配一个虚拟 IP,容器之间通过这个 IP 互相访问。
默认 bridge vs 自定义 bridge
默认 bridge 网络有一个限制:容器之间不能用容器名互相访问,只能用 IP。而自定义 bridge 网络支持内置的 DNS 解析,容器之间可以直接用容器名通信。
强烈建议创建自定义 bridge 网络:
docker network create my-net
然后在 Compose 中这样使用:
services:
app:
networks:
- my-net
db:
networks:
- my-net
networks:
my-net:
external:true
端口映射
Bridge 模式下,容器不能直接被局域网访问,需要通过端口映射:
ports:
-"8080:80"# 宿主机8080 → 容器80
你可以把多个容器映射到宿主机的不同端口上,这是最常见的做法。
Bridge 是新手最友好的模式。隔离性高,端口冲突可以轻松解决,绝大部分家庭场景用 Bridge 就够了。
Host 模式
Host 模式下,容器直接使用宿主机的网络栈,不创建虚拟网卡,不做网络地址转换。也就是说:
容器和宿主机共享同一个 IP 地址
容器的端口不需要映射,直接暴露在宿主机上
网络性能接近原生,没有 NAT 转发开销
network_mode: host
何时使用 Host 模式
Jellyfin/Plex/Emby开启硬件转码时推荐 Host 模式,能更好地发现硬件设备
Home Assistant需要发现局域网内的智能设备(mDNS/DLNA)
下载工具qBittorrent / Transmission 等,减少 NAT 层数提升下载效率
性能敏感服务任何对延迟或吞吐量要求高的场景
Host 模式的坑
端口冲突是 Host 模式的主要问题。同一个端口只能被一个进程占用。如果你有多个 Nginx 容器都想用 80 端口,Host 模式就行不通了。
解决方法是:只把需要高性能/设备发现的容器设为 Host 模式,其他仍用 Bridge。
Macvlan 模式
Macvlan 允许容器直接获得一个物理网络中的独立 MAC 地址和 IP 地址,就像它是一台独立的物理设备插在了交换机上。
为什么需要 Macvlan
有些场景下,你希望容器拥有和 NAS 同网段的 IP:
创建 Macvlan 网络
docker network create -d macvlan
--subnet=192.168.1.0/24
--gateway=192.168.1.1
--ip-range=192.168.1.240/28
-oparent=eth0
my-macvlan
参数说明:
-o parent=eth0指定物理网卡--ip-range限制容器可用的 IP 范围,避免 DHCP 冲突
Macvlan 的局限
一个重要限制:Macvlan 容器无法和宿主机直接通信。这是 Linux 内核的实现决定的,容器和宿主机在同一个物理网卡上但有独立的 MAC 地址,内核会阻止它们直接对话。
解决方法:在宿主机上创建一个 macvlan 子接口:
iplinkadd mac0 link eth0 type macvlan mode bridge
ip addr add192.168.1.250/32 dev mac0
iplinkset mac0 up
IPvlan 模式:Macvlan 的替代
IPvlan 解决了 Macvlan 的 MAC 地址消耗问题(有些云环境限制 MAC 地址数量)。容器共享宿主机网卡的 MAC 地址,但获取独立 IP。在云服务器或虚拟机中非常有用。
实战:多网络组合方案
一个常见的最佳实践:把需要互相通信的容器放在同一个自定义 bridge 里,把需要局域网直连的容器用 Host 或 Macvlan。
version:"3.8"
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:
-"80:80"
networks:
- frontend
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
network_mode: host # Host模式,硬件转码和DLNA
pihole:
image: pihole/pihole:latest
container_name: pihole
networks:
macnet:
ipv4_address: 192.168.1.200 # 独立IP做DNS
networks:
frontend:
driver: bridge
macnet:
external:true# 预先创建的macvlan网络
快速决策指南
选择网络模式时,问自己三个问题:
这个容器需要很高的网络性能吗?→ 是:Host 模式
这个容器需要独立的局域网 IP 吗?→ 是:Macvlan 模式
以上都不需要?→ Bridge 模式,用端口映射暴露服务
大多数情况下默认的 Bridge 就能满足需求。不要为了"高级"而盲目使用 Host 或 Macvlan,简单的就是最好的。
