让我试着解释一下我所做的事情。
Postgresql
首先,我进行了必要的配置,以确保我的Postgres数据库可以接受来自外部的连接。
打开pg_hba.conf
文件,在结尾添加以下行:
host all all 0.0.0.0/0 md5
打开 postgresql.conf
文件,查找 listen_addresses
并像这样进行修改:
listen_addresses = '*'
请确保上面的行没有被注释掉#
-> 重启你的数据库
注意:这不是生产环境下的推荐配置。
接下来,我查找了我的主机ip
。我使用本地主机127.0.0.1
,但容器看不到它,所以运行容器时会出现该连接被拒绝的消息。 在网上进行长时间搜索后,我发现容器可以看到您本地网络的内部ip
(路由器分配给连接到它的每个设备的那个地址,我不是在说让您访问互联网的那个IP
)。因此,我打开了一个终端并执行了以下操作:
查找本地网络ip
打开终端或CMD
(MacOS / Linux)
$ ifconfig
(Windows)
$ ipconfig
这个命令将显示您的网络配置信息。
并且长这样:
en4:
ether d0:37:45:da:1b:6e
inet6 fe80::188d:ddbe:9796:8411%en4 prefixlen 64 secured scopeid 0x7
inet 192.168.0.103 netmask 0xffffff00 broadcast 192.168.0.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (100baseTX <full-duplex>)
status: active
寻找处于活动状态的一个。
在我的情况下,我的本地网络IP是192.168.0.103
完成上述步骤后,运行容器。
Docker
使用--add-host
参数运行容器,像这样:
$ docker run --add-host=aNameForYourDataBaseHost:yourLocalNetWorkIp --name containerName -di -p HostsportToBind:containerPort imageNameOrId
在我的情况下,我做了以下操作:
$ docker run --add-host=db:192.168.0.103 --name myCon -di -p 8000:8000 myImage
我正在使用 Django
,所以 8000
端口是默认的。
Django 应用程序
访问数据库的配置如下:
在 settings.py
文件中。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': ‘myDataBaseName',
'USER': ‘username',
'PASSWORD': '123456',
'HOST': '192.168.0.103',
'PORT': 5432,
}
}
参考资料
-p
标志说明:
使用网络端口映射进行连接
关于 docker run
命令:
Docker run 文档
有趣的文章:
Docker Tip #35: 连接到运行在 Docker 主机上的数据库
pg_hba.conf
更改为您建议的地址,但在停止和重新启动 postgres 服务后仍然收到相同的连接错误消息。我已在我的 ipv4 连接下添加了该行 - 我是否应该在其他地方添加您建议的地址?或者,在运行于 Docker 中的 QGIS 应用程序中,我需要更改 postgres 连接信息吗?例如,如果我从 Docker 容器内部连接,主机仍然是“localhost”吗? - marty_clocalhost
并不是你的Docker容器内部的主机系统。尝试连接主机系统的公共IP地址。为了保持容器的可移植性,你也可以使用--add-host=database:<host-ip>
启动容器,并在Docker容器内使用database
作为主机名连接到你的PostgreSQL主机。 - helmbert/etc/postgresql/9.3/main/postgresql.conf
并将我的服务器的eth0
IP 地址添加到listen_addresses
中。默认情况下,listen_addresses
仅绑定到本地主机上。 - Dzamo Norton172.17
,172.20
等)的人,请将以下内容放入您的pg_hba.conf
文件中:host all all 172.0.0.0/8 md5
- GerardJP