docker中localhost和postgres之间的区别

我正在开发一个Django的应用程序,并试图在Docker中运行它。 我有一个我目前无法理解的问题。 当使用docker-compose运行应用程序时,当我使用这些configuration时,似乎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实际上将所有链接的容器的主机名添加到对方。

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

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

如果你愿意,你可以在主机文件中创build一个条目来将postgresredirect到localhost ,那么你只需要在任何地方使用postgres

每个docker容器默认都有它自己的networking命名空间。 该名称空间包括它自己的专用回​​送接口,即本地主机。 而且他们也连接到docker内部的networking,他们有自己的内部DNS条目,可以和同一个networking上的其他容器通信。

在具有桥接networking的容器内运行应用程序时,localhost将指向容器,而不是您正在运行的泊坞窗主机。 要使用的主机名取决于您的scheme:

  • 要与其他容器交谈,请在DNS中使用容器名称。
  • 如果它是由docker-compose启动的,则使用服务名称使用DNS轮循机制与该服务中的某个容器进行通信。
  • 如果它是在群集模式下启动的,那么可以使用那里的服务名称转到一个VIP,将负载均衡循环到提供该服务的所有容器。
  • 如果您需要与Docker主机进行通信,请使用Docker主机的非回送IP地址。