Docker部署PostgreSQL连接异常求助:服务器意外终止
问题分析与解决步骤
1. 立即修正:密码不匹配
你的docker-compose.yml中PostgreSQL的密码是postgres,但连接字符串里写的是postgres123,这是直接导致认证失败的潜在问题,先把连接字符串改成:
engine = create_tables_for_voting.create_tables("postgresql+psycopg2://postgres:postgres@db:5432/voting")
2. 服务名db无法解析的原因
只有当你的应用和PostgreSQL容器在同一个Docker网络(即app网络)中时,才能用服务名db访问。如果你的应用是在宿主机本地运行的,DNS根本找不到db这个主机,这时候必须用localhost连接。
3. localhost:5433连接失败的原因
PostgreSQL默认只监听容器内的5432端口,你在docker-compose.yml里映射的5433:5433完全无效——因为容器内没有服务在5433端口监听。
解决端口问题的两种方案:
方案A:直接用默认端口映射(宿主机5432→容器5432)
- 先检查宿主机5432端口是否被占用:
netstat -ano | findstr :5432 # Windows lsof -i :5432 # Linux/macOS - 如果端口未被占用,直接用
localhost:5432连接:engine = create_tables_for_voting.create_tables("postgresql+psycopg2://postgres:postgres@localhost:5432/voting") - 如果端口被占用,修改端口映射为宿主机5433→容器5432:
在docker-compose.yml的ports字段改成:
然后重新启动容器,用ports: - "5433:5432"localhost:5433连接。
方案B:修改PostgreSQL配置监听5433端口(不推荐,没必要)
如果一定要让容器内PostgreSQL监听5433,需要挂载自定义的postgresql.conf配置文件,修改port = 5433,这属于多余操作,优先用方案A。
4. 验证容器状态
先确保PostgreSQL容器正常运行且健康:
- 查看容器状态:
确认docker-compose psdb服务的状态是Up (healthy)。 - 查看容器启动日志,排查是否有初始化错误:
如果日志里有类似docker-compose logs dbdatabase system is ready to accept connections的信息,说明容器正常启动。
5. 应用在Docker容器中的额外配置
如果你的应用也是用Docker Compose部署的容器,需要给应用服务添加相同的网络配置:
your-app-service: # 其他配置... networks: - app
这样应用容器就能通过服务名db:5432访问PostgreSQL了。
内容的提问来源于stack exchange,提问作者The one who doesn't know 1012
相关产品推荐
相关产品推荐

