Docker:如何依赖本地数据库而不是db docker容器?

时间:2017-06-17 19:05:48

标签: django postgresql docker docker-compose dockerfile

总体而言:我希望我的django应用程序依赖docker容器作为我的数据库。换句话说,当我运行图像时

docker run -p 8000:8000 -d imagename

我希望这知道连接到我的本地数据库。我将settings.py配置为连接到pg db,所以当我执行类似

的操作时一切正常

python manage.py runserver

随意调出任何错误使用某些术语或仅仅是我对码头工具的整体理解。因此,在我所看到的所有教程中,他们通常会创建一个依赖于db-image的docker compose文件,该文件将在与Web应用程序分开的容器中分离出来。我经历过的事情的例子: https://docs.docker.com/compose/django/#connect-the-databasehttp://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

2 个答案:

答案 0 :(得分:1)

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

这显然不是超级主机可移植的,因为IP可能会在机器之间发生变化,因此包装脚本可能对查找并将该IP注入容器非常有用。

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

此外,如果连接到远程postgres,那么只需提供远程实例的IP(与此处的常规互连没有区别)。

答案 1 :(得分:0)

为了让容器化的Django应用程序连接到主机中运行的本地数据库,您需要启用docker接口的传入连接。您可以通过在本地计算机的iptables中包含以下规则来实现此目的:

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

接下来,您必须配置postgres服务器以侦听多个地址。打开/etc/postgresql/<version>/main/postgresql.conf并搜索包含listen_addresses='localhost的行,并将其更改为:

listen_addresses='*'

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

This回答可能会让您进一步说明如何从容器连接到本地计算机。