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

无法通过公网IP访问Docker部署的Django容器8000端口求助

问题原因及解决办法

核心冲突:--network=host 与端口映射参数互斥

当你使用 --network=host 启动容器时,容器会直接共享宿主机的网络命名空间,此时 -p 8000:8000 端口映射参数是完全无效的,Docker不会处理任何端口转发逻辑。结合你的场景,还需要排查以下具体点:

1. 检查EC2宿主机本地防火墙限制

即使安全组和NACL已经放开8000端口,EC2实例的本地防火墙(如iptables或firewalld)仍可能拦截公网流量:

  • 临时关闭防火墙测试:
    # 针对iptables
    sudo iptables -F
    # 针对firewalld
    sudo systemctl stop firewalld
    
  • 若测试有效,永久开放8000端口:
    # firewalld
    sudo firewall-cmd --add-port=8000/tcp --permanent
    sudo firewall-cmd --reload
    # iptables
    sudo iptables -A INPUT -p tcp --dport 8000 -j ACCEPT
    sudo service iptables save
    

2. 确认服务实际监听地址

在EC2宿主机执行以下命令,验证8000端口是否真的监听在所有网卡(0.0.0.0):

netstat -tulpn | grep 8000

如果输出显示监听地址为127.0.0.1:8000,说明Django的启动命令可能被容器启动时的其他配置覆盖,需要检查容器内实际执行的启动命令。

3. 修正容器启动命令

根据你的需求,有两种可行的启动方式:

方式一:移除--network=host,使用端口映射

docker container run -d -p 0.0.0.0:8000:8000 my-central-api

这种方式下,Docker会将宿主机所有网卡的8000端口转发到容器的8000端口,配合安全组配置即可实现公网访问。

方式二:保留--network=host,移除端口映射

docker container run -d --network=host my-central-api

这种方式下,容器直接使用宿主机网络,只需确保宿主机本地防火墙放开8000端口即可。

4. 验证公网IP连通性

在本地执行 ping xx.xxx.xxx.xxx 确认EC2公网IP可正常连通,若ping不通,需检查实例是否分配了弹性IP、是否处于可访问公网的子网(如公有子网)。

内容的提问来源于stack exchange,提问作者emert117

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:50:24