自定义Nginx Docker容器仅本地可访问,公网无法连接的问题求助
自定义Nginx Docker容器仅本地可访问,公网无法连接的问题求助
各位大佬好,我最近在Vultr的Ubuntu 22.10虚拟机上折腾自定义Docker镜像跑Nginx托管网站,遇到了个卡壳的问题,来请大家帮忙排查下!
环境与前置验证
- 虚拟机是Vultr上的Ubuntu 22.10,为了排查已经关掉了iptables
- 当我停掉Docker容器、启动本地原生Nginx服务时,公网访问
mysite.com:80(这是我真实测试域名的替代名)完全正常,能加载网站内容
我的配置与操作流程
Dockerfile内容:
FROM ubuntu RUN apt-get update RUN apt-get install -y nginx RUN rm /var/www/html/index.nginx-debian.html COPY index.html /var/www/html/index.html COPY /pictures/ /var/www/html/pictures/ COPY mysite.conf /etc/sites-enabled/mysite.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
Nginx站点配置mysite.conf:
server { listen 80; server_name mysite.com; root /var/www/html; }
镜像构建与容器启动命令:
docker build -t mysite_nginx . docker run -p 80:80 -d mysite_nginx
问题现象
- 在容器所在虚拟机上执行
curl localhost,能正常拿到index.html内容,说明容器内的Nginx是正常工作的 - 但用本地笔记本浏览器访问公网域名
mysite.com时,直接报错:mysite.com refused to connect. ERR_CONNECTION_REFUSED - 我原本以为做了
80:80的端口映射,公网访问虚拟机IP/域名就能直达容器内的网站,但现在只有主机本地能访问,公网完全连不上
我搜了不少StackOverflow上的类似问题,但大多是端口映射非80:80的情况,或者报错不是“连接被拒绝”,那些解决方案似乎都不适用我的场景。如果需要补充更多信息,大家可以告诉我要查哪些内容!
自己初步想到的排查方向(还没完全验证)
- 检查容器内Nginx是否监听
0.0.0.0:80,而不是仅127.0.0.1:可以用docker exec <容器ID> netstat -tulpn查看监听地址 - 确认Vultr云服务商的安全组/防火墙是否开放了80端口:毕竟本地iptables关了,但云层面的防火墙可能默认拦截外部80访问
- 查看容器日志是否有Nginx启动异常:用
docker logs <容器ID>检查配置文件是否有语法错误或者路径问题 - 尝试直接用虚拟机公网IP访问,排除域名解析的问题:比如访问
http://<虚拟机公网IP>,看是否同样报错 - 确认Docker端口映射是否绑定到
0.0.0.0:在主机上执行netstat -tulpn,看80端口是否被docker-proxy监听了所有网卡地址
备注:内容来源于stack exchange,提问作者crabpeople
相关产品推荐
相关产品推荐

