如何远程连接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
相关产品推荐
相关产品推荐

