在 ARM64 Ubuntu 20.04 上部署 Mailu 邮件服务器:深度排查 Docker Bridge 网络通信失败问题
在 ARM64 Ubuntu 20.04 上部署 Mailu 邮件服务器:深度排查 Docker Bridge 网络通信失败问题
在私有化部署开源邮件系统 Mailu 的过程中,许多开发者在 ARM64 架构的 Ubuntu 20.04 系统上遇到一个“诡异”现象:容器间网络通信完全失效,即使最小化测试也无法通过,但 host 模式却一切正常。本文将从底层原理出发,完整复现、深度剖析并彻底解决这一问题,为在 ARM64 环境部署容器化应用提供系统性排错指南。
1. 问题背景与环境描述
1.1 部署目标
部署开源邮件服务器 Mailu,基于 Docker Compose,包含 admin、redis、smtp、imap、front 等多个服务,需通过内部网络互联。
1.2 系统环境
- 操作系统:Ubuntu 20.04 LTS
- 架构:ARM64(aarch64)
- Docker 版本:Docker CE 28.1.1(通过官方 APT 仓库安装)
- 部署方式:
docker compose -p mailu up -d
- 关键命令失败:
docker run -it --rm --network test-net redis:7.2-alpine redis-cli -h test-redis PING # → 卡住,无响应,无错误,无超时提示
💡 注意:该环境组合(Ubuntu 20.04 + ARM64 + Docker 28.1.1)在绝大多数场景下是稳定可靠的,问题并非出在“系统不兼容”,而是特定内核模块缺失或网络栈配置异常。
2. 问题现象与初步排查
2.1 最小化复现测试
为排除 Mailu 配置干扰,构建最小化测试环境:
docker network create test-net
docker run -d --name test-redis --network test-net redis:7.2-alpine
docker run -it --rm --network test-net redis:7.2-alpine redis-cli -h test-redis PING
→ 命令执行后无限卡住,无任何输出。
2.2 初步排查结论
- ✅
ping test-redis
能解析出 IP 地址(如192.168.203.2
),说明 DNS 服务正常。 - ❌ 但
ping
包 100% 丢失,telnet test-redis 6379
同样卡住。 - ✅ 在
--network host
模式下,redis-cli -h 127.0.0.1 PING
返回PONG
,说明 Redis 服务本身无问题。 - ✅ 主机网络正常,能访问外网,无防火墙拦截(
ufw
已禁用)。 - ✅ Docker 服务运行正常,非 Snap 安装,使用官方
docker-ce
包。
→ 结论:问题出在 Docker 的 bridge
网络驱动层,容器间通信被内核拦截或丢弃。
3. 深度诊断:内核网络模块缺失
3.1 检查关键内核模块
执行:
lsmod | grep -E "(br_netfilter|overlay|nf_nat|xt_conntrack)"