docker中主机的localhost和postgres的区别[英] difference between localhost and postgres for host in docker

本文是小编为大家收集整理的关于docker中主机的localhost和postgres的区别的处理方法,想解了docker中主机的localhost和postgres的区别的问题怎么解决?docker中主机的localhost和postgres的区别问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在开发一个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',
    }

postgres和localhost之间有什么区别.一个是在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实际上添加了您所有链接彼此容器.

在您的机器上,Postgres数据库实际上在Localhost中运行,这就是为什么您拥有localhost主机名.

在compose中,它在Postgres容器中运行,带有主机名postgres,这就是为什么您拥有postgres主机名.

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

其他推荐答案

每个Docker容器默认情况下随身带有其自己的网络名称空间.该名称空间包括其自己的私人回环接口,又名Localhost.它们还附在Docker内部的网络上,在那里他们有自己的内部DNS条目,并且可以在同一网络上与其他容器进行交谈.

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

  • 要与其他容器交谈,请使用DNS中的容器名称.
  • 如果它是由Docker-Compose启动的,请使用服务名称使用DNS Round Robin与该服务中的一个容器进行交谈.
  • 如果它是在Swarm模式内开始的,您可以使用该服务名称到达VIP,将Robin负载余额到提供该服务的所有容器.
  • 如果您需要与Docker主机进行交谈,请使用Docker主机的非环回IP地址.

本文地址:https://www.itbaoku.cn/post/1764060.html