Docker部署Django应用:localhost访问400错误,127.0.0.1正常
Django + Docker 访问异常问题排查
问题场景
Windows10环境下,Docker部署Django应用后容器运行正常,但访问表现异常:
- 访问
http://localhost:8000返回400 Bad Request - 访问
http://127.0.0.1:8000可正常打开 - 访问
0.0.0.0:8000无法建立连接
用户提供的配置文件
Dockerfile
FROM python:3.11 # setup env variables ENV PYTHONBUFFERED=1 ENV DockerHOME=/app/django-app # Expose port EXPOSE 8000 # create work dir RUN mkdir -p $DockerHOME # set work dir WORKDIR $DockerHOME # copy code to work dir COPY . $DockerHOME # install dependencies RUN pip install -r requirements.txt # move working dir to where manage.py is WORKDIR $DockerHOME/flag_games # set default command (I thinkk) ENTRYPOINT ["python"] # run commands for app to run CMD ["manage.py", "collectstatic", "--noinput"] CMD ["manage.py", "runserver", "0.0.0.0:8000"]
Makefile
docker-build: docker build --tag docker-django . docker-run: docker run -d -p 8000:8000 --name flag-game docker-django
settings.py 关键配置
ALLOWED_HOSTS = ['127.0.0.1', '0.0.0.0'] # 其余配置省略...
问题分析与解决
1. localhost:8000 返回400的原因
Django的ALLOWED_HOSTS用于校验请求的Host头,当前配置里没有包含localhost,当请求的Host是localhost:8000时,Django会直接拒绝请求返回400。
修复方法:修改settings.py的ALLOWED_HOSTS,添加localhost:
ALLOWED_HOSTS = ['127.0.0.1', '0.0.0.0', 'localhost']
2. 0.0.0.0:8000 无法连接的原因
0.0.0.0是容器内部的监听地址,代表服务监听容器所有网络接口,但它不是一个可在主机上直接访问的地址。在Windows主机上,你需要用localhost或127.0.0.1来访问Docker映射到主机的端口,直接访问0.0.0.0:8000本身就不符合网络访问逻辑,属于概念误解。
3. Dockerfile的隐藏问题
Dockerfile中如果写了多个CMD指令,只会执行最后一个,所以你写的collectstatic命令实际上没有被执行。
修复方法:将两个命令合并,用shell串联执行,修改Dockerfile最后部分:
ENTRYPOINT ["sh", "-c"] CMD ["python manage.py collectstatic --noinput && python manage.py runserver 0.0.0.0:8000"]
验证步骤
- 完成上述两处配置修改
- 重新构建镜像:
make docker-build - 重新启动容器:
make docker-run - 测试访问:
curl http://localhost:8000应返回200状态码curl http://127.0.0.1:8000保持正常访问
内容的提问来源于stack exchange,提问作者mike_gundy123
相关产品推荐
相关产品推荐

