You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker通过CMD启动PHP服务时主机报Connection reset by peer错误

问题诱因

连接重置和Python服务无关,是两个配置错误叠加自定义启动脚本导致的:

  • 端口映射和实际监听端口不匹配:最初使用官方php:7-apache镜像时,内置Apache默认监听容器80端口,因此docker-compose中"70:80"的配置可以将主机70端口流量转发到容器内的Apache服务,访问正常。但你替换启动逻辑后,用PHP内置开发服务器监听的是容器70端口,原有端口映射依然将流量转发到没有服务运行的容器80端口,主机访问自然无法连通。容器内curl 127.0.0.1:70能正常获取内容,已经证明服务本身在容器内运行正常,问题出在端口转发链路。
  • 自定义脚本覆盖了官方镜像的默认启动逻辑:官方php:7-apache镜像默认的apache2-foreground启动命令做了信号转发、日志输出、权限适配等预配置,你直接用bash脚本替换默认入口后,没有对接这些预配置,就算端口配对,后续也可能出现容器异常退出、日志不输出等问题。
  • 额外笔误:你Dockerfile里的依赖安装命令写的是bash /other_service/install_dependenci172.17.0.1es.sh,文件名中混入了Docker默认网桥IP172.17.0.1,构建镜像时会报找不到文件的错误,需要修正为正确的脚本名。
修复方案

二选一即可:

方案1:保留PHP内置开发服务器(仅适合本地开发)

修改docker-compose中web服务的端口映射配置,将"70:80"改为"70:70",让主机70端口的流量直接转发到容器内PHP服务监听的70端口。

注意:PHP内置开发服务器是单线程设计,仅适合本地调试使用,绝对不能用于生产环境,并发请求稍高就会直接卡住。

方案2:改回Apache服务(生产环境推荐)

保留原有"70:80"的端口映射,修改launch.sh脚本,后台启动Python服务后,用官方镜像自带的命令前台启动Apache:

#!/bin/bash
# 后台启动Python服务
(cd /other_service && python3 /other_service/start.py &)
# 前台启动Apache,保持容器常驻,使用官方预配置的80端口监听
exec apache2-foreground

脚本里加exec是为了让Apache接管bash的PID 1,正确接收Docker发送的停止、重启信号,避免容器出现僵尸进程。

最佳实践建议

不推荐在单个容器内同时运行PHP、Python两个业务服务,Docker原生设计为单容器单进程,多进程共存在同一个容器中时,进程异常退出无法被Docker感知自动重启、日志收集困难、资源无法独立隔离、版本升级会互相影响。更合理的做法是把Python服务也单独做成一个镜像,作为compose中的独立服务和web服务并列,两个服务通过Docker内部网桥通信即可。

内容的提问来源于stack exchange,提问作者Ciro García

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:09:17