Docker部署Nginx容器无报错但无法访问页面问题排查
根据你描述的情况——容器启动日志无异常、配置文件校验通过,但访问时完全无法建立连接,我整理了几个实用的排查方向,你可以逐一验证:
端口占用与主机防火墙限制
首先确认主机的80/443端口没有被其他服务占用,在主机上执行:netstat -tulpn | grep :80 netstat -tulpn | grep :443如果有其他进程(比如本地Nginx、Apache)占用端口,要么停止这些服务,要么修改容器端口映射(比如改成
8080:80)。另外还要检查主机防火墙(firewalld/iptables)是否放行这两个端口,比如firewalld可以执行:firewall-cmd --add-service=http --permanent firewall-cmd --add-service=https --permanent firewall-cmd --reload自定义配置的监听规则缺失
日志里提到默认的default.conf不存在,而你挂载了自己的conf.d目录,要确认这个目录下的配置文件里至少有一个server块监听80或443端口。比如会不会所有配置都只针对特定域名,或者监听了非标准端口?可以进入容器查看/etc/nginx/conf.d/下的所有文件内容:docker exec -it production_nginx cat /etc/nginx/conf.d/*.conf如果没有任何监听80/443的server块,Nginx虽然能正常启动,但不会对外提供服务,自然无法连接。
容器网络配置冲突
你的容器加入了三个自定义网络,有可能这些网络的子网和主机网络冲突,或者docker的网络桥接出现异常。可以先临时修改docker-compose.yml,去掉额外的networks配置,只保留默认网络,然后重启容器测试是否能访问。如果恢复正常,再逐个排查自定义网络的配置问题,用docker network inspect source_network查看子网、网关等信息是否合理。容器内部端口监听状态
尽管配置校验通过,还是可以进入容器确认Nginx真的在监听端口:docker exec -it production_nginx ss -tulpn | grep nginx如果输出里没有
0.0.0.0:80或[::]:80这类监听记录,说明配置里的监听规则没有生效,需要检查配置文件里的listen指令是否正确(比如有没有写错端口、或者绑定了特定IP而不是0.0.0.0)。挂载目录的权限问题
你挂载了多个主机目录到容器,要确认容器内的nginx用户有读取这些目录的权限。比如检查conf.d目录的权限:docker exec -it production_nginx ls -l /etc/nginx/conf.d/如果文件权限是
root:root且没有其他用户的读取权限,Nginx可能无法加载配置——虽然nginx -t能通过(因为是用root执行的),但实际运行时用nginx用户会有问题。可以调整主机上的目录权限,比如chmod -R 755 /var/home/core/docker/nginx/conf.d/。Docker服务异常
有时候docker的网络组件会出现临时异常,试试重启docker服务:sudo systemctl restart docker重启后重新启动容器,看是否能恢复正常。
内容的提问来源于stack exchange,提问作者just_user

