我正在开发一个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
答案 0 :(得分:2)
Docker Compose实际上将所有linked个容器的主机名相互添加。
在你的机器上,postgres数据库实际上是在localhost中运行的,这就是你拥有localhost
主机名的原因。
在撰写时,它在postgres容器中运行,主机名为postgres
,这就是您拥有postgres
主机名的原因。
如果需要,您可以在主机文件中创建一个条目,将postgres
重定向到localhost
,然后您就必须在任何地方使用postgres
。
答案 1 :(得分:2)
默认情况下,每个docker容器都附带自己的网络命名空间。该命名空间包括它自己的私有环回接口,也就是localhost。它们还连接到docker内部的网络,在这些网络中,它们拥有自己的内部DNS条目,并且可以与同一网络上的其他容器进行通信。
当您在具有桥接网络的容器内运行应用程序时,localhost将指向容器,而不是您正在运行的docker主机。要使用的主机名取决于您的方案: