无法从主机连接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命令输出:
问题根源与修复步骤
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
相关产品推荐
相关产品推荐

