无法连接GCP Ubuntu虚拟机Docker容器中的PostgreSQL数据库
GCP Ubuntu 18.04虚拟机Docker PostgreSQL公网IP连接超时排查方案
问题场景
我在GCP创建的Ubuntu 18.04虚拟机中,以Docker容器运行PostgreSQL数据库。已将容器5432端口映射到虚拟机5432端口,配置了防火墙规则(先后尝试本地IP和0.0.0.0作为源范围),容器可正常运行。使用虚拟机localhost或私有IP能正常连接,但使用公网IP时连接超时。通过sudo lsof -i -P -n | grep LISTEN和sudo netstat -tulpn | grep LISTEN检查发现5432端口处于监听状态,但执行telnet <公网IP>:5432时无响应,无法排查原因。创建容器的命令为:
docker container create \ --name container_name \ -p 5432:5432 \ -h container_name \ -e POSTGRES_PASSWORD=password \ postgres
排查与解决步骤
修正PostgreSQL绑定配置
PostgreSQL默认仅监听容器内部的localhost,即使做了端口映射,外部也无法访问。需修改容器内的PostgreSQL配置:- 进入容器:
docker exec -it container_name bash - 定位配置文件路径(可通过
psql -U postgres -c 'SHOW config_file;'查看准确路径,以PostgreSQL 14为例,路径为/var/lib/postgresql/14/main/) - 修改
postgresql.conf,设置监听所有IP:sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" /var/lib/postgresql/<版本号>/main/postgresql.conf - 修改
pg_hba.conf,添加允许所有IP连接的规则:echo "host all all 0.0.0.0/0 scram-sha-256" >> /var/lib/postgresql/<版本号>/main/pg_hba.conf - 重启容器:
docker restart container_name
- 进入容器:
确认GCP防火墙规则有效性
确保GCP层面的防火墙规则正确配置:- 登录GCP控制台,进入「VPC网络」→「防火墙」
- 检查是否存在允许入站TCP 5432端口的规则,源范围设为
0.0.0.0/0(或你需要的IP段) - 确认规则的「目标标签」或「目标网络」包含你的虚拟机,且规则处于「已启用」状态,未被高优先级的拒绝规则覆盖
检查虚拟机本地防火墙(ufw)
Ubuntu默认可能启用ufw,会拦截外部请求:- 查看ufw状态:
sudo ufw status - 若启用,添加允许5432端口的规则:
sudo ufw allow 5432/tcp - 重载ufw使规则生效:
sudo ufw reload
- 查看ufw状态:
验证Docker端口映射监听地址
确认Docker端口映射绑定到所有IP而非仅localhost:
执行docker port container_name 5432,正常输出应为0.0.0.0:5432或:::5432。若输出为127.0.0.1:5432,需重新创建容器时显式指定绑定所有IP:docker container create \ --name container_name \ -p 0.0.0.0:5432:5432 \ -h container_name \ -e POSTGRES_PASSWORD=password \ postgres
内容的提问来源于stack exchange,提问作者Talib
相关产品推荐
相关产品推荐

