如何通过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,添加一行:
(如果你的PostgreSQL版本比较旧,可能用host all all 0.0.0.0/0 scram-sha-256md5代替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
相关产品推荐
相关产品推荐

