如何将Docker化的pgAdmin连接到Docker外的PostgreSQL服务器
解决Docker部署的pgAdmin连接本地PostgreSQL的问题
针对你遇到的Docker版pgAdmin无法连接Ubuntu VPS上原生PostgreSQL的问题,按以下步骤排查修复:
1. 修正PostgreSQL监听地址配置
PostgreSQL的listen_addresses需要监听可被Docker容器访问的地址,而非固定的容器IP(容器IP重启后可能变化):
- 编辑PostgreSQL配置文件(替换
<version>为你的PostgreSQL版本,如14):sudo nano /etc/postgresql/<version>/main/postgresql.conf - 修改监听地址为允许所有IP访问,或指定VPS的内网/公网IP:
listen_addresses = '*' - 重启PostgreSQL服务生效:
sudo systemctl restart postgresql
2. 配置pg_hba.conf允许Docker容器访问
pg_hba.conf控制PostgreSQL的访问权限,必须添加允许Docker子网或主机IP的规则:
- 编辑配置文件:
sudo nano /etc/postgresql/<version>/main/pg_hba.conf - 添加以下规则(允许Docker默认子网
172.17.0.0/16的所有IP访问,认证方式用scram-sha-256,与PostgreSQL默认配置一致):
或如果使用host all all 172.17.0.0/16 scram-sha-256host.docker.internal,可添加VPS内网IP的访问规则:host all all <你的VPS内网IP>/32 scram-sha-256 - 重启PostgreSQL服务:
sudo systemctl restart postgresql
3. 修正Docker启动命令的参数顺序
你之前的docker run命令参数顺序错误,--restart always和--add-host属于Docker运行参数,必须放在镜像名之前,否则不会生效:
docker run --name pg-admin-4 \ -e "PGADMIN_DEFAULT_EMAIL=myemail" \ -e "PGADMIN_DEFAULT_PASSWORD=mypass" \ -d -p 5050:80 \ --restart always \ --add-host host.docker.internal:host-gateway \ dpage/pgadmin4
如果之前已经创建了容器,先删除旧容器再重新运行:
docker stop pg-admin-4 && docker rm pg-admin-4
4. 确认VPS防火墙配置
确保PostgreSQL的5432端口允许Docker子网或指定IP访问:
- 若使用ufw防火墙,允许Docker子网访问:
sudo ufw allow from 172.17.0.0/16 to any port 5432 - 若使用公网IP连接,需开放公网访问(建议搭配SSL使用):
sudo ufw allow 5432/tcp
5. pgAdmin连接参数设置
在pgAdmin界面添加服务器时:
- 主机地址填写
host.docker.internal(需确保--add-host参数生效),或VPS的内网IP/公网IP - 端口保持默认的
5432 - 填写PostgreSQL的合法用户名和密码(如
postgres用户及对应密码)
内容的提问来源于stack exchange,提问作者Davi Davi Amrico Amrico
相关产品推荐
相关产品推荐

