发布于 2026-01-06 0 阅读
0

从 Docker 容器连接到本地托管的 PostgreSQL 数据库

从 Docker 容器连接到本地托管的 PostgreSQL 数据库

如果您在主机上运行 PostgreSQL 数据库,并希望将其连接到运行在同一主机上的 Docker 容器,则需要遵循以下几个步骤。本文将介绍如何将运行在主机上的 Docker 容器连接到运行在同一主机上的数据库。

先决条件

开始之前,请确保您已准备好以下物品:

  • 主机上已安装 Docker

  • 运行在主机上的数据库

  • 具备Docker和数据库的基础知识

我使用以下方法撰写这篇文章。

  • 操作系统:Debian 11 (bullseye)

  • PostgreSQL:15(托管于 Debian 系统)

  • Docker:服务器应用程序(连接到 PostgreSQL)

  • 我正在使用 docker-compose.yml 构建应用程序。

第一步:

请添加 host.docker.internal:

version: '3'
services:
  bank-server:
    ...
    depends_on:
      ....
    restart: on-failure
    ports:
      - 9090:9090
    extra_hosts:
      - "host.docker.internal:<docker0 IP>"
Enter fullscreen mode Exit fullscreen mode

要查找 Docker IE 的 IP 地址,您可以使用:
$> ifconfig docker0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

Enter fullscreen mode Exit fullscreen mode

或者

$> ip a

1: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

Enter fullscreen mode Exit fullscreen mode

步骤二:

更新 postgresql.conf 中的 listen_addresses 设置。

这将允许 PostgreSQL 监听所有可用的网络接口。

在 postgresql.conf 文件中,将 listen_addresses 改为 listen_addresses = '*'。使用以下命令编辑 postgres 配置。

sudo nano /etc/postgresql/<your_postgres_version>/main/postgresql.conf

步骤 3:

在 pg_hba.conf 文件中添加新条目

在 pg_hba.conf 文件中,添加一个新条目,允许来自所有 IP 地址的连接。

host    all             all             0.0.0.0/0               md5

Enter fullscreen mode Exit fullscreen mode

第四步:

重启 PostgreSQL

修改完成后,使用以下命令重启PostgreSQL服务:

sudo service postgresql restart

第五步:

使用 host.docker.internal 主机名从服务器应用程序连接数据库。

前任:jdbc:postgresql://host.docker.internal:5432/bankDB

如果您在 Ubuntu 系统上遇到 host.docker.internal 主机名无法识别的问题,可以尝试将其替换为本地 Docker IP 地址,通常为 123. 172.17.0.1...

出于安全考虑,始终建议限制数据库访问权限,仅允许必要的 IP 地址访问。使用 Docker 网桥 IP 地址作为允许的 IP 地址,可以确保只有连接到同一网络的容器才能访问数据库。

您可以使用 Docker 网桥 IP 地址(使用 `docker bridge` 命令ip -h -c a查找该 IP 地址)。

这个问题可能还有其他解决方案,但这个解决方案已经过测试和验证,可以与我上面提到的技术及其各自的版本一起使用。

谢谢😀。

文章来源:https://dev.to/21toffy/connect-to-locally-hosted-postgresql-from-a-docker-container-109o