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

Docker容器间通信异常:Django应用无法连接Postgres数据库

Django+Postgres Docker Compose 主机名解析错误解决方案

以下是针对django.db.utils.OperationalError: could not translate host name "postgres" to address: Name or service not known错误的排查和解决步骤:

  • 确认服务名称与Django配置匹配
    确保docker-compose.yml中Postgres服务的名称为postgres,且Django的数据库主机配置完全对应这个名称。示例docker-compose.yml片段:

    services:
      postgres:
        image: postgres:15
        environment:
          POSTGRES_USER: your_user
          POSTGRES_PASSWORD: your_pass
          POSTGRES_DB: your_db
      web:
        build: .
        command: gunicorn your_project.wsgi:application --bind 0.0.0.0:8000
        environment:
          DB_HOST: postgres
          DB_USER: your_user
          DB_PASSWORD: your_pass
          DB_NAME: your_db
    
  • 解决服务启动顺序问题
    depends_on仅保证Postgres先启动,但不确保其就绪。给Postgres添加健康检查,让Django在数据库完全就绪后启动:

    postgres:
      image: postgres:15
      environment:
        # 保留原有环境变量
      healthcheck:
        test: ["CMD-SHELL", "pg_isready -U your_user -d your_db"]
        interval: 5s
        timeout: 5s
        retries: 5
    web:
      # 保留原有配置
      depends_on:
        postgres:
          condition: service_healthy
    
  • 验证Django数据库配置
    检查app/settings/dev.py中的数据库配置,确保HOST字段使用服务名:

    import os
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': os.environ.get('DB_NAME'),
            'USER': os.environ.get('DB_USER'),
            'PASSWORD': os.environ.get('DB_PASSWORD'),
            'HOST': os.environ.get('DB_HOST'),  # 值应为"postgres"
            'PORT': '5432',
        }
    }
    
  • 禁用手动固定IP配置
    Docker Compose默认会为项目创建专属桥接网络,支持服务名解析。删除任何手动指定的固定IP配置,让服务自动加入默认网络。

  • 检查容器网络归属
    运行docker compose ps确认两个服务容器均处于运行状态,再通过以下命令验证它们在同一网络:

    docker inspect <web_container_id> | grep Networks
    docker inspect <postgres_container_id> | grep Networks
    
  • 测试容器内DNS解析
    进入web容器执行DNS查询,验证能否解析postgres:

    docker compose exec web nslookup postgres
    

    如果解析失败,尝试重启Docker服务,或检查Docker的DNS配置是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:49:50