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

如何远程连接DigitalOcean Droplet中Docker运行的PostgreSQL数据库

问题:本地通过DBeaver连接DigitalOcean Droplet上Docker容器内的PostgreSQL失败

环境与现状

  • 在DigitalOcean Droplet的Docker容器中运行Airflow和PostgreSQL,Airflow可正常向PostgreSQL写入数据
  • SSH登录Droplet后,能通过docker exec -it <mycontainer> bash进入容器,使用psql查询数据库
  • 容器已暴露5433端口,Droplet防火墙无问题(可通过Droplet地址+对应端口访问Airflow UI)

问题现象

尝试从本地用DBeaver连接数据库4小时未成功:

  • 配置SSH隧道后连接失败,报错:

The connection attempt failed.
EOFException
java.io.EOFException

  • 不使用SSH隧道时提示Connection Refused

已尝试的连接参数(建立SSH隧道后)

username: postgres
password: mypassword
database: postgres
port: 5433
host: 已尝试"localhost"和"172.20.0.2"

附postgres容器的docker-compose配置

version: '3.8'
services:
  jupyter_notebook:
    image: "jupyter/minimal-notebook"
    container_name: ${CONTAINER_NAME:-jupyter_notebook}
    environment:
      JUPYTER_ENABLE_LAB: "yes"
    ports:
      - "8888:8888"
    volumes:
      - ${PWD}:/home/jovyan/work
    depends_on:
      - db
    links:
      - db
    networks:
      - adu_network
  db:
    image: postgres:15.2
    restart: always
    environment:
      - "POSTGRES_USER=${POSTGRES_USER}"
      - "POSTGRES_PASSWORD=${POSTGRES_PASSWORD}"
      - "POSTGRES_PORT=${POSTGRES_PORT}"
      - "POSTGRES_HOST=${POSTGRES_HOST}"
    ports:
      - "5433:5433"
    expose:
      - "5433"
    networks:
      - adu_network
    volumes: 
      - ./data:/var/lib/postgresql/data
      - ./adu_db.sql:/docker-entrypoint-initdb.d/init.sql
volumes:
  db:
    driver: local
  
networks:
  adu_network: null 

解决步骤

1. 修正PostgreSQL容器的端口映射

PostgreSQL默认监听容器内的5432端口,当前docker-compose映射的是5433:5433,但容器内Postgres大概率未修改默认端口,这是核心问题:

  • 修改db服务的端口映射为"5433:5432"(将Droplet的5433端口映射到容器默认的5432端口)
  • 或在db服务的环境变量中明确设置POSTGRES_PORT=5433,确保容器内Postgres监听5433端口

2. SSH隧道建立后的正确连接参数

隧道生效后,本地端口会转发到Droplet的5433端口,此时参数配置如下:

  • host: localhost(隧道将本地请求转发到Droplet的5433端口,本地访问localhost即可)
  • port: 你在DBeaver SSH隧道中设置的本地转发端口(比如设为5434,不要直接用5433避免冲突)
  • 用户名、密码、数据库名保持原设置:postgres、mypassword、postgres

3. DBeaver SSH隧道配置要点

  • SSH主机:DigitalOcean Droplet的公网IP
  • SSH端口:22(默认SSH端口)
  • SSH用户名:Droplet的登录用户名(如root或自定义普通用户)
  • 认证方式:优先选密钥认证(比密码更稳定)
  • 端口转发:类型选Local,源主机填localhost,源端口设为本地连接用的端口(如5434),目标主机填localhost,目标端口填5433(Droplet上映射的Postgres端口)

4. 验证与重启

  • SSH登录Droplet后,执行nc -zv localhost 5433,确认端口可被访问
  • 检查容器状态:docker ps,确保db容器处于Up状态
  • 修改docker-compose后,执行docker-compose down && docker-compose up -d重启容器,使配置生效

额外检查

确认PostgreSQL的pg_hba.conf配置允许postgres用户从Droplet本地连接(SSH隧道连接本质是Droplet本地访问容器,默认配置已允许,若有修改需确保规则正确)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:57:43