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

如何用Docker运行Django项目?构建成功但无法访问8000端口

问题解决方案

1. Django服务绑定地址错误

默认情况下python manage.py runserver只会绑定容器内部的127.0.0.1地址,该地址无法从容器外部访问。
修改run.sh中的启动命令:

python3 manage.py runserver 0.0.0.0:8000

2. Django数据库配置错误

容器内的web服务无法通过localhost访问PostgreSQL服务,需要修改项目settings.py中的DATABASES配置,指向docker-compose中定义的db服务:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': config('POSTGRES_DB'),
        'USER': config('POSTGRES_LOCAL_USER'),
        'PASSWORD': config('POSTGRES_LOCAL_PASSWORD'),
        'HOST': 'db', # 不可填写localhost,必须对应docker-compose中的db服务名
        'PORT': 5432,
    }
}

同时确认.env文件中已经配置了对应的POSTGRES_DB、POSTGRES_LOCAL_USER、POSTGRES_LOCAL_PASSWORD变量。

3. 数据库未就绪就执行迁移操作

depends_on只会控制服务启动顺序,不会等待PostgreSQL完全初始化完成,可能导致migrate执行失败、服务无法启动。因为镜像已经安装了postgresql-client,可以在run.sh开头增加数据库等待逻辑:
修改后的完整run.sh内容:

#!/bin/bash
# 等待PostgreSQL服务就绪
until pg_isready -h db -p 5432 -U $POSTGRES_LOCAL_USER
do
  echo "等待PostgreSQL启动中..."
  sleep 2
done

python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py createsu
python3 manage.py runserver 0.0.0.0:8000

4. run.sh无执行权限

容器内可能没有run.sh的执行权限,两种解决方式二选一即可:

  • 在Dockerfile末尾增加一行RUN chmod +x /code/run.sh
  • 或者修改docker-compose.yml中的command配置为command: bash run.sh

5. ALLOWED_HOSTS配置遗漏

Django默认会校验请求的Host头,需要修改settings.py中的ALLOWED_HOSTS配置,增加本地访问地址:

ALLOWED_HOSTS = ['localhost', '127.0.0.1']
# 测试环境可以临时设置为 ALLOWED_HOSTS = ['*'] 允许所有来源访问

6. 冗余配置清理(可选)

db服务挂载的是本地路径./data/db,但根级volumes中定义的postgres_data没有被使用,可以直接删除该冗余配置避免混淆。


优化建议

makemigrations命令不要放在容器启动脚本中执行,避免生产环境出现非预期的迁移修改,建议在本地开发环境生成好迁移文件后,再提交代码构建镜像,启动脚本只保留migrate命令即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:54:00