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

无法从主机连接Docker Compose部署的PostgreSQL容器

Docker Compose下PostgreSQL主机连接失败问题排查与解决

问题描述

我通过Docker Compose运行Django应用与PostgreSQL,已将PostgreSQL端口修改为5433而非默认的5432。容器内的Django应用可通过5433端口连接PostgreSQL数据库,但从主机使用PgAdmin或CLI连接时出现错误:

$ psql -h localhost -p 5433 -U django_user
psql: error: connection to server at "localhost" (::1), port 5433 failed: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

随后我在Docker Compose中添加了PgAdmin,容器内的PgAdmin可正常连接PostgreSQL数据库,但主机仍无法连接。

我的docker-compose.yml文件如下:

version: "3.8"
volumes:
    postgres_data:

services:
    web:
        build:
            context: .
            dockerfile: Dockerfile
            target: local
        container_name: django_backend
        restart: always
        env_file: .env.local
        ports:
            - "8000:8000"
        volumes:
            - .:/app
        depends_on:
            - db
    db:
        image: postgres:latest
        container_name: django_db
        restart: always
        environment:
            - POSTGRES_USER=django_user
            - POSTGRES_PASSWORD=django_pass
            - POSTGRES_DB=django_db
            - PGDATA=/tmp/pgdata
        expose:
            - "5433"
        ports:
            - "5433:5432"
        volumes:
            - postgres_data:/tmp/pgdata
        command: -p 5433
    pgadmin-compose:
        image: dpage/pgadmin4
        container_name: django_pgadmin
        environment:
            PGADMIN_DEFAULT_EMAIL: "admin@django.co"
            PGADMIN_DEFAULT_PASSWORD: "test123!"
        ports:
            - "8085:80"
        depends_on:
            - db

docker-compose ps命令输出:
docker-compose ps输出


问题根源与修复步骤

1. 端口映射配置错误

你的db服务中,ports字段配置的是"5433:5432",但通过command: -p 5433已经让容器内的PostgreSQL运行在5433端口,主机端口5433应该映射到容器内的5433端口,而非默认的5432。

修改db服务的ports配置:

ports:
    - "5433:5433"

2. PostgreSQL监听地址限制

PostgreSQL默认只监听容器内的localhost(127.0.0.1),导致主机无法通过端口映射连接。需要让PostgreSQL监听所有地址(0.0.0.0)。

修改db服务的command,添加-c listen_addresses='*':

command: -p 5433 -c listen_addresses='*'

3. 验证容器内状态(可选)

可以进入PostgreSQL容器,确认服务是否正常运行在5433端口:

docker exec -it django_db psql -U django_user -p 5433

完整修改后的db服务配置

db:
    image: postgres:latest
    container_name: django_db
    restart: always
    environment:
        - POSTGRES_USER=django_user
        - POSTGRES_PASSWORD=django_pass
        - POSTGRES_DB=django_db
        - PGDATA=/tmp/pgdata
    expose:
        - "5433"
    ports:
        - "5433:5433"
    volumes:
        - postgres_data:/tmp/pgdata
    command: -p 5433 -c listen_addresses='*'

修改后重启服务:

docker-compose down && docker-compose up -d

之后再从主机执行连接命令,即可正常连接:

psql -h localhost -p 5433 -U django_user

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:35:27