如何从Docker容器外部连接其中的PostgreSQL数据库?
如何从Docker容器外部连接其中的PostgreSQL数据库?
别担心,你的问题一点都不傻——很多刚开始接触Docker的朋友都会踩类似的配置坑!我来帮你一步步排查解决:
首先看你的docker-compose配置,这里有个关键错误:PostgreSQL的默认端口是5432,但你在ports里写的是33306:3306,而3306是MySQL的默认端口,容器里的PostgreSQL根本没在3306端口运行,这就导致你本地API连过去的时候找不到服务!
第一步:修正Docker端口映射
修改你的docker-compose.yml里的db服务端口配置:
ports: - 33306:5432
这样就把本地的33306端口,映射到容器内PostgreSQL实际使用的5432端口了。
第二步:重启Docker容器
先停掉当前运行的容器,再重新启动:
docker-compose down docker-compose up -d
第三步:确认API的数据源配置
你的数据源URL端口是对的(33306),现在端口映射修正后,这个配置应该可以正常连接了:
spring.datasource.url=jdbc:postgresql://127.0.0.1:33306/sa
顺便确认下数据源的用户名(postgres)和密码(root)是否和docker-compose里的环境变量配置一致。
额外排查点(如果还是连不上)
- 检查本地33306端口有没有被其他程序占用:
- Mac/Linux用命令:
lsof -i :33306 - Windows用命令:
netstat -ano | findstr :33306
- Mac/Linux用命令:
- 用Adminer验证容器内数据库状态:访问
http://127.0.0.1:8081,选择PostgreSQL,服务器填db(因为Adminer和数据库容器在同一个Docker网络),输入用户名postgres、密码root、数据库名sa,看看能不能正常登录。 - 确认本地防火墙没有阻止33306端口的访问。
备注:内容来源于stack exchange,提问作者Yass




