如何让Docker Compose中的php服务访问主机本地3000端口的非容器服务
解决方案
方案1(推荐,改动最小)
你之前添加extra_hosts的配置本身是正确的,无法访问是两个常见配置遗漏导致的:
- 首先确认宿主机3000端口的服务监听地址:
执行命令ss -tulpn | grep :3000,如果返回结果中监听地址为127.0.0.1:3000,说明你的本机服务仅绑定了本地回环接口,Docker网关发起的请求无法被接收。你需要修改本机3000端口服务的启动配置,将监听地址改为0.0.0.0:3000,或者仅监听Docker网段172.16.0.0/12。 - 放行防火墙规则:
Ubuntu默认开启ufw防火墙,执行命令sudo ufw allow in from 172.16.0.0/12 to any port 3000,允许Docker网段的请求访问宿主机3000端口。 - 访问方式说明:
容器内的localhost指向容器本身的网络栈,你需要在php容器内访问http://host.docker.internal:3000即可连通宿主机服务。
方案2(使用host网络)
之前添加network_mode: host报错是因为links参数和host网络冲突,links是Docker早已废弃的旧参数,替换为通用的依赖配置即可:
- 修改php服务的配置:
删掉links: - db配置,替换为depends_on: - db,再保留network_mode: host配置,同时删除你之前添加的3000端口映射规则(host网络不需要端口映射)。 - 适配nginx配置:
由于php服务改用host网络,你的nginx配置中fastcgi_pass的地址需要改为127.0.0.1:9000(如果php-fpm默认监听9000端口),同时如果nginx服务不使用host网络,需要将php-fpm的监听地址改为0.0.0.0:9000,并在nginx配置中将fastcgi_pass地址改为宿主机的Docker网关地址172.17.0.1:9000。 - 访问方式说明:
该配置下php服务和宿主机共享网络栈,直接在容器内访问http://localhost:3000即可连通。
内容的提问来源于stack exchange,提问作者Cyrille
相关产品推荐
相关产品推荐

