如何从容器外部连接 Docker 里运行的 PostgreSQL?

启动容器时用 -p 5432:5432 映射端口并设 POSTGRES_PASSWORD,外部用 psql -h 宿主机 -p 5432 -U 用户 连接;注意认证配置与数据卷持久化。本文给出完整步骤。

最佳实践
如何从容器外部连接 Docker 里运行的 PostgreSQL?封面

核心步骤:启动容器时映射端口 docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=密码 --name pg postgres:16,之后外部用任意 PostgreSQL 客户端连接:psql -h 宿主机IP -p 5432 -U postgres -d postgres。两个前提不能少:端口映射 + 密码环境变量。

完整示例

docker run -d \
  --name pg \
  -p 5432:5432 \
  -e POSTGRES_PASSWORD=secret123 \
  -e POSTGRES_DB=mydb \
  -v pg-data:/var/lib/postgresql/data \
  postgres:16
  • -p 5432:5432:宿主 5432 → 容器 5432(宿主 5432 被占用就换 -p 15432:5432
  • POSTGRES_PASSWORD:官方镜像必填,不设容器起不来
  • -v pg-data:...:数据卷持久化,不挂卷容器一删数据全没

从外部连接

# 本机
psql -h 127.0.0.1 -p 5432 -U postgres -d mydb

# 局域网其他机器
psql -h 192.168.1.10 -p 5432 -U postgres -d mydb

应用连接串:postgresql://postgres:secret123@192.168.1.10:5432/mydb

容器间连接(另一回事)

另一个容器要连它,不用映射端口,接到同一网络用容器名:

docker network create appnet
docker run -d --name pg --network appnet -e POSTGRES_PASSWORD=secret123 postgres:16
docker run -d --name app --network appnet -e DB_HOST=pg myapp

应用里连 pg:5432(Docker 内置 DNS 解析容器名)。

常见问题排查

  1. 连不上(connection refused):确认容器在跑(docker ps)、端口映射存在(docker port pg)。
  2. 认证失败:密码就是 POSTGRES_PASSWORD 设的值;改了密码但对已初始化的数据卷无效(密码在首次初始化时写入,需清空卷重建或进库 ALTER USER)。
  3. 能 TCP 连但报 no pg_hba.conf entry:默认配置对映射场景一般没问题;改过配置的话检查容器内 pg_hba.conf 的 host 规则。

观测云对照

数据库可观测同步配好。 库起来后用 DataKit 的 PostgreSQL 集成采集指标与日志(慢查询、连接数、锁等待),监控器对关键指标告警,别等出了问题才想起来接。

常见问题(FAQ)

Q:生产环境能把数据库跑在 Docker 里吗?
A:可以,但务必挂卷、配备份、评估高可用方案;不少团队生产库仍选云 RDS 或独立部署。

Q:改配置(如 max_connections)怎么生效?
A:启动命令追加参数:postgres:16 -c max_connections=200,或挂载自定义 postgresql.conf。

Q:端口映射后宿主机 5432 被占用冲突?
A:换宿主端口 -p 15432:5432,连接时对应改 -p 参数。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台