Docker:如何依靠本地数据库而不是数据库泊坞窗容器?

总的来说:我希望我的django应用程序依靠一个docker容器作为我的分贝。 换句话说,当我运行一个图像

docker run -p 8000:8000 -d imagename

我想知道连接到我的本地数据库。 我有我的settings.pyconfiguration为连接到PG数据库,所以一切都很好,当我做类似的事情

python manage.py runserver

随时调用任何不正确的使用某些条款或只是我对docker的整体理解。 所以从我看到的所有教程中,他们通常会创build一个依赖于db-image的docker撰写文件,这个文件将会放在与web应用程序分开的容器中 。 我已经经历的事例: https : //docs.docker.com/compose/django/#connect-the-database,http ://ruddra.com/2016/08/14/docker-django-nginx- postgres /等。在这一点上,我非常失落,因为我不知道我是否在Dockerfile,settings.py或docker-compose.yml中执行此操作(我猜我不应该甚至有这个,因为这是一个多容器的应用程序,我试图避免)。 [另外:最后,只有一个容器能运行一个django应用程序依赖于芹菜和rabbitmq吗? 就像我的pg例子,我只能看到它们都在单独的容器中的实例。]至于我的Dockerfile,这几乎是这样的。

 FROM python:3 ENV APP 'http://githubproj` RUN git clone $APP \ && cd $APP/projectitself \ && pip install -r requirements.txt CMD cd $APP_DIR/mydjangoproject && gunicorn mydjangoproject.wsgi:application --bind 0.0.0.0:8000 

为了让你的容器化的Django应用程序连接到主机上运行的本地数据库,你需要启用来自你的docker接口的传入连接。 你通过在你的本地机器的iptables中包含下面的规则来做到这一点:

 $ sudo iptables -A INPUT -i docker0 -j ACCEPT 

接下来,你必须configuration你的postgres服务器来监听多个地址。 打开/etc/postgresql/<version>/main/postgresql.conf并search包含listen_addresses='localhost的行,然后将其更改为:

 listen_addresses='*' 

完成这些更改后,您应该能够从容器内部连接到本地postgres数据库。

这个答案可能会让你进一步澄清如何从你的容器连接到本地机器。

要从容器连接到主机,您可以使用docker0桥的IP地址。 在主机上运行ifconfig来查找docker0 IP地址(我相信默认是172.17.0.1 )。 然后连接到你的容器内。

这显然不是超级主机可移植的,因为IP可能在机器之间改变,所以包装器脚本可能对于find并将IP注入到容器中是有用的。

更好的是,postgres在一个容器! :p

此外,如果连接到远程postgres然后只提供远程实例的IP(没有不同于常规的互连在这里)。