docker中的hosthost和postgres之间的区别

时间:2017-06-19 16:13:16

标签: django postgresql docker docker-compose

我正在开发一个django应用程序并尝试在docker中运行它。我有一个到目前为止我无法理解的问题。使用docker-compose运行应用程序时,{i} {{}}应用程序在使用这些配置时似乎无法连接到数据库:

web

但是一旦我将主机更改为DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'my_db', 'USER': 'my_user', 'PASSWORD': '', 'HOST': 'localhost', 'PORT': '5432', } ,它就可以了。像这样

postgres

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'my_db', 'USER': 'my_user', 'PASSWORD': '', 'HOST': 'postgres', 'PORT': '5432', } postgres之间有什么区别?一个是在没有和在docker内部发布而不在我的mac中的开发环境中运行而另一个是相反的。

localhost

2 个答案:

答案 0 :(得分:2)

Docker Compose实际上将所有linked个容器的主机名相互添加。

在你的机器上,postgres数据库实际上是在localhost中运行的,这就是你拥有localhost主机名的原因。

在撰写时,它在postgres容器中运行,主机名为postgres,这就是您拥有postgres主机名的原因。

如果需要,您可以在主机文件中创建一个条目,将postgres重定向到localhost,然后您就必须在任何地方使用postgres

答案 1 :(得分:2)

默认情况下,每个docker容器都附带自己的网络命名空间。该命名空间包括它自己的私有环回接口,也就是localhost。它们还连接到docker内部的网络,在这些网络中,它们拥有自己的内部DNS条目,并且可以与同一网络上的其他容器进行通信。

当您在具有桥接网络的容器内运行应用程序时,localhost将指向容器,而不是您正在运行的docker主机。要使用的主机名取决于您的方案:

  • 要与其他容器对话,请使用DNS中的容器名称。
  • 如果它是由docker-compose启动的,请使用服务名称使用DNS循环与该服务中的一个容器对话。
  • 如果它在群集模式内启动,您可以使用其中的服务名称转到VIP循环负载均衡的VIP到提供该服务的所有容器。
  • 如果您需要与docker主机本身交谈,请使用docker主机的非环回IP地址。