必须同时配置自定义Bridge网络与宿主机端口映射:一、创建子网网络docker network create --subnet=192.168.200.0/24 php-network;二、两容器均加入该网络并挂载相同宿主机路径/var/run/php以共享socket;三、Nginx用fastcgi_pass unix:/var/run/php/php-fpm.sock通信;四、Nginx容器需-p 8000:80暴露端口供外部访问。

要让Docker里的PHP-FPM和Nginx容器稳定通信、外部能访问Web服务,必须同时处理容器间直连和宿主机端口暴露两件事——只做端口映射会导致Nginx无法解析PHP-FPM服务名,只建自定义网络又会让浏览器打不开localhost:8000。
创建自定义Bridge网络实现容器互访
第一步:执行命令创建带子网的自定义网络,避免与默认bridge冲突:
docker network create --subnet=192.168.200.0/24 --gateway=192.168.200.1 php-network
第二步:启动PHP-FPM容器并加入该网络,同时挂载代码和socket目录:
docker run -d --name php-fpm --network php-network -v /var/www:/app -v /var/run/php:/var/run/php bitnami/php-fpm:8.3
第三步:启动Nginx容器,同样加入php-network,并挂载相同socket路径:
docker run -d --name nginx --network php-network -p 8000:80 -v /var/www:/usr/share/nginx/html -v /var/run/php:/var/run/php nginx:alpine
立即学习“PHP免费学习笔记(深入)”;
这一步关键在【两个容器必须挂载同一宿主机路径到/var/run/php】,否则Nginx找不到php-fpm.sock文件。如果只用TCP连接(如fastcgi_pass 172.17.0.2:9000),就失去Unix socket零拷贝优势,且IP可能随重启变化。
配置Nginx使用Unix域套接字连接PHP-FPM
方法一:修改Nginx配置文件,将fastcgi_pass指向本地socket文件:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
方法二:确认PHP-FPM已监听该socket路径——进入php-fpm容器执行:
cat /usr/local/etc/php-fpm.d/www.conf | grep listen
输出应为listen = /var/run/php/php-fpm.sock,而不是listen = 9000
注意:若PHP-FPM配置中listen.owner或listen.group权限不匹配Nginx运行用户(如www-data),会导致502 Bad Gateway。可临时用chmod 666 /var/run/php/php-fpm.sock验证,但生产环境应统一UID/GID。
暴露端口供外部访问
① 使用-p参数显式映射:docker run时加-p 8000:80,表示宿主机8000端口转发到容器80端口。
② 限制绑定IP地址(增强安全性):-p 127.0.0.1:8000:80,这样只有本机可访问,防止局域网其他设备直连。
③ 映射UDP端口(如需PHP扩展用UDP上报监控):-p 9501:9501/udp,注意expose指令不等于映射,【expose只声明端口,不触发实际映射】,必须用-p或-P才生效。
④ 查看映射结果:docker port nginx,输出80/tcp -> 127.0.0.1:8000说明映射成功。



















