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

仅通过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 [你的容器镜像名]
    
  • 如果容器已经在运行,需要先调整配置:
    1. 停止容器:docker stop [容器名/容器ID]
    2. 删除容器:docker rm [容器名/容器ID]
    3. 用新的端口映射重新启动:docker run -d -p 127.0.0.1:8081:8081 [你的容器镜像名]

修改完成后,外部访问http://my.example.com:8081会直接失败,只有Nginx的反向代理能通过localhost正常访问容器。


方法2:用防火墙规则限制8081端口访问

如果不想重新创建容器,可以通过CentOS7的防火墙规则,直接阻止外部请求访问8081端口,只允许本地主机访问。

方案A:使用iptables

  1. 先允许回环接口访问8081端口:
    iptables -A INPUT -i lo -p tcp --dport 8081 -j ACCEPT
    
  2. 拒绝所有外部来源访问8081端口:
    iptables -A INPUT -p tcp --dport 8081 -j DROP
    
  3. 保存规则确保重启后生效:
    iptables-save > /etc/sysconfig/iptables
    
  4. 重启iptables服务:
    systemctl restart iptables
    

方案B:使用firewalld(系统默认防火墙)

如果你的CentOS7用firewalld作为默认防火墙,执行以下命令:

  1. 添加允许本地访问8081的规则:
    firewall-cmd --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port port="8081" protocol="tcp" accept' --permanent
    
  2. 添加拒绝外部访问8081的规则:
    firewall-cmd --add-rich-rule='rule family="ipv4" port port="8081" protocol="tcp" drop' --permanent
    
  3. 重新加载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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:02:30