为了跑 Wisper 语音转文字服务, 我买了一个新的 4070TI显卡的主机.不想大改其他既有的东西, 所以就使用了 docker 的 overlay network 来连接两个机器.

但是, 发现: 节点能加入 swarm, 但是无法加入 network.看日志报错:

Error response from daemon: attaching to network failed, make sure your network options are correct and check manager logs: context deadline exceeded.

根据提示, 尝试去看 docker 本身的日志.日志很长,而且默认从前到后, 翻了好几页,终于不耐烦; 于是又找了一个从后往前, 总是看最新100条日志的方法:

journalctl -xu docker.service -n 100 -f --no-pager

关键日志:

Nov 29 19:14:27 devhome dockerd[937]: time=”2023-11-29T19:14:27.505124802+09:00” level=error msg=”Error in responding to bulk sync from node 192.168.132.144: failed to send a TCP message during bulk sync: dial tcp 192.168.132.144:7946: i/o timeout”

进一步分析:

# 在 Leader 节点测试端口(NG)
telnet 192.168.132.144 7946

# 在worker节点本身测试.(OK)
telnet localhost 7946

说明大概率是防火墙的问题:

sudo ufw status

防火墙确实是打开了, 并且只放行了 22 端口.

解决方法就是,关闭防火墙:

sudo ufw disable

快速测试下是否可以加入 overlay network:(OK)

docker run --name=hello-world --network $some-network-overlay hello-work

有点奇怪! 我查询了文档, Ubuntu的防火墙默认应该是关闭的.可能是设置某些东西的时候, 不小心开启了.也不排除 desktop 和 server版 ,各自的防火墙默认设置不一样. 暂时不想进一步查. 如果后续再遇到什么诡异的问题, 可能就靠谱全部改成 server 版 ubuntu.

在这个问题的过程中, 还发现 两个节点的 docker engine 的版本不一样.顺便也修改了下:

# 在另一个机器上安装指定版本的 docker.ref: https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

VERSION_STRING=5:23.0.5-1~ubuntu.22.04~jammy
sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin