如何将Docker容器内的Django应用暴露至公网IP?
你的Django容器公网暴露配置检查与补充环节
首先,你当前的gunicorn启动命令是没问题的:
exec gunicorn --bind 0.0.0.0:${PORT:-8000} --timeout 120 wtools2.wsgi:application
绑定0.0.0.0确保容器内的服务能接收来自外部的请求,端口用环境变量也很灵活,这部分是正确的。但要让公网能正常访问,还需要补充以下关键操作:
Docker Compose端口映射配置
必须在docker-compose.yml里添加端口映射,把容器内的端口(比如默认8000)映射到宿主机的端口,示例配置:services: your-django-service: # 其他配置(build、volumes等) ports: - "80:8000" # 宿主机80端口映射到容器8000端口,外部用公网IP直接访问 # 或者用 "8000:8000",外部访问公网IP:8000没有这一步,宿主机的公网IP无法把请求转发到容器内部。
服务器防火墙/安全组放行端口
- Linux服务器本地防火墙:如果用
ufw,执行ufw allow 80(或者你映射的端口);如果用iptables,添加对应端口的放行规则。 - 云服务器安全组:如果是阿里云、AWS等云主机,必须在控制台的安全组规则里,允许外部访问你映射的端口(比如80、8000),来源设置为
0.0.0.0/0(公网所有IP)。
- Linux服务器本地防火墙:如果用
Django ALLOWED_HOSTS配置
修改Django项目的settings.py,把你的公网IP、域名(如果有)加入ALLOWED_HOSTS:ALLOWED_HOSTS = ['xxx.xxx.xxx.xxx', 'your-domain.com']生产环境不要用
ALLOWED_HOSTS = ['*'],会有安全风险。如果不配置,Django会拒绝来自公网IP的请求,返回400错误。生产环境优化建议
直接用gunicorn暴露到公网不是最佳实践,建议搭配Nginx做反向代理:- Nginx负责处理静态文件(Django的
collectstatic生成的文件)、SSL证书(用Let's Encrypt免费证书开启HTTPS)、请求转发到gunicorn。 - 示例Nginx配置可以监听80/443端口,把请求转发到
localhost:8000(对应宿主机映射的端口)。
- Nginx负责处理静态文件(Django的
敏感信息管理
确保Django的SECRET_KEY、数据库连接信息等敏感内容,通过Docker Compose的environment字段或者.env文件注入,不要硬编码到代码里,避免泄露。
内容的提问来源于stack exchange,提问作者Usman Rafiq
相关产品推荐
相关产品推荐

