Docker部署Python Socket服务遇ConnectionRefusedError求助
解决Docker中Python Socket服务连接被拒绝的问题
问题根源
- 服务端绑定地址受限:原代码中
SERVER = socket.gethostbyname(socket.gethostname())仅绑定容器内部的私有IP,该地址仅在Docker内部网络有效,宿主机或外部客户端无法直接访问。 - Docker端口未映射:未将容器内的服务端口映射到宿主机,导致外部请求无法转发到容器内的服务。
- 客户端连接地址错误:客户端若在宿主机运行,直接使用容器IP无法建立连接;若在Docker内运行,未与服务端容器处于同一网络也会导致连接失败。
修复步骤
1. 修改服务端绑定地址
将服务端的SERVER变量改为0.0.0.0,让服务监听容器内所有网络接口,允许外部通过映射端口访问:
HEADER = 64 PORT = 5050 SERVER = '0.0.0.0' # 修改此处 ADDR = (SERVER, PORT) FORMAT = 'utf-8' DISCONNECTED_MESSAGE = "!DISCONNECT" # 后续代码保持不变
2. 启动Docker容器时映射端口
运行容器时使用-p参数,将容器的5050端口映射到宿主机的对应端口(示例中使用相同端口):
docker run -p 5050:5050 your-python-server-image
3. 调整客户端连接地址
根据客户端运行环境选择对应配置:
- 客户端在宿主机运行:将
SERVER改为宿主机IP或localhost(依赖端口映射):SERVER = 'localhost' # 或宿主机实际IP,如192.168.1.100 ADDR = (SERVER, 5050) - 客户端在Docker容器运行:
- 创建自定义Docker网络:
docker network create socket-network - 启动服务端容器时加入网络:
docker run -p 5050:5050 --network socket-network --name socket-server your-python-server-image - 客户端代码中
SERVER改为服务端容器名称(socket-server),Docker会自动解析为容器IP:SERVER = 'socket-server' ADDR = (SERVER, 5050) - 启动客户端容器时加入同一网络:
docker run --network socket-network your-python-client-image
- 创建自定义Docker网络:
4. 验证服务状态
启动服务端容器后,查看日志确认服务监听地址:
docker logs socket-server
应看到[LISTENING] Server is listening on 0.0.0.0的输出。
内容的提问来源于stack exchange,提问作者Sahar Zamanian
相关产品推荐
相关产品推荐

