如何用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
相关产品推荐
相关产品推荐

