外观
选择 bridge、host 或 macvlan 网络
大多数网页服务从 Compose 默认 bridge 网络开始就足够。只有设备发现、多播或独立地址等明确需求,才考虑 host 和 macvlan。网络越接近宿主机,不代表速度一定更快,也不代表配置更简单。
网络边界
发布端口、使用 host 网络或给容器分配独立局域网地址,会改变谁能访问服务。先确认路由器端口转发、IPv6 防火墙及应用认证;保留修改前配置。恢复时撤销端口映射或改回原网络,再从另一台设备验证入口确实关闭。
默认选择 bridge
Compose 为项目建立一个网络,内部服务用服务名解析。一个网页应用和数据库在同一网络中时,应用连接 db:5432,不需要把数据库发布到 NAS 的 5432 端口。容器内的 localhost 表示当前容器,不是 NAS,也不是隔壁数据库。
yaml
services:
app:
ports:
- '${NAS_LAN_IP:?set NAS_LAN_IP}:8080:8080'这是需要合并进实际应用配置的端口片段,并不是可独立启动的完整服务。${NAS_LAN_IP} 在 .env 里填写 NAS 的固定局域网 IPv4;左侧 8080 是宿主机端口,右侧必须匹配应用监听端口。省略 IP 常常会绑定所有接口,可能同时涉及 IPv4 与 IPv6。
宿主机防火墙与 Docker 发布端口规则存在交互,不能仅凭系统界面的防火墙开关推断结果。分别从允许与不允许的网络做连接测试。
host 用于明确的发现需求
network_mode: host 让容器共享宿主机网络命名空间,常用于 Home Assistant 的设备发现。此时端口由应用自己绑定,Compose 的 ports 不再提供隔离;有端口冲突时需要调整应用或架构。Docker Desktop 的行为与 NAS 上 Linux 引擎不同,电脑测试不能代替 NAS 验收。
优先通过普通网页访问确认功能,再决定是否需要 DLNA 或 mDNS。只是为了打开网页,不值得直接切到 host。host 也不会自动解决串口、蓝牙和设备权限,这些是另一层配置。
macvlan 是进阶选项
macvlan 可以让容器在物理网络中表现为独立设备,适用于确实需要独立 IP/MAC 的场景。代价包括地址规划、交换机兼容、宿主机与容器默认无法直接通信以及迁移维护复杂度。有些无线网络、虚拟交换机或云网络会限制多个 MAC。
先核对物理网卡名称、网段、网关和 DHCP 地址池,再保留一段不会冲突的静态地址。不要复制别人机器上的 eth0 与 IP。若是新手只想避免 80 端口冲突,修改 bridge 的宿主端口通常更直接。
反向代理如何连接应用
同一 Docker 网络中的反向代理可以使用服务名和容器端口,不必对局域网额外公开该应用。不同 Compose 项目要共享网络时,显式创建并管理共享网络;不要为了方便把所有应用数据库加入同一个网络。代理容器里的 127.0.0.1 依然是代理自己。
验收
检查 docker compose ps 中发布的地址,分别从 NAS、局域网电脑和计划允许的远程网络访问。数据库只应在内部网络可达;管理页面不应因为转发了应用端口一起暴露。重启 NAS 后再次确认固定地址、网络和应用发现没有变化。