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

使用Podman部署PostgreSQL后,无法从主机连接容器端口求助

问题

使用Podman启动PostgreSQL容器,执行命令:

podman run \
    -d \
    --name=postgresql \
    -v /opt/Docker/volumes/postgresql:/var/lib/postgresql/data
    -e POSTGRES_DB=admin \
    -e POSTGRES_USER=admin \
    -e POSTGRES_PASSWORD=adminpass \
    -p 5432:5432 \
    postgres:latest

尝试从主机连接:

psql -U admin -W -h 127.0.0.1 admin

Podman网络信息:

podman network ls
NETWORK ID    NAME        VERSION     PLUGINS
2f259bab93aa  podman      0.4.0       bridge,portmap,firewall,tuning

PostgreSQL日志报错:

podman logs -f postgresql 
2024-04-09 15:41:01.784 UTC [29] FATAL:  no pg_hba.conf entry for host "10.0.2.100", user "admin", database "admin", no encryption

主机端口状态:

netstat -nltpua 2>/dev/null | grep -i 5432
tcp6       0      0 :::5432                 :::*                    LISTEN      146245/containers-r

相同命令在Docker中可正常运行,Podman中无法连接,求原因及解决办法。

原因分析
  1. 启动命令语法错误:podman run命令中,-v /opt/Docker/volumes/postgresql:/var/lib/postgresql/data行末尾缺少反斜杠(\),导致后续-e参数被解析为挂载命令的一部分,可能造成环境变量未正确加载。
  2. 网络与PostgreSQL权限不匹配:
    • Podman默认端口映射监听IPv6地址(:::5432),当主机通过127.0.0.1连接时,流量会通过Podman桥接网络(10.0.2.0/24网段)转发到容器,此时容器收到的请求来源是10.0.2.100。
    • PostgreSQL默认的pg_hba.conf仅允许本地(127.0.0.1/32)无加密连接,未配置允许10.0.2.0/24网段的连接,因此触发权限错误。
  3. Docker与Podman网络差异:Docker端口映射默认同时监听IPv4和IPv6,本地回环流量处理逻辑更直接;而Podman默认桥接网络会将本地回环连接转发到桥接网段,导致连接来源地址变化。
解决办法

步骤1:修正启动命令语法

确保每个参数行末尾都有反斜杠,并强制Podman监听IPv4地址:

podman run \
    -d \
    --name=postgresql \
    -v /opt/Docker/volumes/postgresql:/var/lib/postgresql/data \
    -e POSTGRES_DB=admin \
    -e POSTGRES_USER=admin \
    -e POSTGRES_PASSWORD=adminpass \
    -p 0.0.0.0:5432:5432 \
    postgres:latest

步骤2:配置PostgreSQL允许桥接网段连接

进入运行中的容器修改配置:

  1. 进入容器:
podman exec -it postgresql bash
  1. 修改postgresql.conf,设置监听所有地址:
sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" /var/lib/postgresql/data/postgresql.conf
  1. 修改pg_hba.conf,添加允许10.0.2.0/24网段的加密连接:
echo "host    all             all             10.0.2.0/24            scram-sha-256" >> /var/lib/postgresql/data/pg_hba.conf
  1. 重启容器生效:
podman restart postgresql

可选:持久化配置方案

若需长期保留配置,可在本地创建配置文件并挂载到容器:

  1. 在本地目录(如/opt/Docker/postgres-config)创建postgresql.conf(设置listen_addresses = '*')和pg_hba.conf(添加10.0.2.0/24网段的连接规则)。
  2. 启动容器时挂载配置:
podman run \
    -d \
    --name=postgresql \
    -v /opt/Docker/volumes/postgresql:/var/lib/postgresql/data \
    -v /opt/Docker/postgres-config/postgresql.conf:/var/lib/postgresql/data/postgresql.conf \
    -v /opt/Docker/postgres-config/pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf \
    -e POSTGRES_DB=admin \
    -e POSTGRES_USER=admin \
    -e POSTGRES_PASSWORD=adminpass \
    -p 0.0.0.0:5432:5432 \
    postgres:latest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:25:01