Docker Compose容器间访问5001端口报connection refused排查
你的Docker Compose网络配置本身没有问题:同自定义bridge网络下可以通过服务名解析到容器IP,ping server能通已经证明网络层连通性、DNS解析都是正常的。出现connection refused、nmap显示端口全关闭,说明请求已经到达server容器的网络栈,但对应端口没有进程对外提供服务,直接返回了RST重置包,核心问题几乎都是server端服务的监听地址配置错误。
第一步:确认server容器内端口实际监听状态
先在宿主机执行命令进入server容器:docker exec -it wanderingreader-server-1 /bin/sh容器内执行以下命令查看5001端口的监听情况:
# 有netstat的话用这个 netstat -tulpn | grep 5001 # 镜像里没装netstat的话用ss ss -tulpn | grep 500190%以上的场景你会看到输出里的监听地址是
127.0.0.1:5001——这就是问题所在:服务只绑定了容器内部的回环地址,只有容器自身的进程能访问这个端口,其他容器、宿主机的流量都会被拒绝。第二步:修改server服务的监听配置
找到你server端服务的启动配置,把绑定地址从127.0.0.1改成0.0.0.0(即绑定容器内所有网卡),常见Python服务的改法参考:- Flask:启动参数改为
app.run(host='0.0.0.0', port=5001) - Uvicorn/FastAPI:启动命令加
--host 0.0.0.0参数,即uvicorn 你的启动文件:app --host 0.0.0.0 --port 5001 - 其他框架:检查启动代码/配置文件里的bind、host相关配置,确保不是绑定127.0.0.1
修改后重新构建、启动server容器,再进容器执行上面的netstat/ss命令,确认监听地址显示为0.0.0.0:5001即可。
- Flask:启动参数改为
第三步:注意正确的访问方式
从client容器访问server服务时,地址直接写http://server:5001即可,不要写localhost:5001或者127.0.0.1:5001——这两个地址指向的是client容器自身,不是server服务。
你配置里的ports字段作用是把容器端口映射到宿主机,供宿主机或外部网络访问,同Docker自定义网络内的容器互访完全不需要依赖ports配置,就算把server下的ports段全部删掉,只要服务正确监听0.0.0.0,client一样可以正常访问。
内容的提问来源于stack exchange,提问作者Ant

