仅通过Nginx反向代理允许访问Docker端口
解决禁止直接访问Docker容器8081端口的问题
我来帮你搞定这个问题——你现在遇到的核心问题是Docker默认把8081端口绑定到了主机的所有网卡(0.0.0.0:8081),所以外部可以直接绕过Nginx访问容器。下面有两种简单可行的解决方案,优先推荐第一种,因为更简洁直观:
方法1:修改Docker端口映射(推荐)
让容器的8081端口只绑定到主机的回环接口(127.0.0.1),这样只有本地的Nginx能访问它,外部请求根本碰不到这个端口。
- 如果容器还没启动,启动时替换端口映射部分:
docker run -d -p 127.0.0.1:8081:8081 [你的容器镜像名] - 如果容器已经在运行,需要先调整配置:
- 停止容器:
docker stop [容器名/容器ID] - 删除容器:
docker rm [容器名/容器ID] - 用新的端口映射重新启动:
docker run -d -p 127.0.0.1:8081:8081 [你的容器镜像名]
- 停止容器:
修改完成后,外部访问http://my.example.com:8081会直接失败,只有Nginx的反向代理能通过localhost正常访问容器。
方法2:用防火墙规则限制8081端口访问
如果不想重新创建容器,可以通过CentOS7的防火墙规则,直接阻止外部请求访问8081端口,只允许本地主机访问。
方案A:使用iptables
- 先允许回环接口访问8081端口:
iptables -A INPUT -i lo -p tcp --dport 8081 -j ACCEPT - 拒绝所有外部来源访问8081端口:
iptables -A INPUT -p tcp --dport 8081 -j DROP - 保存规则确保重启后生效:
iptables-save > /etc/sysconfig/iptables - 重启iptables服务:
systemctl restart iptables
方案B:使用firewalld(系统默认防火墙)
如果你的CentOS7用firewalld作为默认防火墙,执行以下命令:
- 添加允许本地访问8081的规则:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port port="8081" protocol="tcp" accept' --permanent - 添加拒绝外部访问8081的规则:
firewall-cmd --add-rich-rule='rule family="ipv4" port port="8081" protocol="tcp" drop' --permanent - 重新加载firewalld规则:
firewall-cmd --reload
额外确认:你的Nginx配置没问题
检查了一下你提供的Nginx配置,这部分是完全正确的:
proxy_pass http://localhost:8081;确保Nginx通过本地回环访问容器,符合我们的限制要求- 80端口的server块已经把HTTP请求强制跳转到HTTPS,完美实现了仅通过HTTPS访问的需求
最后测试一下:访问http://my.example.com:8081应该无法打开,而https://my.example.com能正常跳转至容器应用。
内容的提问来源于stack exchange,提问作者RicP
相关产品推荐
相关产品推荐

