Docker网络模式详解:bridge、host、macvlan

2026-06-22 18:12:03 0点赞 2收藏 0评论

Docker 的网络配置是很多玩家感到困惑的地方。

容器之间怎么通信?容器怎么暴露给局域网?什么时候该用哪种网络模式?

Docker 的四种网络驱动

Docker 提供了四种主要的网络驱动:

Docker网络模式详解:bridge、host、macvlan

对于 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:

  • 某些路由器功能(如 Pi-hole 做 DHCP 服务器

  • 需要容器在局域网内"看得见"(如 UPnP/DLNA 投屏)

  • 不想记端口号,每个服务一个独立 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网络

快速决策指南

选择网络模式时,问自己三个问题:

  1. 这个容器需要很高的网络性能吗?→ :Host 模式

  2. 这个容器需要独立的局域网 IP 吗?→ :Macvlan 模式

  3. 以上都不需要?→ Bridge 模式,用端口映射暴露服务

大多数情况下默认的 Bridge 就能满足需求。不要为了"高级"而盲目使用 Host 或 Macvlan,简单的就是最好的。

展开 收起
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
2
扫一下,分享更方便,购买更轻松