-
问题现象
-
docker compose up -d显示milvus-standalone已启动,但很快从docker ps中消失。 -
docker ps -a显示:1
milvus-standalone Exited (134)
-
说明 Milvus 启动后异常退出。
-
-
查看 Milvus 日志
1
docker logs milvus-standalone
关键输出:
1
2
3
4init with etcd failed
error="context deadline exceeded"
panic: failed to create etcd client: context deadline exceeded说明根因是:
1
Milvus → etcd:2379 连接超时
不是 Milvus 本身启动参数问题。
-
排除 OOM
1
2docker inspect milvus-standalone \
--format 'OOM={{.State.OOMKilled}} Exit={{.State.ExitCode}}'输出:
1
OOM=false Exit=134
说明不是内存不足。
-
验证 etcd 自身是否正常
1
2docker exec milvus-etcd \
etcdctl --endpoints=http://127.0.0.1:2379 endpoint health输出:
1
127.0.0.1:2379 is healthy
说明:
1
etcd 服务本身正常
-
验证 Docker DNS
从同一个milvus网络启动临时容器:1
2
3
4
5docker run --rm \
--network milvus \
--entrypoint /bin/sh \
milvusdb/milvus:v2.5.14 \
-c 'getent hosts etcd'得到:
1
172.18.0.3 etcd
说明:
1
2Docker DNS 正常
etcd 名称可以正确解析 -
验证容器间 TCP 通信
1
curl http://etcd:2379/health
结果:
1
2connect to 172.18.0.3:2379 failed
Connection timed outMinIO 同样:
1
minio:9000 → timeout
所以可以确定:
1
2
3DNS 正常
服务正常
但 Docker 容器之间的网络转发被阻断 -
检查 Docker 网络
1
docker network inspect milvus
得到:
1
2
3subnet: 172.18.0.0/16
minio: 172.18.0.2
etcd: 172.18.0.3网络配置本身正常。
-
检查 iptables
普通iptables:1
sudo iptables -S FORWARD
显示
ACCEPT,但同时提示:1
iptables-legacy tables present
因此继续检查:
1
sudo iptables-legacy -S FORWARD
得到:
1
-P FORWARD DROP
并且现有规则只放行:
1
docker0
没有放行自定义 Docker bridge:
1
milvus → 172.18.0.0/16
最终根因:
1
2
3
4
5系统同时存在 iptables-nft 和 iptables-legacy。
iptables-legacy 的 FORWARD 默认策略是 DROP,
并且只放行 docker0,
导致 milvus 自定义 bridge 网络中的容器互相访问被丢弃。 -
解决方法
临时放行milvus网络内部通信:1
2
3
4sudo iptables-legacy -I FORWARD 1 \
-s 172.18.0.0/16 \
-d 172.18.0.0/16 \
-j ACCEPT或者
1 | SUBNET=$(docker network inspect milvus \ |
再测试:
1
curl http://etcd:2379/health
成功返回,MinIO 也恢复访问。
最后启动 Milvus:
1
docker start milvus-standalone