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

如何通过DATABASE_URL让本地Docker Django容器连接本地PostgreSQL?

本地Docker运行Django容器并连接本地PostgreSQL的步骤

我之前刚好折腾过类似的场景,结合你用dj-database-url的情况,给你一步步梳理操作方法:

1. 先调整本地PostgreSQL的远程访问配置

Docker容器默认在独立的网络环境里,所以本地PostgreSQL需要允许容器所在网络的连接:

  • 找到PostgreSQL的配置文件目录(通常是/var/lib/postgresql/<version>/main/或者/etc/postgresql/<version>/main/)
    • 编辑pg_hba.conf,添加一行:
      host    all             all             0.0.0.0/0             scram-sha-256
      
      (如果你的PostgreSQL版本比较旧,可能用md5代替scram-sha-256)
    • 编辑postgresql.conf,把listen_addresses的值改成'*',允许所有IP访问
  • 重启PostgreSQL服务,比如:
    sudo systemctl restart postgresql
    

2. 构造正确的DATABASE_URL环境变量

因为你的Django用了dj-database-url,所以只需要设置正确的DATABASE_URL环境变量即可,格式是:

postgres://<数据库用户名>:<密码>@<宿主机IP>:5432/<数据库名>

这里要注意:

  • 不要用localhost:容器里的localhost指向容器自身,不是你的本地机器
  • 如果你是Windows或macOS,可以直接用host.docker.internal作为宿主机地址;Linux系统的话,需要用宿主机的局域网IP(比如192.168.x.x),或者给容器添加--network="host"参数(这样容器会共享宿主机网络,此时可以用localhost)

举个例子,假设你的PostgreSQL用户名是postgres,密码是mypassword,数据库名是mysite_db,Windows/macOS下的URL就是:

postgres://postgres:mypassword@host.docker.internal:5432/mysite_db

3. 运行Docker容器时传递环境变量

方式一:直接用docker run命令

如果是直接构建镜像后运行,执行以下命令(替换成你的镜像名和正确的DATABASE_URL):

docker run -e DATABASE_URL="postgres://postgres:mypassword@host.docker.internal:5432/mysite_db" -p 8000:8000 mysite

-p 8000:8000是把容器的8000端口映射到本地,方便你访问Django应用

方式二:用docker-compose(更推荐,方便管理)

创建一个docker-compose.yml文件,内容如下:

version: '3.8'
services:
  web:
    build: .
    environment:
      - DATABASE_URL=postgres://postgres:mypassword@host.docker.internal:5432/mysite_db
    ports:
      - "8000:8000"
    command: python manage.py runserver 0.0.0.0:8000

然后执行docker-compose up --build就能启动容器了

4. 验证连接是否成功

容器启动后,进入容器执行数据库迁移命令,看是否能成功:

docker exec -it <你的容器ID> python manage.py migrate

如果迁移成功,说明数据库连接没问题,你可以访问http://localhost:8000查看本地运行的Django应用了

额外注意事项

  • 确保你已经在本地PostgreSQL中创建了对应的数据库(可以用createdb mysite_db命令创建)
  • 本地开发这么配置没问题,但生产环境不要开放PostgreSQL的远程访问权限,避免安全风险
  • 如果你的settings.py里没有默认的数据库URL,最好加上兜底配置,比如:
    import dj_database_url
    
    DATABASES = {
        'default': dj_database_url.config(
            default='postgres://postgres:postgres@localhost:5432/mysite_db'
        )
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:00:56