如何从docker容器中访问主机数据库(Ubuntu)

674 阅读2分钟

我试图为这个博客安装自我托管的Plausible分析,但被卡住了,因为我目前的服务器已经安装了一个PostgreSQL数据库。我想让Plausible analytics的docker容器访问主机数据库,而不是启动另一个数据库容器,在Stack Overflow上搜索了答案,但似乎都没有用。

这篇文章的重点是PostgreSQL数据库,并假设你在Ubuntu上使用docker,并打开了UFW防火墙。

假设你已经在你的主机上安装了一个数据库服务器(PostgreSQL),端口为5432,用于监听连接。

第一步是要求PostgreSQL监听所有地址,编辑位于**/etc/postgresql/10/main/postgresql.conf**的PostgreSQL配置文件(用你的postgresql的版本替换10)。

nano /etc/postgresql/10/main/postgresql.conf

在连接和验证块中找到listen_addresses(大约第60行),将其值改为 "*",以监听所有地址而不是localhost,因为docker容器将使用172.16.0.0/12私有IP范围而不是127.0.0.1进行连接:

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'

然后按 "ctrl+x "并保存。

接下来,编辑位于**/etc/postgresql/10/main/pg_hba.conf**的PostgreSQL客户端验证配置文件:

nano /etc/postgresql/10/main/pg_hba.conf

滚动到#IPv4本地连接部分,将""#IPv4本地连接 "下面的一行改为这样:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             172.16.0.0/12            md5

这将允许所有来自172.16.0.0/12子网的IP地址连接到你的数据库(这是局域网的私有IP范围,不提供给全球互联网使用,所以不用担心黑客的远程访问)。

然后按 "ctrl+x "并保存。

我们必须重新启动PostgreSQL服务,使其使用更新的配置值。

sudo service postgresql restart

接下来,在UFW防火墙上创建一个新规则,允许从172.16.0.0/12私有子网连接到5432端口。

sudo ufw allow from 172.16.0.0/12 to any port 5432

现在我们要得到主机的IP地址,这是docker容器用来连接到主机的地址。(127.0.0.1在这里不起作用,因为使用这个意味着指的是docker容器本身,而不是实际的主机,除非你改变一些网络模式,我发现这有点复杂)。

在主机上,运行ifconfig ,获取网络信息。你应该看到有一个docker0适配器:

docker0: flags=4099  mtu 1500
inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
ether 02:42:bd:6f:e6:46  txqueuelen 0  (Ethernet)

172.17.0.1是主机的IP地址,从docker容器的角度来看。

要连接到主机的数据库,在docker容器内,使用这个postgreSQL URL:

postgres://db_user:db_password@172.17.0.1:5432/db_name

这就是了!

免责声明:不是说这是最佳实践或什么,我只是在写这篇文章之前,出于挫折感而了解了几天Docker和Docker Compose。