从 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>"
要查找 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
或者
$> 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
步骤二:
更新 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
第四步:
重启 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