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

无法远程连接AWS EC2上Docker部署的PostgreSQL问题排查

无法从本地连接AWS EC2上Docker部署的PostgreSQL问题排查

可能的问题及解决方法

1. AWS安全组未正确开放5432端口

即使你认为端口已开放,仍需重新验证:

  • 进入AWS EC2控制台,找到目标实例对应的安全组
  • 检查入站规则:是否添加了TCP协议、端口5432,来源为0.0.0.0/0(测试用,允许所有IP)或你的本地公网IP(更安全)
  • 若缺少该规则,添加后再尝试连接

2. EC2实例操作系统防火墙限制

EC2的操作系统(如Amazon Linux、Ubuntu)可能自带防火墙,阻断了5432端口:

  • 登录EC2实例,执行命令检查防火墙状态:
    # Amazon Linux/CentOS
    sudo firewall-cmd --list-ports
    # Ubuntu/Debian
    sudo ufw status
    
  • 若5432端口未开放,添加规则:
    # Amazon Linux/CentOS
    sudo firewall-cmd --add-port=5432/tcp --permanent
    sudo firewall-cmd --reload
    # Ubuntu/Debian
    sudo ufw allow 5432/tcp
    sudo ufw reload
    

3. PostgreSQL配置未真正生效

你手动修改的配置可能因Docker volume特性,在容器重启后被覆盖,或未正确加载:

  • 进入容器验证配置是否存在:
    docker exec -it prod-db grep "listen_addresses" /var/lib/postgresql/data/postgresql.conf
    docker exec -it prod-db grep "host all all 0.0.0.0/0" /var/lib/postgresql/data/pg_hba.conf
    
  • 若配置不存在,建议直接在Docker Compose中通过挂载自定义配置文件的方式设置,避免手动修改后被覆盖:
    修改docker-compose.yml:
    version: '3.8'
    services:
      prod-db:
        image: postgres:13-alpine
        environment:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: mypassword
        volumes:
          - production_data:/var/lib/postgresql/data
          - ./script.sql:/docker-entrypoint-initdb.d/create_script.sql
          - ./postgresql.conf:/var/lib/postgresql/data/postgresql.conf
          - ./pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf
        ports:
          - "5432:5432"
    volumes:
      production_data:
    
    然后在本地创建postgresql.conf(写入listen_addresses = '*')和pg_hba.conf(写入host all all 0.0.0.0/0 md5),再重启容器。

4. 连接字符串或认证信息错误

  • 确认JDBC连接字符串中的数据库名称与script.sql中创建的完全一致,无拼写错误
  • 确认连接时使用的用户名是postgres、密码是mypassword,与Docker Compose配置的环境变量一致
  • 可先用psql命令测试连接,排除JDBC代码问题:
    psql -h <EC2公网IP> -p 5432 -U postgres -d <数据库名称>
    

5. EC2公网IP变更或网络可达性问题

  • 确认你使用的EC2公网IP是当前有效的,若未绑定弹性IP,EC2重启后公网IP会变更
  • 在本地执行以下命令测试端口可达性:
    telnet <EC2公网IP> 5432
    # 或
    nc -zv <EC2公网IP> 5432
    
    • 若显示连接失败,说明网络层面(安全组、防火墙)仍有问题
    • 若显示连接成功,再排查PostgreSQL的配置和认证问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:03:15