【问题标题】:difference between localhost and postgres for host in dockerdocker中主机的localhost和postgres之间的区别
【发布时间】:2017-11-21 22:51:43
【问题描述】:

我正在开发一个 django 应用程序并尝试在 docker 中运行它。我有一个到目前为止我无法理解的问题。在使用docker-compose 运行应用程序时,当我使用这些配置时,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',
    }

postgreslocalhost 有什么区别。一个是在没有 docker 的情况下运行,而不是在我的 mac 的开发环境中运行,另一个是相反的。

# docker-compose.yml    
version: '3'

    services:
      db:
        image: postgres
        expose: 
          - "5432"
      web:
        build: .
        command: python3 manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db

【问题讨论】:

  • 你确定 docker-compose.yml 对应于你的配置 'HOST': 'postgres'?
  • 我不确定我是否理解您的意思?
  • 我的意思是,查看您的 docker-compose.yml 似乎不可能使用“postgres”作为主机名而不是“db”。如果它确实有效,我们缺少一些重要的配置来理解孔图。
  • 唯一丢失的文件是 Dockerfile。这是 docker 网站上提供的标准版本。我猜它不相关
  • 这个:'HOST': 'postgres' 永远不会解析到任何使用提供的 docker-compose.yml 的 IP。这将:'HOST': 'db'

标签: django postgresql docker docker-compose


【解决方案1】:

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

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

  • 要与其他容器通信,请使用 DNS 中的容器名称。
  • 如果它是由 docker-compose 启动的,则使用服务名称通过 DNS 循环与该服务中的容器之一进行通信。
  • 如果它是在 swarm 模式下启动的,您可以使用那里的服务名称转到一个 VIP,该 VIP 将循环负载平衡到提供该服务的所有容器。
  • 如果您需要与 docker 主机本身通信,请使用 docker 主机的非环回 IP 地址。

【讨论】:

  • 我仍然不明白为什么他会得到一个 DNS 为 "postgres" 是它的服务名称 "db"
  • @Robert 好点,我们遗漏了一些关键细节。可能是设置容器名称的行,或者正在运行的完全不同的容器。
【解决方案2】:

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

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

在 Compose 中,它在 postgres 容器中运行,主机名为 postgres,这就是为什么你有 postgres 主机名。

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

【讨论】:

  • 这是否意味着如果我推送我的生产环境配置应该有一个带有postgres 的主机,而不是本地主机?我发现它有所不同,因为我记得去年我玩 docker 时我没有使用 postgres 作为 ruby​​ on rails 应用程序的主机
  • 这取决于您在生产环境中使用什么。如果您使用 Compose 运行生产,那么两个环境的开发配置是相同的。如果没有,您将不得不在部署时进行调整。
  • 我还没有用于生产,但我会的。我将使用 docker-compose 运行它。谢谢
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多