我试图为这个博客安装自我托管的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。