一台 PC 作为家用服务器使用,上面使用 Docker 跑了若干容器。
由于防火墙和透明代理配置的需要,需要部分容器使用独立 IP 来跑,并在相关规则中添加这些 IP 的规则。 于是我开始使用 Docker 提供的 macvlan 功能,创建了一个 macvlan 类型的 network ,相关容器配置使用这个 network ,并指定独立 IP 。
容器创建出来后是可以按照预期运行的,在其他设备访问这些 IP 也都可以正确访问到这些容器。
问题是在这些容器开始建立一些网络连接后,这些容器就会变得不可访问,直到连接断开才重新恢复访问。容器本身的运行状态正常(无闪退、死机)。其他非 macvlan 容器访问正常。
举个例子,用容器跑 aria2 或 transmission ,没有任务的时候可以正常访问,添加任务后,当任务与一定数量节点建立联系后,aria2 或 transmission 的 RPC API 就无法访问,直到任务完成后又恢复访问。
不光从容器外部访问会失联,使用 docker exec 进入到正在运行的容器内部,执行 curl 127.0.0.1 也会失联或延迟数十秒返回结果。
如何排查问题可能出在哪?
系统情况:
- 平台:AMD64
- 宿主系统:Debian 11
- 内核版本:5.10.0-25-amd64
- Docker 版本:24.0.6
- containerd 版本:1.6.24
- runc 版本:1.1.9
- docker-init 版本:0.19.0
- 网卡接口 MTU:1500
- Docker 内 macvlan 网络 MTU:1400 ( com.docker.network.driver.mtu )
- ulimit:1048576
- sysctl net.core.somaxconn:4096
- /proc/sys/net/ipv4/tcp_max_syn_backlog:4096

