Docker环境下PHP连接Socket服务器报[111]连接被拒绝求助
问题解决:Docker容器间Socket连接被拒绝
核心原因
- 容器内localhost不指向其他容器:在
php-tutorial容器中,127.0.0.1指的是容器自身,而非websocket-server容器,所以连接请求会被自身容器拒绝。 - PHP开发服务器监听范围受限:当前
websocket-server的启动命令指定监听127.0.0.1,仅允许容器内部访问,其他容器无法连接。
具体修复步骤
1. 修改Docker Compose配置,让WebSocket服务器监听所有接口
更新docker-compose.yml中websocket-server的command字段,将监听地址改为0.0.0.0:
services: websocket-server: build: . command: php -S 0.0.0.0:1000 -t /var/www/html/websocket volumes: - ./src:/var/www/html ports: - 1000:1000 php-tutorial: build: . volumes: - ./src:/var/www/html ports: - 7000:80
2. 修改PHP连接代码,使用服务名访问WebSocket服务器
将PHP代码中的连接地址从127.0.0.1替换为Docker Compose服务名websocket-server:
<?php $socket = socket_create(AF_INET, SOCK_STREAM, 0); if (socket_connect($socket, 'websocket-server', 1000) === false) { echo "Unable to connect to server\n"; exit; } socket_write($socket, "Hello, server!"); $response = socket_read($socket, 1024); echo "Response from server: $response\n"; socket_close($socket);
原理说明
- Docker Compose默认会为所有服务创建一个共享网络,同一网络内的容器可以直接通过服务名称互相访问,无需依赖宿主机IP或localhost。
- 将PHP开发服务器的监听地址改为
0.0.0.0,允许来自容器外部(包括其他容器、宿主机)的连接请求。
内容的提问来源于stack exchange,提问作者Niloy Rony
相关产品推荐
相关产品推荐

