使用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中无法连接,求原因及解决办法。
原因分析
- 启动命令语法错误:
podman run命令中,-v /opt/Docker/volumes/postgresql:/var/lib/postgresql/data行末尾缺少反斜杠(\),导致后续-e参数被解析为挂载命令的一部分,可能造成环境变量未正确加载。 - 网络与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网段的连接,因此触发权限错误。
- Podman默认端口映射监听IPv6地址(
- 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允许桥接网段连接
进入运行中的容器修改配置:
- 进入容器:
podman exec -it postgresql bash
- 修改
postgresql.conf,设置监听所有地址:
sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" /var/lib/postgresql/data/postgresql.conf
- 修改
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
- 重启容器生效:
podman restart postgresql
可选:持久化配置方案
若需长期保留配置,可在本地创建配置文件并挂载到容器:
- 在本地目录(如
/opt/Docker/postgres-config)创建postgresql.conf(设置listen_addresses = '*')和pg_hba.conf(添加10.0.2.0/24网段的连接规则)。 - 启动容器时挂载配置:
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
相关产品推荐
相关产品推荐

